GPIO 和 LED 闪烁的仪式感
本小节教你使用 STM32CubeMX 软件配置 MiaowLabs-STM32F1-Tiny 控制板的底层驱动,并使用 MDK-ARM 5.17 编写代码,点亮板子上的的蓝色 LED。
在上一小节中,我只是教你使用 STM32CubeMX 软件生成工程,但没有进行任何实际应用操作。在这一小节,我将教你在生成工程的基础上,继续配置 GPIO 引脚点亮 LED 灯,然后编写代码使其闪烁起来。
跟学习编程语言时编写 Hello World 程序一样,在学习单片机时编写点灯程序也是一个充满仪式感的学习过程。点灯程序编写成功,意味着 MCU 初始化、语言环境、编译连接烧写复位、硬件供电都基本正确了,其他的操作就都有了基础。
了解硬件
MiaowLabs-STM32F1-Tiny 控制板上面有一颗蓝色 LED 是跟 STM32 的 PB12 引脚相连,我们可以通过编程控制该 LED 的亮灭状态,当 PB12 引脚为低电平时,LED 亮起来;当 PB12 引脚为高电平时,LED 则不亮。
具体步骤
进入我们上一小节创建的 MiaowLabs-Demo 文件夹,找到 MiaowLabs-Demo.ioc 工程文件,双击,打开工程。
在左侧的 System Core 下拉菜单中选择 RCC,然后在 High Speed Clock(HSE) 和 Low Speed Clock(LSE) 选择 Crystal/Ceramic Resonator,即晶体/陶瓷振荡器。MiaowLabs-STM32F1-Tiny 在板子背面板载一颗 8M 的无源晶振提供系统时钟,和一颗 32.768k 的无源晶振提供实时时钟。选择之后,左侧 RCC 下拉菜单会多出一个黄色叹号提示,忽略之。
在左侧的 System Core 下拉菜单中选择 SYS,然后在 SYS Mode and Configuration 中把 Debug 设置成 Serial Wire,即是把系统配置和模式设置为 SWD 接口,方便我们后面使用 SWD 调试工具。
在 Pinout&Configuration 界面中的芯片中点击 PB12,并将其配置为 GPIO_Output。
在左侧的 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。值得注意的是,如果前面没有在 RCC 中把 HSE 选择 Crystal/Ceramic Resonator,输入 72 再按回车键,会提示最大值只能设为 36,这是因为使用内部时钟时,主频最大只能设为 36M。
点击 GENERATE CODE,重新生成代码。
使用 MDK-ARM 打开工程代码,设置生成 HEX 文件。
重新编译代码,编译完成后,提示没有错误。
然后可以在 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 的闪烁。