GPIO 和 LED 闪烁的仪式感

本小节教你使用 STM32CubeMX 软件配置 MiaowLabs-STM32F1-Micro 控制板的底层驱动,并使用 MDK-ARM 5.17 编写代码点亮板子上的的蓝色 LED。

在上一小节中,我只是教你使用 STM32CubeMX 软件生成工程,但没有进行任何实际应用操作。在这一小节,我将教你在生成工程的基础上,继续配置 GPIO 引脚点亮 LED 灯,然后编写代码使其闪烁起来。

跟学习编程语言时编写 Hello World 程序一样,在学习单片机时编写点灯程序也是一个充满仪式感的学习过程。点灯程序编写成功,意味着 MCU 初始化、语言环境、编译连接烧写复位、硬件供电都基本正确了,其他的操作就都有了基础。

预先了解

MiaowLabs-STM32F1-Micro 控制板上面有一颗用户灯(蓝色 LED) 是跟 STM32 的 PB12 引脚相连。我们可以通过编程控制该 LED 的亮灭状态,当 PB12 引脚为低电平时,LED 为亮状态;当 PB12 引脚为高电平时,LED 为灭状态。

LED 原理图
Image 5.6.1 - LED 原理图

具体步骤

进入我们上一小节创建的 MiaowLabs-Demo 文件夹,找到 MiaowLabs-Demo.ioc 工程文件,双击,打开工程。在 Pinout&Configuration 界面中的芯片中点击 PB12,并将其配置为 GPIO_Output。

在左侧的 System Core 下拉菜单中选择 SYS,然后在 SYS Mode and Configuration 中把 Debug 设置成 JTAG(4 pins),即是把系统配置和模式设置为 JTAG 接口,方便我们后面使用 SWD 调试工具。

在左侧的 System Core 下拉菜单中选择 RCC,然后在 RCC Mode and Configuration 中把 High Speed Clock (HSE) 和 Low Speed Clock (LSE) 设置为 Crystal/ceramic Resonator,即是把高速、低速时钟源都设置成外部晶振。

在左侧的 System Core 下拉菜单中选择 GPIO,然后在 GPIO Mode and Configuration 中对 PB12 引脚进行配置,GPIO output level 代表 GPIO 默认输出电平,在这里设置为低电平;GPIO mode 代表 GPIO 引脚模式,在这里设置为推挽输出;GPIO Pull-up/Pull-down 即 GPIO 上拉或下拉,在这里设置为既不上拉也不下拉;Maximum output speed 即 最大输出速度,在这里设置为高速;User Label 即用户标签,因为 PB12 在这里的功能是用作控制 LED,所以输入 LED 作为标签。

点击 Clock Configuration,配置时钟,在 HCLK(MHz) 中输入 72,然后按一下键盘的 Ener 回车键。这样,就可以自动把时钟配置到 72 MHz。

点击 GENERATE CODE,重新生成代码。

使用 MDK-ARM 打开工程代码,重新编译代码,编译完成后,提示没有错误。

然后可以在 MiaowLabs-Demo、MDK-ARM\MiaowLabs-Demo 文件夹中找到 MiaowLabs-Demo.hex 文件,将其烧录进核心板,可以发现核心板上的用户灯(蓝色 LED)已经亮起来了啦。

但是,这离我们的小目标——让 LED 闪烁起来还有一点小差距,不过已经很接近了。

我们回到 MDK-ARM 工程代码中,在左侧 Project 栏目的 Application/User 文件夹中找到 main.c 文件,双击,打开。接着,找到 int main(void) 主函数,在主循环 while(1) 中加入以下代码:

    HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//翻转LED引脚(PB12)的电平
    HAL_Delay(500);//等待500ms,即0.5s
    HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//翻转LED引脚(PB12)的电平
    HAL_Delay(500);//等待500ms,即0.5s

这段代码的意思,就是在主循环中,先翻转一次 PB12 引脚电平,然后保持 0.5s,再翻转一次 PB12 引脚电平,保持 0.5s,并且不断重复以上步骤,显示出来的效果就是 LED 一秒钟闪烁一次。

我们在加入代码的时候,注意一定要把代码加在 UER CODE BEGIN xx 和 USER CODE END xx 之间,因为这是 STM32CubeMX 预留给用户添加代码的地方。不然,在下次我们点击 GERATER CODE 重新生成代码后,STM32CubeMX 会抹去我们添加的代码。

到这里,我们就实现了控制 LED 闪烁的目标。