【学习记录】STM32中断进阶任务:按键控制指示灯闪烁频率

5 篇文章 0 订阅
3 篇文章 0 订阅
该文详细描述了如何使用STM32F103ZET6芯片,通过按键B1控制LED2(连接在PA5引脚)的闪烁频率。初始频率为2Hz,按键每次增加频率至10Hz和20Hz,第三次按键恢复到2Hz。实现方法是利用中断服务程序修改全局变量BlinkSpeed,并在主程序中根据BlinkSpeed的值调整HAL_Delay的时间来改变闪烁频率。
摘要由CSDN通过智能技术生成

采用德飞莱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清零,重新开始下一轮的循环。

运行结果:

将程序编译链接,生成可执行代码,通过ST-Link仿真器下载到开发板上可以观察到:上电后,指示灯LED2按照2Hz频率闪烁。按下按键B2后,指示灯LED2闪烁频率加快,照10Hz频率闪烁。再下按键B1后,示灯LED2闪烁频率更快,按照20 Hz频率闪烁。第三次按下按键后,指示灯恢复到2 Hz的闪烁频率,并重复上述过程。

  • 21
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值