基于HAL库的LED流水灯&STM32外部中断模式控制流水灯亮灭
一、STM32CubeMX 下载及安装
如要从零开始,此工具可谓理想之选。
STM32CubeMX工具可简化硬件和外设配置过程,而且用于开发的Nucleo板也拥有较高的性价比。同时也提供了丰富的部件供用户选择。
二、使用HAL库完成3只LED红绿灯的周期闪烁
1、新建STM32CubeMx项目
- 新建项目
- 选择芯片型号
2、配置系统调试接口sys
3、配置时钟RCC
4、配置输出端口
- 选择PC15、PA5、PB15为输出端口
5、配置时钟树
6、配置项目
7、创建完成并用keil打开
8、修改main.c实现流水灯
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // PA5亮
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // PA灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET); // PB15亮
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET); // PB15灭
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); // PC15亮
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); // PC15灭
}
9、编译下载
二、STM32外部中断模式控制流水灯亮灭
用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。
1、配置开关
- 使用PB5作为开关引脚使用,中断配置为上升沿和下降沿都触发
- User Label可以为当前引脚设置一个别名,方便后续自己调用。这里命名为
SWITCH
2、配置GPIO
- PA5设置为GPIO_Output,起别名
LED_A5
- PB15设置为GPIO_Output,起别名
LED_B15
- PC15设置为GPIO_Output,起别名
LED_C15
- PC13设置为GPIO_Output,做测试用
3、配置EXIT
4、创建完成并用Keil打开
- 找到stm32f1xx_it.c
- 找到EXTI9_5_IRQHandler这个函数,选中HAL_GPIO_EXTI_IRQHandler这个语句按F12跳到该函数
- 找到HAL_GPIO_EXTI_Callback这个函数
该函数是给用户自己重写的,可以在这里根据不同的中断来执行不同的处理。在这里我们需要根据PB5的不同中断来实现流水灯的亮灭。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//获取B5的电位
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
//低电位
if(pinState==GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(LED_A5_GPIO_Port,LED_A5_Pin,GPIO_PIN_RESET);//把A5变为低电位
HAL_GPIO_WritePin(LED_B15_GPIO_Port,LED_B15_Pin,GPIO_PIN_RESET);//把A5变为低电位
HAL_GPIO_WritePin(LED_C15_GPIO_Port,LED_C15_Pin,GPIO_PIN_RESET);//把A5变为低电位
}
}
- main函数
while (1)
{
HAL_GPIO_WritePin(LED_A5_GPIO_Port,LED_A5_Pin,GPIO_PIN_SET);
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(LED_A5_GPIO_Port,LED_A5_Pin,GPIO_PIN_RESET);
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(LED_B15_GPIO_Port,LED_B15_Pin,GPIO_PIN_SET);
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(LED_B15_GPIO_Port,LED_B15_Pin,GPIO_PIN_RESET);
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(LED_C15_GPIO_Port,LED_C15_Pin,GPIO_PIN_SET);
HAL_Delay(500); // 延时0.5s
HAL_GPIO_WritePin(LED_C15_GPIO_Port,LED_C15_Pin,GPIO_PIN_RESET);
HAL_Delay(500); // 延时0.5s
}
假如工程中存在了一个
__weak
修饰符的函数,用户还可以在工程中重新定义一个与之同名的函数,最终编译器编译的时候,会选择没有__weak
修饰符的函数,如果用户没有重新定义新的函数,那么编译器就会执行__weak
声明的函数,并且编译器不会报错。
- 注意:这时会报错有些管脚未定义,要将头文件main.h中的宏定义复制到stm32f1xx_hal_gpio.c中
- main执行流水灯程序,当进入中断时流水灯熄灭,退出中断时,还原到主程序即流水灯继续运行
5、编译下载
三、观察GPIO端口的输出波形
1、设置options for target
①Target设置
②Debug设置
Dialog.DLL
:DARMSTM.DLL
Parameter
:要和自己的单片机型号一致
设置后点击OK,完成设置。
2、点击Debug,进入调试界面
3、选择逻辑分析仪
4、选择要观察的引脚
5、添加引脚
-
我选择PA5、PB15、PC15
6、运行
7、观察波形
- 由波形图得知周期为3s,符合一个LED灯亮灭的周期
8、观察波形
- 由波形图得知周期为3s,符合一个LED灯亮灭的周期