裝置採用晶片:STM32F407ZET6
4個LED燈,網路標號分別為LED0 ,LED1,FSMC D10,FSMC D11。對應的引腳號分別為PF9,PF10,PE12,PE13。
GPIO外設基本概念
General-Purpose Input Output,通用型輸入輸出的,也簡稱I/O口,有時也簡寫為IO口。用於電訊號的傳遞,以實現與外部器件的通訊、控制外部器件或者採集外部器件資料的功能。(在本次所用晶片中,共有114個GPIO引腳。)
對於MCU裝置和感測器之間,一般採用TTL電平訊號,即傳輸的電平訊號>2.4V就表示高電平,<0.4V就表示低電平。(另外還有RS232和RS485標準)
一般IO口的命名是由P(Pin)開頭,分為很多組(埠),以字母AH來命名,每個組(埠)有16個引腳,引腳的編號為015,所以如埠A引腳範圍: PA0 ~ PA15 埠B引腳範圍:PB0~PB15。
第一步 . 查詢相應部分的原理圖
第二步 .分析原理圖
如上圖所示,該處發光二極體為單向導電性,輸出電平訊號0才能使電路走通。如果輸出電平訊號1,則二極體兩端電壓平衡,無法形成電流。
發光二極體需要單獨深入學習。
第三步 . 程式設計
1. 亮燈程式碼例項部分展示:
//1.定義變數
GPIO_InitTypeDef GPIO_InitStructureF;//F埠
GPIO_InitTypeDef GPIO_InitStructureE;//E埠
int main()//中文註釋
{
//2.時鐘控制
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//3.設定結構體變數 F埠
GPIO_InitStructureF.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_10;
GPIO_InitStructureF.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructureF.GPIO_OType = GPIO_OType_PP;//推輓模式PP(都可以輸出),開漏輸出OD(只能輸出低電平)
GPIO_InitStructureF.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructureF.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOF, &GPIO_InitStructureF);
//3.設定結構體變數 E埠
GPIO_InitStructureE.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14;
GPIO_InitStructureE.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructureE.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureE.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructureE.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &GPIO_InitStructureE);
while (1)
{
//亮燈
GPIOF->BSRRL =GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_13| GPIO_Pin_14;
GPIOE->BSRRL = GPIO_Pin_13| GPIO_Pin_14;
return 0;
}
2. 程式碼拆分:
定義外設的結構體變數
GPIO外設結構體原型及代表含義如下:
typedef struct
{
uint32_t GPIO_Pin;
//指定要配置的GPIO引腳。此引數可以是以下引數之一,設定與引腳號對應的編號
/*
#define GPIO_Pin_0 ((uint16_t)0x0001)
#define GPIO_Pin_1 ((uint16_t)0x0002)
...
#define GPIO_Pin_15 ((uint16_t)0x8000)
#define GPIO_Pin_All ((uint16_t)0xFFFF)
...
*/
GPIOMode_TypeDef GPIO_Mode;
// 指定選定引腳的操作模式,設定為以下引數之一
/*
GPIO_Mode_IN = 0x00, //輸入模式,用得較多
GPIO_Mode_OUT = 0x01, //輸出模式,用的最多
GPIO_Mode_AF = 0x02, //複用模式,偶爾用
GPIO_Mode_AN = 0x03 //模擬模式
*/
GPIOSpeed_TypeDef GPIO_Speed;
// 指定選定引腳的速度,設定為以下引數之一,輸出速度指的是引腳電平的翻轉速度,如果選擇高速,則會增加功耗和噪聲。
/*
GPIO_Low_Speed = 0x00, //2MHz
GPIO_Medium_Speed = 0x01, //25MHz
GPIO_Fast_Speed = 0x02, //50MHz
GPIO_High_Speed = 0x03 //100MHz
*/
GPIOOType_TypeDef GPIO_OType;
//指定選定引腳的操作輸出型別,設定為以下引數之一
/*
GPIO_OType_PP = 0x00, //推輓輸出,可以輸出高和低電平
GPIO_OType_OD = 0x01 //開漏輸出,只能輸出低電平,不能輸出高電平
*/
GPIOPuPd_TypeDef GPIO_PuPd;
//指定選定接點的操作上拉/下拉,即GPIO引腳的內部電阻,設定為以下引數之一
/*
GPIO_PuPd_NOPULL = 0x00,
GPIO_PuPd_UP = 0x01,//上拉電阻,當外部沒有電平輸入或輸出時,可以給GPIO引腳一個預設的高電平狀態
GPIO_PuPd_DOWN = 0x02//下拉電阻,當外部沒有電平輸入或輸出時,可以給GPIO引腳一個預設的低電平狀態
*/
}GPIO_InitTypeDef;
時鐘控制
開啟GPIO的外設時鐘
//函式原型
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
//用法示例
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
因為STM32屬於低功耗的MCU,而為了降低功耗,所以STM32的MCU在復位之後預設會關閉絕大多數的外設的時鐘,所以使用者想要使用MCU內部的某個外設,就必須開啟該外設的時鐘(clock)。
對GPIO外設的初始化結構體中成員進行賦值
根據GPIO外設結構體原型,對每一個結構體成員進行賦值,解釋如下:
GPIO_InitStructureE.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14;//對13和14引腳進行操作
GPIO_InitStructureE.GPIO_Mode = GPIO_Mode_OUT;//輸出模式
GPIO_InitStructureE.GPIO_OType = GPIO_OType_PP;//推輓輸出
GPIO_InitStructureE.GPIO_Speed = GPIO_Speed_100MHz;//設定速率,預設選最高
GPIO_InitStructureE.GPIO_PuPd = GPIO_PuPd_NOPULL;
透過init函式對把GPIO結構體中的值寫入到GPIO埠暫存器,完成初始化
//函式原型
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//用法示例
GPIO_Init(GPIOE, &GPIO_InitStructure);