目錄:
1.MM32F0140簡介
2.MM32F0140系統時鐘配置
3.MM32F0140的GPIO外設配置及其初始化
4.使用官網的Systick定時器做延時
5.MM32F0140 GPIO驅動LED燈
提要:
本例項學習MM32F0140的GPIO外設的配置,配置PA11、PB3、PB4、PB5為推輓輸出模式驅動LED1~LED4燈翻轉,每隔1s時間(使用官網的Systick延時)翻轉1次LED燈的狀態。
內容:
1、MM32F0140簡介:
(1)MM32F0140微控制器是基於Arm® Cortex®-M0核心,最高工作頻率可達72MHz;
(2)供電電壓支援:2.0V - 5.5V;
(3)多達64KB的Flash,8KB的SRAM;
(4)1個I2C;
(5)3個UART;
(6)1個12位共13通道的ADC;
(7)2個I2C或I2S;
(8)1個16位高階定時,1個16位和1個32位的通用定時器,3個16位的基本定時器;
(9)1個FlexCAN介面;
(10)1個IWDG和1個WWDG看門狗。
2.MM32F0140系統時鐘配置:
如下圖1所示,1.MM32F0140可以使用外部HSE 8M時鐘倍頻到72M作為系統時鐘,2.也可使用內部HSI 8M時鐘倍頻到72M作為系統時鐘,二者選擇其1,選擇開啟對應的時鐘巨集即可,本例項選擇2開啟HSI 8M倍頻到72M時鐘作為MM32F0140的系統時鐘。
圖1
3.MM32F0140的GPIO外設配置及其初始化:
MM32F0140每個外設都有其對應的時鐘,在使用外設前應先配置使能其外設時鐘,本例項使用GPIOA和GPIOB外設的PA11、PB3、PB4、PB5驅動LED燈每隔1s翻轉1次做LED燈的1s閃爍實驗
具體配置步驟,及其初始化如下:
(1)使能GPIOA和GPIOB的外設時鐘;
(2)配置IO的管腳;
(3)配置GPIO的輸出速度;
(4)配置IO管腳的工作模式;
(5)根據GPIOA、GPIOB配置的引數整體初始化GPIOA和GPIOB各管腳的成員引數。
使用巨集定義定義GPIOA的PA11,GPIOB的PB3、PB4、PB5驅動LED1~LED4程式碼如下,使用巨集定義方便程式碼維護,需要更換GPIO埠或管腳時只需在巨集定義中修改對應的埠GPIOx和GPIO_Pin_x即可;
#define LED1_PORT GPIOA #define LED1_PIN GPIO_Pin_11 #define LED2_PORT GPIOB #define LED2_PIN GPIO_Pin_3 #define LED3_PORT GPIOB #define LED3_PIN GPIO_Pin_4 #define LED4_PORT GPIOB #define LED4_PIN GPIO_Pin_5 #define LED1_ON() GPIO_ResetBits(LED1_PORT,LED1_PIN) #define LED1_OFF() GPIO_SetBits(LED1_PORT,LED1_PIN) #define LED1_TOGGLE() (GPIO_ReadOutputDataBit(LED1_PORT,LED1_PIN))?(GPIO_ResetBits(LED1_PORT,LED1_PIN)):(GPIO_SetBits(LED1_PORT,LED1_PIN)) #define LED2_ON() GPIO_ResetBits(LED2_PORT,LED2_PIN) #define LED2_OFF() GPIO_SetBits(LED2_PORT,LED2_PIN) #define LED2_TOGGLE() (GPIO_ReadOutputDataBit(LED2_PORT,LED2_PIN))?(GPIO_ResetBits(LED2_PORT,LED2_PIN)):(GPIO_SetBits(LED2_PORT,LED2_PIN)) #define LED3_ON() GPIO_ResetBits(LED3_PORT,LED3_PIN) #define LED3_OFF() GPIO_SetBits(LED3_PORT,LED3_PIN) #define LED3_TOGGLE() (GPIO_ReadOutputDataBit(LED3_PORT,LED3_PIN))?(GPIO_ResetBits(LED3_PORT,LED3_PIN)):(GPIO_SetBits(LED3_PORT,LED3_PIN)) #define LED4_ON() GPIO_ResetBits(LED4_PORT,LED4_PIN) #define LED4_OFF() GPIO_SetBits(LED4_PORT,LED4_PIN) #define LED4_TOGGLE() (GPIO_ReadOutputDataBit(LED4_PORT,LED4_PIN))?(GPIO_ResetBits(LED4_PORT,LED4_PIN)):(GPIO_SetBits(LED4_PORT,LED4_PIN))
MM32F0140 GPIOA和GPIOB的外設配置及其IO的初始化,即PA11、PB3、PB4、PB5驅動LED1~LED4的初始化配置步驟如下程式碼所示:
void Bsp_LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; //Enable GPIOA Clock RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); //Enable GPIOB Clock RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE); //Init struct member with its default value. GPIO_StructInit(&GPIO_InitStruct); //PA11:LED1 GPIO_InitStruct.GPIO_Pin = LED1_PIN; //GPIO Speed GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Push-pull output GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //Initializes the gpio peripheral according to the specified parameters in the init struct. GPIO_Init(LED1_PORT, &GPIO_InitStruct); //PB3:LED2,PB4:LED3,PB5:LED4 GPIO_InitStruct.GPIO_Pin = LED2_PIN | LED3_PIN | LED4_PIN; //GPIO Speed GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Push-pull output GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //Initializes the gpio peripheral according to the specified parameters in the init struct. GPIO_Init(LED2_PORT, &GPIO_InitStruct); LED1_OFF(); LED2_OFF(); LED3_OFF(); LED4_OFF(); LED1_ON(); LED2_ON(); LED3_ON(); LED4_ON(); }
4.使用官網的Systick定時器做延時:
在main函式中呼叫Systick定時器初始化函式,作為LED1~LED4翻轉閃爍延時,只需呼叫DELAY_Init();即可。
5.MM32F0140 GPIO驅動LED燈:
如下程式碼所示,在main函式中呼叫Systick定時器初始化函式DELAY_Init和LED初始化函式Bsp_LED_Init,在while(1)主迴圈中呼叫之前巨集定義的LED1_TOGGLE ~ LED4_TOGGLE翻轉功能,
然後呼叫DELAY_Ms(1000);即1s延時函式,則實現PA11、PB3、PB4、PB5每隔1s驅動翻轉1次LED1~LED4燈的狀態,實現LED1~LED4燈的閃爍。
int main(void) { //Systick Init DELAY_Init(); //LED GPIO Init Bsp_LED_Init(); while(1) { //LED1~LED4 Toggle LED1_TOGGLE(); LED2_TOGGLE(); LED3_TOGGLE(); LED4_TOGGLE(); DELAY_Ms(1000); } }
總結:
本例項學習MM32F0140的GPIO外設的配置,配置PA11、PB3、PB4、PB5為推輓輸出模式驅動LED1~LED4燈翻轉,每隔1s時間(使用官網的Systick延時)翻轉1次LED燈的狀態。
注意事項:
(1)配置系統時鐘為HSI 8M倍頻到72M或使用HSE 8M倍頻到72M時鐘(開啟對應的時鐘巨集即可,其它時脈頻率也可新增自定義時鐘巨集)
(2)使用外設時比如GPIOA和GPIOB外設,需使能GPIOA和GPIOB的外設時鐘。