当前位置:   article > 正文

一、GPIO以及中断_gpio中断

gpio中断

闲谈

学习嘛是个循序渐进由外及内的过程,为了搞懂 STM32 还得从引脚以及贯彻嵌入式实现控制的基本方法中断入手。我们直接结合中断的方式,来认识按键外部中断点灯的过程。分为两个案例,其一为开关灯,其二为切换灯光闪烁频率,那么接下来就到了令人惊心动魄的点灯环节啦。

一、引脚启用

1

首先打开底板原理图,寻找要使用到的引脚,同时分析电路逻辑

请添加图片描述

经分析该按键为上拉式按键:按键按下时,引脚 PC13 读到低电平;按键释放时,引脚PC13读到高电平

在这里插入图片描述

我们选择 LED_RPH10 作为输出显示

在这里插入图片描述

2

修改配置文件 ioc 的名称并双击打开

3

找到所使用的引脚,在不熟悉引脚位置的情况下可以在左下角搜索框中输入引脚名称,其对应图标将会闪烁

4

配置 LED_R :左键点击引脚配置 PH10 为输出模式,再右键点击引脚为其编辑标签名(更方便编程时使用,毕竟当工程庞大,引脚数量多了后,谁懂GPIO_H 是个什么意思啊?)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2Qg9Fcv-1689523179967)(/Users/darian/Documents/博客/stm32/二、GPIO以及中断/pic/7.png)]

5

配置 KEY :与步骤4中同样的方法,配置为外部中断模式( !非普通的输入模式)并命名为 KEY

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Kx3B4XA-1689523179968)(/Users/darian/Documents/博客/stm32/二、GPIO以及中断/pic/8.png)]

二、引脚配置

1、LED 输出配置

PH10 进行配置,点击后无需修改,如有不同按照下图配置更改即可

2、KEY 中断输入配置

3、使能引脚外部中断线

4、设置外部中断优先级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2E8n8iJz-1689523179968)(/Users/darian/Documents/博客/stm32/二、GPIO以及中断/pic/12.png)]

5

查看生成的文件 gpio.c,检查是否成功,成功则对应位置出现相应的引脚初始化

6

在生成的中断源文件中可以找到中断句柄函数,按 ctrl 跟进该函数,可以看见该函数实则执行了一个回调函数,而回调函数用 weak 修饰,意味着我们可以进行重写该函数,句柄函数会自动执行重写的函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fiWBXWMu-1689523179968)(/Users/darian/Documents/博客/stm32/二、GPIO以及中断/pic/14.png)]

7

在主函数中加入重写的功能片段

注意 : 因为本任务只设置一个外部中断引脚,因此不需要判断多个引脚。如果系统中设置了多个外部中断,建议使用 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);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

编写完成烧录验证,发现实验现象,由于按下产生下降沿,而灯光下降沿触发,则现象为按下立刻反转灯光,而非松开时才产生效果。

三、切换灯光闪烁频率

1、参数

在主函数中定义一个标志来表示三种模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VOagnYa1-1689523179968)(/Users/darian/Documents/博客/stm32/二、GPIO以及中断/pic/17.png)]

volatile uint8_t Speed=0;
  • 1

2、逻辑代码

循环中使用 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");
	  }
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

3、回调函数修改

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin==KEY_Pin)	//判断外部中断源
	{
		Speed++;
		if(Speed==3)
		{
			Speed=0;
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

总结

没啥好总结的,只是有个总结更好看!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/223533
推荐阅读
相关标签
  

闽ICP备14008679号