設備採用晶元:STM32F407ZET6 4個LED燈,網路標號分別為LED0 ,LED1,FSMC D10,FSMC D11。對應的引腳號分別為PF9,PF10,PE12,PE13。 GPIO外設基本概念 General-Purpose Input Output,通用型輸入輸出的,也簡稱I/O口, ...
設備採用晶元: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);