基于HAL库的LED流水灯:
一. 了解并掌握STM32中断原理,HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:
1、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
1、用GPIO端口完成3只LED红绿灯的周期闪烁:
-
首先准备好自己工具:
——STM32CubeMX ——KEIL5 ——FLYMcu V0.188 ——STM32F103C8T6开发板
安装STM32CubeMX(第一次下载需要绑定邮箱注册)
-
安装HAL库
在刚才安装好的STMCubeMX中点击HELP->Manage embedded software packages
选择你的硬件型号(这里我使用的STM32F103C8T6)点击install(安装)
-
新建一个项目:
在partname中选择自己的型号(STM32F103C8T6),并选中点击start project
首先设置Debug,点击system core,进入SYS,在debug中选择serial wire(SWD调试接口)
其次在RCC中配置时钟,一共有两个时钟源(HSE(高速外部时钟)和 LSE(低速外部时钟))由于我们要使用GPIO接口,而GPIO接口都在APB2中,而 APB2 总线的时钟源通常可以选择 HSE 或者其他的参数。
所以我们在时钟架构中选择PLLCLKPLL(Phase-Locked Loop,锁相环)是一种用于生成高稳定性时钟信号的电路。通过选择 PLLCLK 右侧可以启用 PLL,并将其用作系统时钟源的一部分。这样可以提供更高的时钟频率和更精确的时钟控制。
然后将hes设为“Crystal/Ceramic Resonator” ——意味着你打算使用晶体谐振器/陶瓷谐振器作为 HSE 的时钟源。这些是两种常见的外部时钟振荡器,用于提供稳定和准确的时钟信号。
-
接下来选择相应的引脚设置输出寄存器,即Output选项
-
最后生成项目,点击project manager,配置好自己的路径和项目名,将IDE改为MDK-ARM
-
注意
在左侧的Code Generator中勾选生成’.c/.h’文件:
最后点击“GENERATE CODE”即可生成项目,并且在生成完成后点击”open project“。
2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
一、通过Cube MX进行简单配置:
1、正常打开Cube MX,选择stm32f103c8t6型号:
2、配置RCC的High Speed Clock为Crystal/Ceramic Resonator:
3、配置SYS,Debug为Serial Wire:
4、配置GPIO引脚:
PA1、PA4、PA7、PC13(作为测试引脚)均设为GPIO_Output
PB5设为GPIO_EXTI5
5、在NVIC中勾选EXTI line:
6、Pinout View展示:
注意:创建项目时一定勾选生成“.c/.h"文件
二、通过keil5中补足代码:
首先找到生成的项目,并在工程中找到stm32f1xx_it.c这个文件并在此文件中找到:HAL_GPIO_EXTI_IRQHandler这个方法
其次可以右键点击:
最后需要修改**weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)**这个方法是留给开发者自行定义的,因为__weak修饰符:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == SWITCH_Pin){
//获取B5的电位
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
//低电位
if(pinState==GPIO_PIN_RESET){
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);//把A4变为低电位
}
//高电位
else{
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_SET);//把A4变为高电位
}
}
}
注意:如果SWITCH_Pin报错需要在前方加入头文件:#include “gpio.h”,因为这里引用需要定义的引脚。编译成功即可:
最终效果:
当B5接入高电平后LED明显变亮。
当B5接低电平后LED直接熄灭。
二. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
1、Keil仿真设置:
点击“魔法棒”后在Debug下,勾选Use Simulator、Load Application at Startup、Run to main(),并将Dialog.DLL下改为DARMSTM.DLL,Parameter下改为-pSTM32F103RC:
2、使用逻辑分析仪:
打开后,点击左上角:Setup,并新建需要添加的引脚:
输入GPIOx_IDR.y 回车 信号输出类型选择bit
x为选择的GPIO口号
y为选择的引脚号
最后选择左上角RST右侧的按钮分别是开始和停止:
结果并未观察到波形 因为查询串口通信是IO 口复用的,信号在逻辑分析窗口是不能显示出来的(所以看不到波形)。
参考文献:
https://blog.csdn.net/weixin_56102526/article/details/120877293