GPIO 即通用輸入輸出口。凡事都要熟悉,熟能生巧。一定要掌握MDK軟體的工程操作方法。 對於GPIO的操作。 Project裡面要有以下幾個文件夾(開發之前需要包含相應的庫文件,這裡預設已經包含) STEP BY STEP(以按鍵和LED燈為例): 1.在USER文件夾里新建對應功能的C文件和H文 ...
GPIO 即通用輸入輸出口。凡事都要熟悉,熟能生巧。一定要掌握MDK軟體的工程操作方法。
對於GPIO的操作。
Project裡面要有以下幾個文件夾(開發之前需要包含相應的庫文件,這裡預設已經包含)
STEP BY STEP(以按鍵和LED燈為例):
1.在USER文件夾里新建對應功能的C文件和H文件(這裡對應 Key.c Key.h LED.c LED.h)其中C文件用來進行對應外設的硬體配置,H文件是申明對應C文件裡面定義的配置函數。註意H文件開頭要檢查以下時候需要檢查以下重覆定義的情況, 如下:
#ifndef __EXTI_H
#define __EXTI_H
2.下麵重點總結下功能C文件裡面對應外設的硬體配置過程。
STEP1:建立數據結構,配置工作時鐘
STM32這種單片機和51單片機的很大不同就是,對應不同功能的硬體有相應的工作時鐘與其對應。這個時鐘是必不可少的,就像人的心臟一樣。
先建立數據結構GPIO_InitTypeDef GPIO_InitStructure;
然後配置時鐘,RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
可能每次你都不清楚,為什麼硬體配置要那麼來,從庫開發的角度來說,要學會去看庫的幫助文件,打開之後找到Data Structure這一塊,找到對應的GPIO的數據結構。
而庫開發不同關於寄存器開發的地方是,庫是間接的用數據結構去填充寄存器。所以首先得要有這個對應的數據結構,也就是這裡的 GPIO_InitStructure;
打開幫助中GPIO_InitTypeDef 這個結構體,裡面的變數結構就可以看出來,分別是:管腳(pin),速度(speed),工作模式(Mode)
00091 typedef struct 00092 { 00093 uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. 00094 This parameter can be any value of @ref GPIO_pins_define */ 00095 00096 GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. 00097 This parameter can be a value of @ref GPIOSpeed_TypeDef */ 00098 00099 GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. 00100 This parameter can be a value of @ref GPIOMode_TypeDef */ 00101 }GPIO_InitTypeDef;
然後依照每個變數的值的情況進行賦值如:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;其實在GPIO_InitStructure結構體中的變數都是枚舉型的,也就是說它的值都是一定的,是個常數。
void GPIO_Init | ( | GPIO_TypeDef * | GPIOx, |
GPIO_InitTypeDef * | GPIO_InitStruct | ||
) |
2.初始化寄存器(數據結構映射到寄存器中)
到這裡還沒有好,這一步僅僅是把你申明的一個結構體變數的每個部分確定了,還沒有映射到寄存器中去,那麼怎麼映射到寄存器中去呢?庫開發早就已經設計了一個映射的功能函數在幫助裡面可以看到,這個函數的用法如:GPIO_Init(GPIOC, &GPIO_InitStructure);
#include "bsp_led.h" /** * @brief 初始化控制LED的IO * @param 無 * @retval 無 */ void LED_GPIO_Config(void) { /*定義一個GPIO_InitTypeDef類型的結構體*/ GPIO_InitTypeDef GPIO_InitStructure; /*開啟LED的外設時鐘*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); /*選擇要控制的GPIOB引腳*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /*設置引腳模式為通用推輓輸出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*設置引腳速率為50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*調用庫函數,初始化GPIOB0*/ GPIO_Init(GPIOB, &GPIO_InitStructure); /*選擇要控制的引腳*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; /*調用庫函數,初始化GPIOC*/ GPIO_Init(GPIOC, &GPIO_InitStructure); /* 關閉所有led燈 */ GPIO_SetBits(GPIOB, GPIO_Pin_0); /* 關閉所有led燈 */ GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3); }View Code
LED頭文件內容 *********************************** #ifndef __LED_H #define __LED_H #include "stm32f10x.h" void LED_GPIO_Config(void); #endif /* __LED_H */View Code
結論:
GPIO的設置分為四步
1.申明結構體 GPIO_InitTypeDef GPIO_InitStructure;
2.設置時鐘 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
3.結構體賦值 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4.初始化寄存器 GPIO_Init(GPIOC, &GPIO_InitStructure);
設置多個GPIO的時候,如果Mode和Speed都是一樣的,就只可以設置一次就行。