目录
前言
本次作业时为了了解并掌握STM32中断原理,HAL库函数的开发方法。
一、实验任务
1、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。
2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
3、在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
二、环境搭建
具体安装参考链接:【精选】STM32基于HAL库流水灯实验_hel库安装教程中文版-CSDN博客
三、HAL库实现流水灯
1、建立工程
(1)打开STMCubeMX主界面,创建新工程:
(2)按照实际情况选择自己的芯片,然后start project,我使用的是TM32F103C8T6。
(3)点击“A→Z”,找到SYS,在debug里面选择serial wire。
(4)然后配置时钟,把HSE处的设置改为如下如所示。
然后点击Clock Configuration,把PLLCLK选上。
(5)然后选择引脚设置输出寄存器。在“A→Z”处找到GPIO,在右边的图中点击引脚并选择OUTPUT。
最后大致如图。
继续对引脚进行修改:点击要修改的引脚,然后将电平改为High。
(6)在Project Manager板块写好工程名字,确定好保存路径,然后将IDE那里改成MDK-ARM。
(7)在Code Generator处在如下图选项上打勾,生成初始化.c/.h文件,然后点击GENERATE CODE,再点击open project,就进入到keil5了。
2、keil程序编写
接着上一步进入到keil5中,打开main.c文件,并找到main函数的位置。然后在main函数里面的while(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(1000);//延时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(1000);//延时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(1000);//延时1s
在魔法棒里面找到output,生成hex文件。
再点击debug,修改如下配置。点击OK。
然后进行编译,没有报错且产生了hex文件。
3、电路连接
根据设计的程序连接电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
总电路:
红——B9
绿——C15
黄——A4
接线实物图如下:
4、烧录运行
使用mcuisp进行烧录。
5、观察输出波形
首先对debug进行设置,如下:
然后就可以开始运行了,在这个图标中观察波形图,需要手动进行添加,然后将类型设置为bit,点击关闭就可以观察波形了。
四、使用中断控制流水灯开关
1、建立工程
(1)工程创建。前四个步骤同上,不多讲述。
(2)根据实际情况在GPIO处选择引脚:
然后根据下图做好设置。
(3)选择NVIC,在EXIT处进行勾选,并进行设置。
(4)点击Clock Configuration,进行时钟配置,
(5)点击Project Manager,生成.c/.h文件。
(6)设置好文件名(不能有空格和中文名),在IDE处选择MDK-ARM,生成代码。
2、代码完善
在刚刚生成的keil5工程中找到main.c文件,点击进入定义处。
把RESET改为SET,将这三个GPIO口设置为高电平,均不初始时不亮。
然后回到main.c文件,编写一个中断函数HAL_GPIO_EXTI_Callback()以及自定义一个中断的标识符号flag。
uint32_t flag=0;//自定义中断标识符号
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_SET)//PB5高电位流水灯亮
{
flag=1;//PB5高电位标识
}
//低电位
else if(pinState==GPIO_PIN_RESET)//PB5低电位流水灯灭
{
flag=0;//PB5低电位标识
}
}
}
找到main函数中while(1),在里面加入代码:
if(flag==1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//PA1亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(100);//延时0.1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2亮灯
HAL_Delay(100);//延时0.1s
}
else if(flag==0)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
}
编译成功,没有报错,成功生成了hex文件。
3、电路连接并烧录运行
过程同前一个实验一样,在此也就不过多叙述。最后实现的效果如下:
总结
本次实验学习了有关HAL库的知识,也初步掌握了其运用方法,对于各种软件的调节也有了进一步的理解和认识,学习嵌入式是一个需要不断实践和积累经验的工作,通过本次作业,提高了自己的编程水平,不断试错,不断改正,保证程序的正确性,才能实现实验目标。