采用德飞莱STM32板,主控芯片STM32F103ZET6。
任务内容:利用按键B1控制指示灯LD2的闪烁频率,闪烁频率设置为3档:初始状态时,LD2按照2Hz的频率闪烁;第一次按键后,LD2按照10 Hz的频率闪烁;第二次按键后,LD2按照20Hz的频率闪烁。再次按键后让LD2恢复以2Hz的频率闪烁,并重复上述过程。按键的检测采用中断方式。
硬件原理:按键B1由引脚PC13控制:按键按下时为下降沿触发方式,释放时为上升沿触发方式。指示灯LD2由引脚PA5控制;PA5输出高电平,开启指示灯;PA5输出低电平,关闭指示灯。
任务实现
1. 设计思路
采用前后台编程模式:定义一个全局变量BlinkSpeed,初始化为0。在外部中断服务程序(前台程序)中修改BlinkSpeed的值;在主程序(后台程序)的while(1)循环中不断检测BlinkSpeed的值,根据取值的不同修改指示灯的闪烁频率。
2. 引脚分配和外设配置
本任务所使用的引脚和外设与基础任务中所使用的相同,因此省去引脚分配和外设配置的过程。
1.
双击进入
2.
3.
4.配置LED灯引脚(PB5)
5. 配置KEY键引脚(PE2)
配置上拉、上升沿和下降沿
使能中断
6.配置时钟树
7.改名、保存、打开
3. 程序编写
生成MDK工程后,进行应用程序的编写。具体代码如程序代码段1和2所示。
代码段1:
/* USER CODE BEGIN PV */
volatile uint8_t BlinkSpeed = 0;// 指示灯闪烁频率:0->2Hz 1->10Hz 2->20Hz
/* USER CODE END PV */
/* ………………………… */ // 省去中间部分代码
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if( BlinkSpeed == 0) // 2Hz 闪烁频率
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
HAL_Delay(500);
}
else if( BlinkSpeed == 1 ) // 10Hz 闪烁频率
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
HAL_Delay(100);
}
else // 20Hz 闪烁频率
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
HAL_Delay(50);
}
}
/* USER CODE END 3 */
程序解释:
① 第2行定义了一个变量 BlinkSpeed,用来存放指示灯的闪烁频率:BlinkSpeed为0表示2 Hz的闪烁频率;BlinkSpeed为1表示10Hz的闪烁频率;BlinkSpeed为2表示20 Hz的闪烁频率。由于变量BlinkSpeed在中断服务程序中修改,在主程序中判断。为了避免变量被编译器优化,在变量定义时,添加了关键字 volatile 来修饰。
② 第11~25行是while(1)循环中报执行的代码。采用if-else if-else的多分支语句,通过判断BlinkSpeed的取值来改变指示灯的闪烁频率:当BlinkSpeed为0时,设置闪烁频率为 2 Hz,即延时时间为500ms;当BlinkSpeed为1时,设置闪烁频率为10Hz,即延时时间为100ms;当BlinkSpeed为2时,设置闪烁频率为20Hz,即延时时间为50ms。
代码段2:
/* USER CODE BEGIN 4 */
/*
* @brief ExTI line detection callbacks.
* @param GPIO_Pin: Specifes the pins connected EXTI line
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPI0_Pin)
{
if(GPIO_PIN_2 == GPI0_Pin) // 判断发生外部中断的 GPIO 引脚
{
BlinkSpeed++; // 修改 BlinkSpeed 变量的值
if( BlinkSpeed == 3) // 判断是否完成一次循环
{
BlinkSpeed = 0;
}
}
}
/* USER CODE END 4 */
程序解释:
在外部中断回调函数中对变量Blink ASpeed加1,并判断BlinkSpeed的值是否等于3。如果等于3,则对BlinkSpeed清零,重新开始下一轮的循环。
运行结果:文章来源:https://www.toymoban.com/news/detail-725333.html
将程序编译链接,生成可执行代码,通过ST-Link仿真器下载到开发板上可以观察到:上电后,指示灯LED2按照2Hz频率闪烁。按下按键B2后,指示灯LED2闪烁频率加快,照10Hz频率闪烁。再下按键B1后,示灯LED2闪烁频率更快,按照20 Hz频率闪烁。第三次按下按键后,指示灯恢复到2 Hz的闪烁频率,并重复上述过程。文章来源地址https://www.toymoban.com/news/detail-725333.html
到了这里,关于【学习记录】STM32中断进阶任务:按键控制指示灯闪烁频率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!