一. 了解并掌握HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务:
1、重做上一个LED流水灯作业,用GPIO端口完成2只LED灯的周期闪烁。
2、接上,再用GPIO端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作。
二. 在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察LED管脚的时序波形,分析上面作业按键中断时,LED灯的波形变化情况。
文章目录
一、安装 stm32CubeMX及项目创建
参考资料:https://blog.youkuaiyun.com/weixin_56102526/article/details/120877293
二、GPIO端口完成2只LED灯的周期闪烁
这里用到的2只LED灯分别接PA5、PA6端口。
1、代码编写
在main.c文件的main函数下的while循环中,添加下面几行代码。
注意所有自己编写的代码请放在/* USER CODE BEGIN XXX / / USER CODE END XXX */之间;这样我们修改工程的时候你自己写的代码就不会被删除。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); // PA6亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); // PA6灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // PA5亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // PA5灭
2、编译与烧录
点击魔法棒
点击Debug->点击Settings
点击Flash Download->勾选Reset and Run->点击确定
将面包板与电脑连接,点击编译后,再点击load
最终的效果
三、中断控制LED周期性闪烁
设置PA5、PB9端口分别接一个LED灯,其次设置PA0接一个开关。设置LED灯初始状态为灭,即GPIO口初始化为高电平;因为当开关接高电平时,对应的两个LED灯停止工作(即停止周期性闪烁),接低电平时,恢复工作,所以PA0口选择上升沿下降沿触发。这里设置一个变量n,当该变量为0时流水灯工作,当n为1时流水灯停止,而这个变量由中断函数内部控制,当检测到电平变化时,将n取反,0变1,1变0,实现整个过程。
1、创建项目
(1)选择芯片,STM32F103C8T6
(2)时钟RCC配置
(3)SYS配置
(4)GPIO配置
在芯片图中选择PA5、PB9为GPIO_Output,PA0设置为EXTI0_Line
点击左侧表格,设置PA5、PB9初始状态为High;选中PA0,将GPIO Mode设置为上升沿下降沿触发,将GPIO Pull-up/Pull-down设置为上拉电阻模式(Pull-up),别名设置为switch interrupt
(6)NVIC配置
勾选如图所示的中断方式
(7)时钟树配置
(8)设置工程名与工程路径
(9)设置工程文件,并导出
2、代码编写
定义全局变量
uint8_t n=0;
中断触发函数的设置
在Keil文件中的在Keil文件中的stm32f1xx_hal_gpio.c文件可以找到中断服务函数。HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。
前面的 __weak 表示此函数为虚函数,需要用户重写的。
我们在main.c文件中找个地方重新写一下。
位置在main函数下方。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == switch_interrupt_Pin)//判断外部中断源
{
n=!n;//转变n的状态
}
}
在main.c文件的main函数下的while循环中,添加下面几行代码。
switch(n)
{
case 0:
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA4亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(1000);//延时1s
break;
}
case 1:
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,1);
break;
}
}
3、编译和烧录
步骤与上一个实验一致
烧录结果
HAL
四、使用Keil观察波形
1、设置相关参数
点击魔法棒->点击Debug
2、点击放大镜,选择逻辑分析仪->点击setup,选择要观察的引脚
点击右上角的添加输入:
输入PORTX.y回车,信号输入类型选择bit(X为GPIO口号,y为选择的引脚号)
3、最终波形及分析
由波形可知,一个波形的变化约为1s,与我们预期设计一致。
总结
这次HAL库点灯实验,相比于标准库和寄存器,它的编写显得更加简单。提高了动手能力,也对中断函数的应用更加熟练。
参考资料
https://blog.youkuaiyun.com/m0_63650001/article/details/133896352
https://blog.youkuaiyun.com/weixin_55376063/article/details/127414616