文章目录
基于HAL库的LED流水灯
一、实验要求:
(一) 了解并掌握STM32中断原理,HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:
1、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
(二)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。
请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
二、安装STM32CubeMX
1.安装JAVA环境
官网链接:https://www.java.com/zh_CN/download/windows-64bit.jsp
打开JAVA安装包,勾选可更改目标文件,之后安装
选择合适的地址,之后下一步
接下来等待自动安装,安装完成之后关闭。
在开始菜单中进入所用应用,如果有“Java”即表明安装成功
2.安装CubeMX
网盘链接:https://pan.baidu.com/s/1frqRAUOwO3TgyleixRWNYw?pwd=1q3b
提取码:1q3b
打开安装好的压缩包,点击“Next”
勾选“I accept”,然后“Next”
勾选第一个,然后Next
之后选择合适的路径,若路径未创建会提示路径将被创建,点击确定即可
根据需求这两个都进行勾选,之后Next
之后程序自动进行安装。点Next即可。STM32CubeMX安装成功,接下来就可以使用它了。
3.安装相应的库
打开安装好的STMCubeMX,点击Help,选择“Manage embedded software packages”
勾选要安装的STM32F1的HAL库,由于我没有登录,所以这里的Install前有一个警示,登录之后就可以正常下载了。
下载完成之后选择的库前出现绿色标识符。
三、使用HAL库实现流水灯
1.配置HAL库
下面新建项目,点击“ACCESS TO MCU SELECTOR”进入新建项目
在搜索框输入“STM32F103C8T6”,之后双击对应选项
设置RCC为“Cystal/Ceramic Resonator”
之后设置我们的GPIO口,这里我选择的是A0、A2和B6,将它们设置为GPIO_Output
输出设置为推挽输出
接下来配备APB2时钟
为项目命名并选择适当的存储路径,将Toolchain/IDE设置为MDK-ARM
导出文件可以选择导出所有文件也可以选择只导出必要文件,只是所有文件编译时耗时会更久,之后Generated file勾选.c/,h选项
最后导出代码即可
2.编译程序实现LED流水灯
找到CubeMX建立项目存储的位置,进入"MDK-ARM"文件夹,点击project进入Keil
进入Keil的项目中,找到main.c,该文件中已经将各端口初始化完成,我们直接在while(1)循环中编写我们需要的指令即可
while(1)中的代码:
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 ,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2 ,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6 ,GPIO_PIN_SET);
HAL_Delay(400);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 ,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2 ,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6 ,GPIO_PIN_SET);
HAL_Delay(400);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 ,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2 ,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6 ,GPIO_PIN_RESET);
HAL_Delay(400);
/* USER CODE BEGIN 3 */
}
- HAL_GPIO_WritePin():这是HAL库提供的功能,它抽象了STM32微控制器上的低级硬件访问,它用于控制 GPIO
引脚的状态,第一个参数为选择GPIO端口,第二个参数为GPIO引脚号,第三个参数为设置引脚的状态。 - GPIO_PIN_RESET:这是引脚设置的状态。在许多微控制器库中,通常表示低逻辑电平,这意味着引脚设置为0V或地。
- GPIO_PIN_SET:表示引脚被设置为高逻辑电平,这意味着它被设置为电源电压电平。在大多数情况下,这将打开或激活引脚,这对于打开
LED、激活继电器或控制连接到 GPIO 引脚的其他数字设备等任务非常有用。
3.硬件实现:
四、使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形
具体使用Keil软件仿真逻辑分析仪的方式在上一篇文章中详细讲述,在此不再赘述。
根据分析波形,提取一个低电平持续的时间即为代码中Delay的时间,经过计算为0.41s,几乎接近程序中的时间。
五、使用中断控制LED灯亮灭
1.配置STM32Cube
该配置方式与实现LED灯闪烁大致相同,下面在LED灯闪烁的基础上进行修改:设置一个端口为“EXTI5”,这里选取的GPIOB_5
首先将各个GPIO端口取不同的名字,有助于编写程序汇总接收端口的信息,之后将B5的中断方式设置为上升沿触发
接下来配置NVIC,勾选中断选项
在SYS中勾选Serial Wire,如果遇到该选项无法勾选的情况,检查是否已经设置的端口占用了Serial Wire,由于我一开始选择了A13为GPIO_Output,所以无法勾选该选项,更改端口将A13空出便可以勾选了。
配备时钟:
其他操作均与上方配置LED流水灯的操作相同,最后导出程序在Keil编写程序即可
2.编写程序
打开gpio.c程序,在第546行找到HAL_GPIO_EXIT_IRQHandler()函数,复制该函数中的“HAL_GPIO_EXIT_Callback()”函数,粘贴到main.c调用
设置了指定 GPIO 引脚的中断标志:
if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
该函数用于读取给定引脚的 EXTI 中断状态。如果设置了该标志(不等于零),则表示该引脚上发生了中断事件。
如果设置了中断标志,则此行将清除指定 GPIO 引脚的中断标志。
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
清除中断标志后,此行调用回调函数并作为参数传递。通常在此处定义自定义代码以处理特定于 GPIO 引脚的中断事件。
HAL_GPIO_EXTI_Callback(GPIO_Pin);
综上:HAL_GPIO_EXIT_Callback()中代码:
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
中断程序编译完成,while中不需要添加代码即可实现中断,当端口电平变化时,程序进入中断控制LED灯