文章内容
:
1、安装STM32CubeMX
,配合 Keil5,使用HAL库
方式 C语言编译,使用 STM32F103C8T6 板。完成:3只 LED 流水灯,即用3个GPIO
端口完成 3只 LED 红绿灯的周期闪烁。
2、使用 Keil5 的软件仿真逻辑分析仪功能观察3个 GPIO 端口的输出的时序波形。
目录
1 准备环境
1.1 安装 JDK
STM32CubeMX 是 Java 实现的,所以需要安装 JDK 环境。
-
jdk11-Windows 版本官网下载链接:
https://www.oracle.com/java/technologies/downloads/#java11-windows -
具体安装及环境配置读者可以参考这篇博客:
JDK 安装与环境变量配置(Win10详细版)
其中的安装配置步骤都很详细,还有各种错误解决办法。
1.2 安装 STM32CubeMX
STM32CubeMX 用于配置芯片并生成代码。
-
STM32CubeMX 官网下载地址:
https://www.st.com/en/development-tools/stm32cubemx.html
官网下载需要注册 ST 账号。 -
安装过程比较简单,可以根据提示更改目录完成安装
2 通过 STM32CubeMX 生成代码
-
安装完成之后,进如STM32CubeMX界面,点击
Help->Mange embedded software packages
下载固件库
-
选择使用的芯片类型,这里选择
STM32F1
,选中其中最新版的安装包,再点击 Install Now,等待下载即可
-
下载成功之后,回到 Home 界面,开始建立工程。
点击File->New Pioject
,创建新工程。
-
此时会出现一个新界面,在 Part Number 里选择
STM32F103C8
芯片,之后右边会出现芯片信息,选中之后,点击 Start Project 进入工程即可
-
进入界面后,在 Pinout &Configuration 栏里,配置系统调试接口
SYS
,选择 Serial Wire
-
配置外设,
RCC
设置,选择 HSE (外部高速时钟)为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
-
配置时钟,在 Cook Configuration 栏里,按照下面方式将 STM32 最高时钟调为72M(RCC选择外部高速时钟)。
-
在习惯上会配置一下 USART1,用于串口调试,USART1 一般系统板上都会与 usb 接口连接在一起,可以通过数据线,与上位机通讯。当然,这里实现流水灯可以不需要这个功能。
具体的 USART1串口通信介绍,可以参考我的下一篇文章:STM32的USART串口通讯—汇编输出hello windows!
在 Connectify 中,选择 USART1,模式选择 Asynchronous(异步),即可完成配置,下方可以修改波动率之类的设置,这里默认即可。
-
配置 GPIO
点击右侧芯片上所需要的引脚,点击管脚 PA5,在菜单中选择 GPIO_Output,依次配置其他引脚,这里选择管脚PA5 、PB0 、PC14。可以在左侧的 GPIO 中看到每个管脚的位置,输出模式改为高电平,其他不需要做改动。 -
工程设置,在 Project Manager 界面中选择 Project ,按要求填入相关信息,建议地址不要有中文字符和空格。
这里选择 Keil5 编译器生成代码。 -
在 Code Gendertor 中选中 Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral ,这样会单独生成刚刚配置的 gpio.c 和 usart.c 以及对应的头文件,如果有其他外设的配置也会单独显示出来,方便我们查看。
-
最后点击 GENERATE CODE ,生成对应的工程文件,并点击 Open Project 自动通过 Keil5 自动打开工程。
3 通过 Keil5 生成 hex 文件
3.1 添加代码
简单修改代码,在 main.c 文件里的 while(1) 循环内添加这些代码,如下所示:
while(1)
{
/* USER CODE END WHILE */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(100) ;//100ms
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(100) ;//100ms
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_Delay(100) ;//100ms
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
HAL_Delay(100) ;//100ms
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_Delay(100) ;//100ms
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);
HAL_Delay(100) ;//100ms
/* USER CODE END WHILE */
}
代码解释
:
- 延时函数:HAL_Delay(100) ;//100ms
函数原型: void HAL_Delay (__IO uint32_t Delay)
参数说明:Delay表示所要延时的时间大小,单位是毫秒。- 写管脚函数:HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
函数原型: void HAL_GPIO_WritePin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin,GPIO_PinState PinState)
参数说明:GPIOx: 管脚组(x的取值为A~G);
GPIO_Pin: 管脚编号(x的取值为0~15);
PIN_State: 管脚的状态(取值为GPIO_BIT_RESET表示0,GPIO_BIT_SET表示1)(取0时,输出低电平,低电平LED亮;反之,则灭)
3.2 编译
点击编译,生成 hex 文件。
注意
:编译前要在魔法棒里提前设置生成 hex 文件。
4 运行效果
4.1 烧录
-
使用 mcuisp 软件打开 hex 文件,将板子的 boot0 置1,boot1 置0,烧写进 STM32F103C8T6 板子中。
电路连接及 mcuisp 软件的使用可以参考我的另一篇文章:STM寄存器点亮流水灯中的3.2和3.3部分。
-
烧录成功后,切记要将串口断电(直接拔掉),将板子的 boot0 置0,再插电,便可正常运行。
4.2 运行效果
5 Keil5 仿真观察管脚时序波形
在没有示波器条件下,可以使用 Keil 的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。
现在我们用此功能观察上面工程中3个 GPIO 端口的输出波形。
5.1 调试前配置
- 首先,点击
魔法棒
,设置 Options for target
将 Target 界面的 Xtal 改为72MHz,因为我们之前在 STM32CubeMX 里将外部晶振改为了72MHz,所以这里最好也改为72。
- 设置 Debug
安装图中的顺序进行修改,4 和 6 应该与自己选择的芯片一致,最后点击 OK 即可。
5.2 调试并观测波形
- 进入调试界面
点击 Debug,进入调试。
- 选择逻辑分析仪
- 打开 Symbols Window 窗口
点击 View 菜单,选择需要观测的端口"Symbols Window" 选项,在弹出的窗口里 “Special Function Register” 里看到有查看波形的引脚。
- 选择需要观测的波形引脚
我们这里选择将GPIOA_IDR
、GPIOB_IDR
、GPIOC_IDR
拖入到逻辑分析仪里。
- 点击 “Setup”
将3个管脚的 Display Type 改为 Bit 显示,并可以为其配置颜色,最后点击 Close。
- 点击左上角的 Run 进行全速运行
此时可以看到3个 GPIO 端口的输出电平。
5.3 分析波形
观察发现,3个 GPIO 端口输出的电位变化与之前代码执行的实际效果一致;从下面的波形可以看出,LED 的闪烁周期实际约为600多ms(存在有误差)。经历一次周期,实际3个 LED 灯会依次进行一次亮灭、亮灭、亮灭,共600ms。所以仿真波形的周期与实际效果的闪烁周期其实还是有差距。
6 总结
通过 STM32CubeMX 点灯还是比较简单的,最起码不用自己写代码,小白上手较快。注意烧录时对板子的连接和配置,出现烧不进去的问题,不要心急,可以重新试几次,看看是接触不良的原因还是配置顺序,亦或是其他问题。文章有何问题,敬请斧正。
7 参考资料
1、使用STM32CubeMX之入门流水灯
2、STM32实现LED闪烁——基于HAL库
3、百度网盘链接:Keil 5仿真逻辑分析资料提取码:luha