編程要點
1. 使能 GPIO 端口時鍾;
2. 初始化 GPIO 目標引腳為推挽輸出模式;
3. 編寫簡單測試程序,控制 GPIO 引腳輸出高、低電平。
LED的電路圖
過程:
1.拷貝一個庫函數編程模板,重新命名。
2.user新建led文件夾,目錄下新建bsp_led.h bsp_led.c
3.keil打開項目,user添加bsp_led.c,點擊魔術棒,c/c++選項卡的include path添加led文件夾。
4. 下面我將給出各個文件的內容:
main.c文件中
#include "stm32f10x.h" // 相當於51單片機中的 #include <reg51.h> #include "bsp_led.h" //調用自己寫的功能函數的頭文件即可。 void Delay( uint32_t count){ for( ;count!=0;count--); } int main(void) { // 來到這里的時候,系統的時鍾已經被配置成72M。 LED_GPIO_Config(); while(1){
/* LED長亮 */
//GPIO_SetBits(LED_GPIO_PORT, GPIO_Pin_2);
/* 下面為閃爍點亮LED */ GPIO_SetBits(LED_GPIO_PORT, GPIO_Pin_2); Delay(0xfffff); GPIO_ResetBits(LED_GPIO_PORT, GPIO_Pin_2); Delay(0xfffff); } }
bsp_led.c中
/* 在bsp_led.c中只需要引入它自己的頭文件即可,因為在它頭文件中已經調用了 stm32f10x.h,所以這里可以不重復調用 */
#include "bsp_led.h" void LED_GPIO_Config(){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_GPIOC_CLOCK, ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=LED_GPIO_PIN; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct); }
bsp_led.h中
#ifndef BSP_LED_H_
#define BSP_LED_H_#include "stm32f10x.h"
#define LED_GPIO_PIN GPIO_Pin_2
#define LED_GPIO_PORT GPIOC
#define LED_GPIOC_CLOCK RCC_APB2Periph_GPIOCvoid LED_GPIO_Config(void);
#endif
關於LED點亮函數和延遲函數的宏定義寫法
延遲函數的宏定義
#define SOFT_DELAY Delay(0x0FFFFF);
/* 在main函數中調用 SOFT_DELAY即可;
點亮LED燈的函數
第一種:
/* 使用標准的固件庫控制 IO*/
#define ON 0
#define OFF 1
#define LED(a) if (a) \ GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);\ else \ GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN)
/* 在main中調用即可,例如 LED(ON); */
第二種
/* 直接操作寄存器的方法控制 IO */ #define digitalHi(p,i) {p->BSRR=i;} //輸出為高電平 #define digitalLo(p,i) {p->BRR=i;} //輸出低電平 #define digitalToggle(p,i) {p->ODR ^=i;} //輸出反轉狀態 /* 定義控制 IO 的宏 */ #define LED_TOGGLE digitalToggle(LED_GPIO_PORT,LED_GPIO_PIN) #define LED_OFF digitalHi(LED_GPIO_PORT,LED_GPIO_PIN) #define LED_ON digitalLo(LED_GPIO_PORT,LED_GPIO_PIN) /*在main中調用即可,例如 LED_ON;