【1】STM32:跑馬燈配置
阿新 • • 發佈:2020-10-09
一、庫函式版本
1.新建一個 led.h 檔案
#ifndef _LED_H #define _LED_H #include "sys.h" #define LED0 PBout(5) // DS0 #define LED1 PEout(5) // DS1 void LED_Init(void); // LED介面初始化 #endif
這段程式碼裡面最關鍵就是 2 個巨集定義,通過位帶操作 PB5 輸出高低電平從而控制 LED0 。
LED0=1; //通過位帶操作控制 LED0 的引腳 PB5 輸出高電平
LED0=0; //通過位帶操作控制 LED0 的引腳 PB5 輸出低電平
同樣也可以使用韌體庫操作和暫存器操作,來實現 IO 口操作。
GPIO_SetBits(GPIOB, GPIO_Pin_5); //設定 GPIOB.5 輸出 1,等同 LED0=1;
GPIO_ResetBits (GPIOB, GPIO_Pin_5); //設定 GPIOB.5 輸出 0,等同 LED0=0;
還可以通過直接操作暫存器,BRR 和 BSRR 的方式來操作 IO 口輸出高低電平。
GPIOB->BRR=GPIO_Pin_5; //設定 GPIOB.5 輸出 1,等同 LED0=1;
GPIOB->BSRR=GPIO_Pin_5; //設定 GPIOB.5 輸出 0,等同 LED0=0;
2.新建一個 led.c檔案
#include "led.h" void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOB、GPIOE埠時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); // 配置GPIOB.5 推輓輸出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_5); // 配置GPIOE.5 推輓輸出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_SetBits(GPIOE, GPIO_Pin_5); }
該函式的功能就是用來實現配置 PB5和 PE5 為推輓輸出。這裡需要注意的是:在配置 STM32 外設的時候,任何時候都要先使能該外設的時鐘。GPIO 是掛載在 APB2 總線上的外設,在韌體庫中對掛載在 APB2 總線上的外設時鐘使能是通過函式 RCC_APB2PeriphClockCmd()來實現的。
需要說明的是,因為 GPIOB 和 GPIOE 的 IO 口的初始化引數都是設定在結構體變數GPIO_InitStructure 中,因為兩個 IO 口的模式和速度都一樣,所以我們只用初始化一次,在GPIOE.5 的初始化的時候就不需再重複初始化速度和模式了。
3.編寫main.c檔案
1 #include "led.h" 2 #include "delay.h" 3 4 int main(void) 5 { 6 delay_init(); // 延時函式初始化 7 LED_Init(); // LED介面初始化 8 while(1) 9 { 10 LED0 = 1; 11 LED1 = 0; 12 delay_ms(1000); 13 LED0 = 0; 14 LED1 = 1; 15 delay_ms(1000); 16 } 17 }
在韌體庫 V3.5 中,系統在啟動的時候會呼叫 system_stm32f10x.c 中的函式 SystemInit()對系統時鐘進行初始化,在時鐘初始化完畢之後會呼叫 main()函式。 所以我們不需要再在 main()函式中呼叫 SystemInit()函式。