一. 了解并掌握STM32中断原理,HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:
1、LED流水灯,用GPIO端口完成3只LED红绿灯的周期闪烁。
2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
二. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
文章目录
一、搭建STM32的开发环境
- 硬件:stm32f103c8t6 核心板
- 软件:JDK、STM32CubeMX 6.9.2
- 软件:keil5 MDK
STM32CubeMX 是一个图形化的工具,也是配置和初始化C代码生成器(STM32 configuration and initialization C code generation),也就是自动生成开发初期关于芯片相关的一些初始化代码。
它包含了 STM32 所有系列的芯片,包含示例和样本(Examples and demos)、中间组件(Middleware Components)、硬件抽象层HAL(Hardwaree abstraction layer)。
STM32CubeMX 是ST意法半导体的主动原创工具,它可以减轻开发的时间和费用。其集成了一个全面的软件平台,支持 STM32 每一个系列的MCU 开发。这个平台包括 STM32Cube HAL(一个 STM32 的抽象层集成软件,确保STM32 系列最大的移植性)。再加上兼容的一套中间件(RTOS、USB、TCP/IP 和图形),所有内嵌软件组件附带了全套例程。
STM32CubeMX的特性:
1.直观的选择 STM32 微控制器。
2.微控制器图形化配置:
① 自动处理引脚冲突
② 动态设置确定的时钟树
③ 可以动态确定参数设置的外围和中间件模式和初始化
④ 功耗预测
3.C代码工程生成器覆盖了STM32 微控制器初始化编译软件,如IAR、KEIL、GCC。
4.可独立使用或作为 Eclipse 插件使用。
1.安装JDK
- 由于 STM32CubeMX 是 Java 实现的,需要安装 JDK 环境。
- JDK官网下载链接:
https://www.oracle.com/java/technologies/javase-downloads.html - 点击.exe文件安装,点击下一步
- 选择安装路径,点击下一步
- 安装完成,关闭页面
- 打开高级系统设置,打开环境变量
- 修改系统变量
- 验证安装成功
电脑界面按win+R,打开以下界面,输入cmd
输入java -version,验证安装成功
2.安装STM32CubeMX
- 官网下载(需要绑定邮箱或者注册)
下载地址:https://www.st.com/en/development-tools/stm32cubemx.html
- 选择需要的软件,点击下载
- 注意输入正确邮箱,后续收到压缩包下载
- 以管理员身份运行.exe文件
- 点击下一步
- 更改安装路径,点击Next
- 点击Next,点击Done,完成安装
3.安装STM32 HAL库
STM32 HAL 固件库是 Hardware Abstraction Layer 的缩写,中文名称是:硬件抽象层。HAL 库是 ST 公司为 STM32 的 MCU 最新推出的抽象层嵌入式软件,为更方便的实现跨 STM32 产品的最大可移植性。HAL 库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是 HAL 库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。
和 标准库 对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在 STM32系列MCU之间无缝移植,甚至在其他 MCU 也能实现快速移植。
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用 STM32CubeMX 配置 HAL/LL库 是主流配置环境。
- 打开STM32CubeMX界面
- 点击Help,选择Manage embedded software packages
- 选择需要的固件库下载
- 安装完成,点击close关闭界面
二、基于HAL库的LED流水灯
1.创建新项目
1.1 点击File,创建新项目New Project
1.2 选择芯片STM32F103C8T6
1.3 配置SYS
1.4 配置RCC
1.5 配置GPIO
选择需要的端口(本人选择A5,B9,C14),点击设置GPIO_OUTPUT
GPIO mode 选择High
1.6 Clock Configuration设置
1.7 Project Manager设置
1.8 创建完成,用keil打开
2.实验运行
2.1 修改main.c文件中的while(1)函数
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); // 灯3亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET); // 灯3灭
/* USER CODE BEGIN 3 */
}
2.2 运行成功
3.硬件实现
程序烧入芯片
4.仿真波形
- Debug页的设置
- 点击debug,进入调试页面
- 选择逻辑分析仪
- 选择要观察的引脚
- 点击右上角,添加A5(直接输入PORTA.5,按回车即可),B9,C14引脚,注意每个引脚的Display Type选择为Bit
- 运行程序
- GPIO波形
三、中断 LED流水灯
用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;
接低电平时,LED流水灯停止工作。
1.新建项目
1.1 新建项目,选择使用的芯片STM32F103C8T6
1.2 配置RCC
1.3 配置GPIO
选择PA5作为LED灯的连接管脚,PB9 作为杜邦线(等价于开关)的连接管脚;具体配置是:左击PA5端口选择GPIO_Output模式,PB9设为EXTI。
点击左侧GPIO,PA5是高电平触发,所以不需要改变设置,别名设为**“A5_LED”,选中PB9,将GPIO Mode设置为下降沿触发外部中断;
将GPIO 设置为上拉电阻模式(Pull-up**);别名设置为B9_EXTI。
1.4 配置SYS
1.5 配置NVIC
勾选下方选项表示支持中断操作
1.6 配置Clock Configuration
1.7 配置Project Manager
1.8 设置工程文件,并导出
2.程序运行
打开keil项目或者关闭STMCube再打开对应文件。并在main.c文件的main函数外重写一个回调函数。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == B9_EXTI_Pin) //判断中断源
{
HAL_GPIO_TogglePin(GPIOA, A5_LED_Pin); //翻转led管脚 A1口的电平
}
}
- 程序成功运行
3.硬件实现
将程序烧入芯片中
四、总结
本次LED流水灯实验主要是基于STM32CubeMX HAL库的一个实验,通过这个实验,我们可以了解如何使用STM32CubeMX HAL库来控制LED灯的亮灭和模式。STM32CubeMX HAL库提供了对芯片上各种外设的控制能力等,不需要在代码上做各种工程设置,只需要简单修改一下相关代码即可完成整个工程,相比于其他方法更加方便快捷。
通过这个基于HAL库的LED流水灯实验,我学习了如何使用STM32CubeMX软件,学会使用 HAL库来实现LED流水灯功能,利用中断模式控制led流水灯并使用keil仿真逻辑分析仪功能观察管脚的时序波形,用此功能观察GPIO端口的输出波形。这个实验不仅让我加深了对STM32F103 HAL库的理解,也提高了我的编程和调试能力。