目录
一、题目要求
1、基于HAL库的LED流水灯的硬件实现
了解并掌握STM32中断原理,HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:
1)、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
2)、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
2、 基于HAL库的LED流水灯的keil仿真
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
二、过程呈现
1、使用HAL库完成LED流水灯
1)实验准备
安装STM32CubeMX
我们可以到官网下载安装,通过这个网址https://www.st.com/en/development-tools/stm32cubemx.html?sc=stm32cubemx
下载完成后,我们可以以管理员身份运行安装,勾选相应选项后一直点击next即可完成安装,安装完成后界面如下所示
然后我们需要完成HAL库的安装,打开安装好的STM32CubeMx,点击HELP->Manage embedded software packages ,如下图所示
勾选上需要安装的HAL库, 点击“Install Now” 直到安装成功。 如下图
至此,创建项目前的实验准备完成,下面可以进行项目的创建
2)创建项目
进入stm32cubemx主界面,然后,点击access to mcu selector,如下图
左上角选择对应的芯片型号,这里选择的是STM32C8T6,如下图
双击芯片,进入配置界面,点击system core,进入SYS,在debug下选择serial wire
然后点击rcc,配置时钟,将hse选择为Crystal/Ceramic Resonator
点击 clock configuration,修改
点击gpio设置引脚,按设置为output
最终选取的引脚如下,
点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM
进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project
然后就可以在keil中打开了
3)代码实现
这里我在文件夹中打开生成的keil文件
打开后从左边窗口打开main.c文件
我们还需要编译main函数中while循环里面得内容,具体代码如下
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
HAL_Delay(500);//延时0.5s
这里将main.c文件中while循环的内容替换为上述代码
4)硬件实现
我们现在连接电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
总电路:
红——B9
绿——C15
黄——A4
下面是我所连接的实物图
接下来,我们先编译keil文件,生成hex文件,
如左下角所示,文件已生成。然后我们就可以进行烧录了,打开flymcu,添加文件
点击开始编程即可,最终实现效果如下
2、LED流水灯实现keil仿真
1)基本配置
我们先要对keil软件进行配置,点击魔法棒图标,点击target,将晶振按如下设置
点击debug,勾选use simulater,将最下面的方框修改为自己的芯片型号,如下
配置完成
2)仿真实现
点击放大镜进入仿真界面,然后点击逻辑分析仪
然后我们点击setup设置引脚相关信息,
这里要将display type设置为bit,颜色设置自己所连接的,完毕后点击close,然后开始仿真
最终仿真效果如下
3)仿真结果分析
我们先看进入低电平的时间,
然后是离开低电平的时间
我们要知道,所设置的延时为0.5s,仿真结果是10.02025-9.519256=0.50099,可以看出与我们所设置的延时相差无几
同时,如下图。我们可以知道,先是黄灯进入高电平,然后是红灯,最后是绿灯,这与我们所设置的也是符合的
3、实现使用中断模式控制led流水灯
1)工程创建
进入stm32cubemx主界面,然后,点击access to mcu selector,如下图
左上角选择对应的芯片型号,我这里选择的是STM32C8T6,如下图
双击芯片,进入配置界面,点击system core,进入SYS,在debug下选择serial wire
然后点击rcc,配置时钟,将hse选择为Crystal/Ceramic Resonator
点击 clock configuration,修改时钟,我们需要做出对应修改,如下图所示
然后仍然是选择GPIO接口,这里选择于前面流水的的引脚一样,即
进入Project Manager(工程管理),进行工程设置点击生成工程与代码:
然后,我们就可以生成代码了。我们可以直接选择打开生成的keil文件,也可以从保存的文件路径找到打开
2)代码实现
打开keil文件,找到gpio.c,我们要做出修改,设置为高电平,不初始化三个灯均不亮,如下
然后,我们要找到main.c文件,在主函数前面编写一个中断函数,具体代码如下所示
uint32_t flag=0;//自定义中断标识符号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == STOP_Pin){
//获取B5的电位
GPIO_PinState pinState = HAL_GPIO_ReadPin(STOP_GPIO_Port,STOP_Pin);
//高电位
if(pinState==GPIO_PIN_SET)//PB5高电位流水灯亮
{
flag=1;//PB5高电位标识
}
//低电位
else if(pinState==GPIO_PIN_RESET)//PB5低电位流水灯灭
{
flag=0;//PB5低电位标识
}
}
}
文件修改如下
接下来编写主函数内容,具体代码为
if(flag==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
HAL_Delay(100);//延时0.1s
}
if(flag==0)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
}
我们要将该代码编写在主函数while循环中,即
3)硬件实现
电路连接同上,编译keil文件生成hex文件,显示0错误0警告且生成了hex文件即可,如下
打开flymcu软件进行烧录,将刚才编译生成的hex文件添加编程即可
点击开始编程即可
最终实践效果如下
三、心得体会
这次实验对自身的能力要求还是有些高,我自己在完成实验时遇到了很多的问题,自己要解决,还是必须要参考相关资料文章才可以勉强完成,特别是后面的实验中断函数控制led流水灯,还是要寻求同学的帮助,希望下次实验可以做的更好。
四、参考网址
https://blog.csdn.net/weixin_56102526/article/details/120877293
https://blog.csdn.net/qq_43279579/article/details/112213196