STM32CubeMX 实现流水灯及 Keil 仿真逻辑分析

文章内容
1、安装 STM32CubeMX,配合 Keil5,使用 HAL库方式 C语言编译,使用 STM32F103C8T6 板。完成:3只 LED 流水灯,即用3个GPIO端口完成 3只 LED 红绿灯的周期闪烁。
2、使用 Keil5 的软件仿真逻辑分析仪功能观察3个 GPIO 端口的输出的时序波形。

1 准备环境

1.1 安装 JDK

STM32CubeMX 是 Java 实现的,所以需要安装 JDK 环境。

1.2 安装 STM32CubeMX

STM32CubeMX 用于配置芯片并生成代码。

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 */
}

在这里插入图片描述

代码解释

  1. 延时函数:HAL_Delay(100) ;//100ms
    函数原型: void HAL_Delay (__IO uint32_t Delay)
    参数说明:Delay表示所要延时的时间大小,单位是毫秒。
  2. 写管脚函数: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_IDRGPIOB_IDRGPIOC_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值