目录
2.2 Pinout&Configuration (端口配置)
3.2 添加流水灯代码(用到的相关函数、代码思路和完整代码)
1. stm32CubeMX环境搭建
1.1 安装Java环境(未安装Java需要安装)
安装Java的链接:https://www.java.com/zh-CN/download/
进入下载安装就行了
1.2 安装STM32CubeMX
下载链接:https://www.st.com/en/development-tools/stm32cubemx.html
下载后,运行setup可执行文件:
安装好后,进入软件主界面:
点击help->Manage embedded software packages下载对应的芯片库文件:
选择STM32F1->STM32Cube MCU Package for STM32F1 Series->Install
2. 新建工程,配置环境,生成KEIL代码
2.1 新建工程
进入配置界面:
2.2 Pinout&Configuration (端口配置)
2.2.1 GPIO配置
在芯片PA0处直接点击PA0, 然后选择GPIO_Output,端口变绿就说明配置成功了
同样的方法将PA0-7都配置成输出模式
下面配置输出的速度和初始状态:
同样配置其他PA1-7 另外7个引脚
下面将PB4配置为外部中断源
同样到GPIO处,选择PB4,配置PB4的中断类型:
2.2.2 RCC配置
2.2.3 SYS配置
2.2.4 NVIC中断优先级配置
2.3 CLK Configuration (时钟配置)
2.4 Project Manager(工程管理)
注意:路径不能包含中文和空格,不然生成的工程文件无法在Keil中打开
最后点击生成代码
2.5 查看生成的代码(GPIO初始化,中断配置)
3. Keil5添加流水灯和中断代码
3.1 任务要求
将PA0-7八个端口连接8个LED灯的阳极,LED灯阴极接地,那么端口输出高电平LED灯就亮,低电平灯就灭。加上HAL_Delay()函数进行延时,实现流水灯效果。此外,将PB4引脚用作外部中断源,当PB4为高电平时,流水灯开始工作,低电平时候流水灯不工作。
3.2 添加流水灯代码(用到的相关函数、代码思路和完整代码)
3.2.1 程序思路
将PA0-7轮流置为高电平,然后延时,周而复始。
流水灯代码需要用到的几个函数:
3.2.2 输出点平配置函数
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
该函数是用来配置某个GPIO端口的输出状态
例如要将PA0设置为高电平,则如下格式:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
3.2.3 读取端口状态函数
如果需要读取PB4的点平状态,那么可以如下写:
GPIO_PinState HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)
3.2.4 延时函数
void HAL_Delay(uint32_t Delay)
可见,这里是通过计时器写的代码,所以是非常精确的
该函数时一个延时函数,后面添加延时的时间,单位为ms,例如延时1s,则可以写:
HAL_Delay(1000)
3.2.5 代码流程图
3.2.6 LED_Turn函数编写
void LED_Turn()
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7,GPIO_PIN_SET);
HAL_Delay(1000);
}
3.3 添加中断代码
![17e9b17b4f8642a5996809a5c440f59f.png](https://img-blog.csdnimg.cn/17e9b17b4f8642a5996809a5c440f59f.png)
![3d81a05285e840e8a7089d6a77460780.png](https://img-blog.csdnimg.cn/3d81a05285e840e8a7089d6a77460780.png)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_4)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)==GPIO_PIN_RESET)//ϽµÑØ
flag=0;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)==GPIO_PIN_SET) //ÉÏÉýÑØ
flag=1;//Á÷Ë®µÆ¹¤×÷
}
}
代码解释:GPIO_Pin是哪个端口触发的中断,因为我们是PB4,所以是第四个端口,因此首先添加判断如果是GPIO_PIN_4触发的中断,再判断电平,高电平flag置1,低电平flag置0。在主函数中,我们也需要编写逻辑,思路是判断如果flag==1,就调用流水灯函数,如果是0就直接全部灯灭就行了。
主函数逻辑:
while (1)
{
if(flag==1)
{
LED_Turn();
}
if(flag==0)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_RESET);
}
}
代码流程图:
4. 实验效果
4.1 实物效果
4.2 仿真查看波形
仿真查看波形需要修改一下源码,直接在while1中调用流水灯程序,查看电平持续时间,仿真需要的MDK配置:
修改循环中的代码:
while(1)
{
LED_Turn();
}
仿真查看波形:
5. 总结与参考
1. 对比之前的寄存器开发流水灯、库函数开发版本,HAL库开发效率大幅度提高,只需要在stm32cubeMX的UI界面进行操作,很快的就能配置好所需内容,之前的寄存器开发需要去查找手册每个寄存器的作用,需要知道如何设寄存器才能有对应的效果,库函数开发相比寄存器开发效率提高了很多,我们不需要知道寄存器的作用,官方通过库函数封装起来了,只需要调用对应的库函数就能完成操作,相比之下开发效率更高,而且方便记忆。HAL库就逆天了,直接鼠标点击几下,不需要知道什么寄存器、什么库函数,直接就能在UI界面进行配置,然后生成代码。但是HAL库的代码逻辑还是需要自己手动去添加,HAL库生成的代码其实是和库函数是很像的,只是函数名字不一样,但是读名字也很容易发现对应函数的功能。
2. 实物实验结果分析:通过查看视频,首先我们烧录代码后,LED灯是没有变化的,因为这时候并不知道flag的值是多少,我们没有赋值,只是定义了flag。当我们将PB4接入高电平的时候,会触发上升沿中断(PB4是拉低的,因此初始化是低电平),这时候会进入中断,设置flag=1,然后回到死循环,死循环中判别到flag=1,这时候就调用了LED_Turn(),流水灯函数,流水灯就开始工作了,当PB4从高电平中取出来,即产生了下降沿中断,这时候flag=0,然后回到了死循环,这时候会继续执行死循环中的内容,如果流水灯程序还没执行完,会将流水灯执行完后,然后停止工作,这样就通过PB4接入高电平控制流水灯工作,低电平控制流水灯不工作,但是这里有一个小问题,就是当PB4接入低电平的时候不能直接停止工作,而是需要等待到死循环中判断flag=0处才能停止,这也符合中断逻辑,中断后进入中断函数,执行完后回到主函数继续执行未执行的内容。
3. 仿真结果分析:通过查看仿真波形,高电平开始时间为2.0s,结束时间为3.02s,那么可以得出高电平持续时间为1.2s,灯亮的时间就为1.2s,这是仿真得出来的结果,但是按照代码逻辑,我们调用的是封装的库函数,里面是通过定时器延时的,所以是准确的一秒钟,因此可以得出仿真的电平持续时间是多了0.02s的误差的,误差为2%,还是挺小的。
PS:参考网址
STM32实现LED闪烁——基于HAL库_编程实现led灯闪烁stm32库-CSDN博客
【精选】STM32基于HAL库流水灯实验_hel库安装教程中文版-CSDN博客