Chapter 11 使用固件库点亮 LED

Chapter 11 使用固件库点亮 LED

编程要点:

  • 全能 GPIO 端口时钟
  • 初始化 GPIO 目标引脚为推挽输出模式
  • 编写简单测试程序:控制 GPIO 引脚输出高、低电平

代码:

1、LED 引脚宏定义

1
2
3
4
// LED_G: PA5
#define LED_G_GPIO_PORT GPIOA
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOA
#define LED_G_GPIO_PIN GPIO_Pin_5

2、控制 LED 亮灭状态的宏定义

1
2
3
4
5
6
7
8
9
/* Directly manipulate regsisters to control I/O */
#define digitalHi(p, i) (p->BSRR = i) // Output High
#define digitalLo(p, i) (p->BRR = i)
#define digitalToggle(p, i) (p->ODR ^= i)

/* Definition macros of Controlling I/Os */
#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;

/* Turn on Port clock of LEDs */
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK|\
LED_R_GPIO_CLK|\
LED_B_GPIO_CLK, ENABLE);
/* Initial LED_G Pin */
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);

/* Initial LED_R Pin */
GPIO_InitStructure.GPIO_Pin = LED_R_GPIO_PIN;
GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStructure);

/* Initial LED_B Pin */
GPIO_InitStructure.GPIO_Pin = LED_B_GPIO_PIN;
GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStructure);

/* Turn off all LEDs */
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 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(void)
{
// System clock has been set to 72MHz

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 宏。
库文件只写了函数声明,函数定义要我们自己写:

1
2
3
4
void assert_failed(uint8_t* file, uint32_t line)
{
printf("r\n\ 输入的参数错误,错误文件名=%s, 等号=%s", file, line);
}

3、Doxygen 注释规范

1
2
3
4
5
/**
* @brief Simple delay
* @param __IO uint32_t nCount
* @retval none
*/

4、防止头文件重复包含

1
2
3
4
5
6
#ifndef	__BSP_LED_H
#define __BSP_LED_H

/* Some codes here... */

#endif // *<! End of __BSP_LED_H

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!