新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 開發(fā)板入門教程 (一) GPIO

STM32 開發(fā)板入門教程 (一) GPIO

作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
這個(gè)章節(jié)我們將學(xué)習(xí)最基本的 STM32GPIO 的應(yīng)用. 我們將分為兩個(gè)章節(jié)來學(xué)習(xí).

第一部份: GPIO 的基本應(yīng)用和 IO 口的配置
第二部份: 外部中斷的使用

--------------------------------------------------------------------------

1: 設(shè)計(jì)要求:
開發(fā)板上有 2 個(gè) LED,我們的目的為有規(guī)律的點(diǎn)亮 LED1 和 LED2. 當(dāng)按鍵按下去的時(shí)候所有的燈滅, 等待 2 秒鐘后恢復(fù)有規(guī)律的點(diǎn)亮.

2: 硬件電路:



3: 軟件程序設(shè)計(jì):
(1) 根據(jù)要求配置 GPIOA 中的 PA0,PA1 為輸出, PA3, PA8 為輸入
對(duì)于下面程序中的GPIO_InitStructure.GPIO_Speed 和 GPIO_InitStructure.GPIO_Mode 推薦大家看下面兩篇文章.

STM32 GPIO的十大優(yōu)越功能綜述
備注: 當(dāng)STM32的GPIO端口設(shè)置為輸出模式時(shí),有三種速度可以選擇:2MHz、10MHz和50MHz,這個(gè)速度是指I/O口驅(qū)動(dòng)電路的速度,是用來選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。

STM32 GPIO端口的輸出速度設(shè)置
備注: 共有8種模式,可以通過編程選擇:
1. 浮空輸入
2. 帶上拉輸入
3. 帶下拉輸入
4. 模擬輸入
5. 開漏輸出——(此模式可實(shí)現(xiàn)hotpower說的真雙向IO)
6. 推挽輸出
7. 復(fù)用功能的推挽輸出
8. 復(fù)用功能的開漏輸出
模式7和模式8需根據(jù)具體的復(fù)用功能決定。


void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, GPIO_InitStructure);
}

(2) 打開 GPIOA 的時(shí)鐘, 因?yàn)?STM32 是一個(gè)低功耗的 MCU , 每一個(gè)你使用的外圍設(shè)備都需要單獨(dú)開啟時(shí)鐘, 如果不開啟將不能使用, 這個(gè)也是對(duì)于 STM32 初學(xué)者容易疏忽的地方


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO, ENABLE);

STM32共有5種時(shí)鐘源,其中三種不同的時(shí)鐘源可用作為驅(qū)動(dòng)系統(tǒng)時(shí)鐘(SYSCLK);
1、HSI 由內(nèi)部8MHz RC振蕩器產(chǎn)生,它是可以直接用來作為系統(tǒng)時(shí)鐘或經(jīng)2分頻后作為PLLSRC輸入。
HIS時(shí)鐘頻率在出廠時(shí)被校準(zhǔn)在1%(25°C),在系統(tǒng)復(fù)位時(shí),工廠校準(zhǔn)值會(huì)被裝載到時(shí)鐘控制寄存器的HISCAL[7..0] 位。
用戶可以通過更改HISCAL[4..0]來調(diào)整HSI頻率。
另外時(shí)鐘寄存器中有一個(gè)HSIRDY位用來指示HSI RC是不穩(wěn)定工作,在時(shí)鐘啟過后,直到這個(gè)標(biāo)志位置被硬件置1后,HSI RC時(shí)鐘才被輸出。
HSI RC時(shí)鐘還可以用時(shí)鐘寄存器中的HSION位來啟動(dòng)和關(guān)閉。

HSI時(shí)鐘同時(shí)也是HSE晶體蕩振器的備用時(shí)鐘源。

使用HSE時(shí)鐘,程序設(shè)置時(shí)鐘參數(shù)流程:
1、將RCC寄存器重新設(shè)置為默認(rèn)值RCC_DeInit;
2、打開外部高速時(shí)鐘晶振HSERCC_HSEConfig(RCC_HSE_ON);
3、等待外部高速時(shí)鐘晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、設(shè)置AHB時(shí)鐘RCC_HCLKConfig;
5、設(shè)置高速AHB時(shí)鐘RCC_PCLK2Config;
6、設(shè)置低速速AHB時(shí)鐘RCC_PCLK1Config;
7、設(shè)置PLLRCC_PLLConfig;
8、打開PLLRCC_PLLCmd(ENABLE);
9、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10、設(shè)置系統(tǒng)時(shí)鐘RCC_SYSCLKConfig;
11、判斷是否PLL是系統(tǒng)時(shí)鐘while(RCC_GetSYSCLKSource() != 0x08)
12、打開要使用的外設(shè)時(shí)鐘RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()


具體設(shè)置請(qǐng)參考下面的文章

STM32時(shí)鐘系統(tǒng)與軟件配置

STM32的時(shí)鐘系統(tǒng)分析

STM32 的時(shí)鐘與RTC


(3) 設(shè)置外部中斷, 所有的 GPIO 口都可以作為外部中斷源. 具體可以參考下面這篇文章.

STM32中外部中斷與外部事件


GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);

EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(EXTI_InitStructure);

同樣不要忘記打開時(shí)鐘, 我們?cè)诖蜷_ PA 口的時(shí)候已經(jīng)加上了 RCC_APB2Periph_AFIO, 這里再提醒大家一下.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO, ENABLE);

最后就是編寫外部中斷入口函數(shù).
void EXTI3_IRQHandler(void)
{
int i;

if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_SetBits(GPIOA,GPIO_Pin_1);

for(i=0;i<=8000000;i++);

GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);

for(i=0;i<=1000000;i++)



EXTI_ClearITPendingBit(EXTI_Line3);
}
}

不要忘記在中斷函數(shù)處理完成后清掉標(biāo)志位,不然會(huì)不停的進(jìn)入中斷.

(4) 編譯與調(diào)試
我們已經(jīng)完成所有程序編寫部份, 接下來就是將工程編譯成功后下載到我們的 Mini-STM32 開發(fā)板中進(jìn)行調(diào)試和仿真.
如果看到 LED 有規(guī)律的點(diǎn)亮和熄滅, 按下按鈕后 LED 先是一起熄滅, 在一起點(diǎn)亮, 然后恢復(fù)有規(guī)律的點(diǎn)亮這個(gè)過程, 說明我們已經(jīng)達(dá)到我們的設(shè)計(jì)目標(biāo).


評(píng)論


技術(shù)專區(qū)

關(guān)閉