STM32学习记录3——中断

定义:

NVIC 即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。它是属于 CM3 内核的器件。
中断:就是当 CPU 执行程序时,由于发生了某种随机的事件(外部或内部),引起 CPU 暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程就称为中断。
中断源:引发中断信号来源称为中断源。
中断的嵌套:有些中断还能够被其他高优先级的中断所中断,那么这种情况又叫做中断的嵌套。
中断通道:是传递、处理中断的信息通道。中断通道对应有唯一的中断号、中断优先级、中断向量、服务程序;1个中断通道可以有多个中断源,每个中断源有对应的中断处理程序。

STM32中断分类

1、CPU中断(15个通道)
包括非屏蔽中断、异常、指令中断、复位。
2、设备中断(43~68个通道)
指STM32微控制器片内所有设备的中断,其数量与型号有关,对于大容量(hd)类型,共60个。
3、外部中断(16个中断源、7个通道)
16个中断源,通过7个端口(PA、PB、PC、PD、PE、PF、PG)引脚接外部设备信号。7个中断通道:来自外部引脚。另外4个中断源连接的是内部设备,用于检测电压、RTC闹钟、两个唤醒CPU,且各占1个通道。

中断初始化配置

  • 将GPIO设置为:GPIO_EXTI功能。
  • 设置中断触发条件:上升沿,下降沿,上升沿或下降沿。
  • 使能相关NVIC通道

代码编写

使用按钮触发中断,改变小灯的状态

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin==GPIO_PIN_4)//C4引脚为按钮引脚,初始化设置为上升沿触发
	{
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);//改变C3小灯引脚的状态
	}
	if(GPIO_Pin==GPIO_PIN_5)//C5引脚为按钮引脚,初始化设置为下降升沿触发
	{
		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);//改变C3小灯引脚的状态
	}
}

这里有个小插曲,在上升沿触发中断的时候容易被多次触发,所以尝试在回调函数中使用延时函数,延时20毫秒,想要在第一次上升沿触发中断以后,跳过在按键抬起后的震荡,从而给按键消抖。但是程序运行了以后第一次中断触发以后单片机就卡死,搜集资料后发现中断里面不能延时,延时是错误用法。不过有点奇怪的是在编译的时候没有出现任何的报错和警告信息。
继续深入查询资料发现,可以不用按键触发外部中断,而是使用定时器中断,每隔一定时间对按键进行扫描,如果为按下状态,则标志位+1,否则标志位清零,当标志位达到一定的数值的时候,则视为按键按下。

void timer0(void)
{
    if(io_key==0)keycnt++;else keycnt=0
    if(keycnt==5)key=1;//连续5次都采集到就认为有按键
}

这里先存档一下大佬的代码,等下节学习定时器中断的时候实际尝试一下吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值