赞
踩
学习嘛是个循序渐进由外及内的过程,为了搞懂 STM32 还得从引脚以及贯彻嵌入式实现控制的基本方法中断入手。我们直接结合中断的方式,来认识按键外部中断点灯的过程。分为两个案例,其一为开关灯,其二为切换灯光闪烁频率,那么接下来就到了令人惊心动魄的点灯环节啦。
首先打开底板原理图,寻找要使用到的引脚,同时分析电路逻辑
经分析该按键为上拉式按键:按键按下时,引脚 PC13 读到低电平;按键释放时,引脚PC13读到高电平
我们选择 LED_R 即 PH10 作为输出显示
修改配置文件 ioc 的名称并双击打开
找到所使用的引脚,在不熟悉引脚位置的情况下可以在左下角搜索框中输入引脚名称,其对应图标将会闪烁
配置 LED_R :左键点击引脚配置 PH10 为输出模式,再右键点击引脚为其编辑标签名(更方便编程时使用,毕竟当工程庞大,引脚数量多了后,谁懂GPIO_H 是个什么意思啊?)
配置 KEY :与步骤4中同样的方法,配置为外部中断模式( !非普通的输入模式)并命名为 KEY
对 PH10 进行配置,点击后无需修改,如有不同按照下图配置更改即可
查看生成的文件 gpio.c,检查是否成功,成功则对应位置出现相应的引脚初始化
在生成的中断源文件中可以找到中断句柄函数,按 ctrl 跟进该函数,可以看见该函数实则执行了一个回调函数,而回调函数用 weak 修饰,意味着我们可以进行重写该函数,句柄函数会自动执行重写的函数
在主函数中加入重写的功能片段
注意 : 因为本任务只设置一个外部中断引脚,因此不需要判断多个引脚。如果系统中设置了多个外部中断,建议使用 switch-case 进行多分支判断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==KEY_Pin) //判断外部中断源
{
HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
}
}
编写完成烧录验证,发现实验现象,由于按下产生下降沿,而灯光下降沿触发,则现象为按下立刻反转灯光,而非松开时才产生效果。
在主函数中定义一个标志来表示三种模式
volatile uint8_t Speed=0;
循环中使用 if - else if - else 进行模式判断(一定记得带 else !)
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(Speed==0)
{
printf("1 Hz \n\r");
HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
HAL_Delay(1000);
}
else if(Speed==1)
{
printf("5 Hz \n\r");
HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
HAL_Delay(200);
}
else if(Speed==2)
{
printf("20 Hz \n\r");
HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
HAL_Delay(50);
}
else
{
printf("Error! \n\r");
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==KEY_Pin) //判断外部中断源
{
Speed++;
if(Speed==3)
{
Speed=0;
}
}
}
没啥好总结的,只是有个总结更好看!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。