一、前言
前面我们学习了很多单片机的知识,接下来我们即将进入到ARM的世界~
本篇博文将从零开始实现一块基于STM32F103VBT6芯片的开发板上的LED灯的闪烁。
二、环境准备
MCUISP
如何使用它下载到STM32板上呢?
首先将开发板上的COM口接入PC,在软件中搜索串口
并且选择CH 340
串口,波特率选择115200
即可。
然后选择HEX文件并按照如下选项进行勾选
准备就绪后,点击开始编程按钮,在开发板上按顺序快速按下REST和ISP按键即可下载。
Keil uVision5
该程序安装完成后记得安装本开发板的支持包Keil.STM32F1xx_DFP.xxx
(双击即可安装)
J-Link
可在此处下载并安装最新的J-Link
STM32CubeMX
可在此处下载并安装最新的STM32CubeMX(需要注册并登录)
安装完成后首次打开该应用,首先打开Embedded Software Packages Manager
选择STM32F1并下载最新的软件包
三、使用STM32CubeMX生成模板代码
1. 创建工程
打开STM32CubeMX,选择ACCESS TO MCU SELECTOR
搜素STM32F103VBT6
,双击右侧对应的STM32F103VBT6
。
2. 分配LED灯相关引脚
从原理图可以看出,LED灯的A - E分别对应应引脚PE8 - PE15,而LED_SEL对应PB3。
因此我们将其设置为推挽,即Output Push Pull,当然还可以为其添加标签,更便于标识。
3. 模式配置
将这9个引脚设置完毕后,我们接下来设置其调试模式。
进入System Core - SYS,在Debug处选择Serial Wire,防止开发板被上锁导致只能下载一次的问题。
4. 时钟配置
这里我们使用时间中断来闪烁LED灯,因此我们需要配置时钟。
进入Clock Configuration,观察到默认频率为8MHz(实际上可以根据自己的需求进行调整,或使用外部时钟等等,这里我们使用系统内部的时钟即可)
返回Pinout & Configuration界面,进入Timers - TIM1
首先设置时钟源(Clock Source)为系统时钟(Internal Clock),然后在Parameter Settings中设置分频系数(Prescaler)、计数周期(Counter Period)以及自动重载(auto-reload preload)
假设分频系数(Prescaler)为A,计数周期(Counter Period)为B,时钟频率为C,则这里时间溢出公式为
我们将A设置为8000-1,B设置为1000-1,C为8Mhz,因此T = 1s,即我们的时间回调函数调用周期为1s。
接下来我们开启时间中断
5. 工程配置
在Project Manager中设置工程名称、路径、工具链。
在左侧选择Code Generator,勾选Generate peripheral initialization as a pair of '.c/.h' files per peripheral
,即针对每个外设生成独立的.c和.h文件。
6. 生成模板代码
配置完成后,点击右上角GENERATE CODE按钮即可生成模板代码。
在工程目录下,LED.ioc
即为STM32CubeMX的工程文件,而MDK-ARM
下的LED.uvprojx
即为Keil工程文件。
四、使用模板代码实现LED闪烁效果。
使用Keil或其它工具打开该工程,我们可以发现STM32CubeMX已为我们生成了规范的目录结构。
1. 开启LED灯。
在gpio.c
中我们可以找到IO口初始化的相关代码
1 | void MX_GPIO_Init(void) |
因此我们可以依葫芦画瓢在main.c
中为LED_SEL口使能,让其LED灯正常工作。
1 | int main(void) |
其中GPIO_PIN_SET
实为1,即高电平;同理GPIO_PIN_RESET
为0,即低电平。
2. 实现时间中断函数
在tim.c
中我们可以发现它有一个全局实例,时钟通过该实例进行区分。
欲开启该时钟,我们需要将其初始化。
1 | int main(void) |
然后编写时间中断函数即可。
1 | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) |
这里我选择将LED灯A每1s进行一次翻转,从而实现闪烁效果。
五、下载验证
代码编写好后,如果正确安装了J-Link驱动,将开发板上的SWD口接入PC,则可在设备管理器中找到如下条目
然后打开Keil,如下图配置J-Link调试。
进入J-Link设置,按如下配置端口和频率
然后编译
至此,我们将其下载到开发板上,按下REST键即可验证。
六、调试
设置断点后,即可进入调试模式。