Chapter 11 使用固件库点亮 LED
编程要点:
- 全能 GPIO 端口时钟
- 初始化 GPIO 目标引脚为推挽输出模式
- 编写简单测试程序:控制 GPIO 引脚输出高、低电平
代码:
1、LED 引脚宏定义
| #define LED_G_GPIO_PORT GPIOA #define LED_G_GPIO_CLK RCC_APB2Periph_GPIOA #define LED_G_GPIO_PIN GPIO_Pin_5
|
2、控制 LED 亮灭状态的宏定义
| #define digitalHi(p, i) (p->BSRR = i) #define digitalLo(p, i) (p->BRR = i) #define digitalToggle(p, i) (p->ODR ^= i)
#define LED_G_ON digitalHi(LED_G_GPIO_PORT, LED_G_GPIO_PIN) #define LED_G_OFF digitalLo(LED_G_GPIO_PORT, LED_G_GPIO_PIN) #define LED_G_TOGGLE digitalToggle(LED_G_GPIO_PORT, LED_G_GPIO_PIN)
|
3、LED GPIO 初始化函数
- 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,用于存储 GPIO 配置
- 调用库函数 RCC_APB2PeriphClockCmd 来使能 LED 的 GPIO 端口时钟:
RCC_APB2Periph_GPIOA
- 向 GPIO 初始化结构体成员赋值
- 输入上面的结构体地址,调用 GPIO_Init 完成 GPIO 初始化
- 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它 LED 使用的 GPIO 引脚
- 控制所有 LED 灯默认关闭。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK|\ LED_R_GPIO_CLK|\ LED_B_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_G_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LED_R_GPIO_PIN; GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LED_B_GPIO_PIN; GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStructure); GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN); GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN); }
|
4、main 函数
| int main(void) { LED_GPIO_Config(); while(1) { LED_G_ON; SOFT_DELAY; LED_G_OFF; SOFT_DELAY; } }
|
下载验证
STM32 标准库补充知识
1、SystemInit 函数在哪里
在标准库的 system_stm32f10x.c 文件中定义了
SystemInit 函数把 STM32 芯片的系统时钟设置成了 72MHz,即,
- AHB 时钟频率为 72MHz
- APB2 时钟频率为 72MHz
- APB1 时钟频率为 36MHz
2、断言
使能断言,定义 USE_FULL_ASSERT 宏。
库文件只写了函数声明,函数定义要我们自己写:
| void assert_failed(uint8_t* file, uint32_t line) { printf("r\n\ 输入的参数错误,错误文件名=%s, 等号=%s", file, line); }
|
3、Doxygen 注释规范
4、防止头文件重复包含
| #ifndef __BSP_LED_H #define __BSP_LED_H
#endif
|