【STM32学习】——中断系统&STM32中断简介&EXTI外部中断&旋转编码器接线及代码实操

外部中断与实操

一、中断系统
1、中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
例如利用定时器中断代替Delay函数实现定时或计数功能!!
2、中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

3、中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

4、执行流程
利用C语言不用现场保护和恢复因为在内部替我们弄好了,我们在学习用汇编语言实现的时候则需要自己设置!!
在这里插入图片描述
二、STM32中断
1、68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设

2、使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级
3、中断资源,其中灰色为内核的中断(一般用不到),非灰色的为STM32外设的中断:

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是一个简单的STM32按键,它使用外部中断和定时器来检测按键状态。在此示例中,我们将PB12设置为输入引脚,并且在PB12上连接了一个按键。 首先,我们需要在STM32 CubeMX中配置GPIO和外部中断。在GPIO设置中,将PB12配置为输入模式。然后,在外部中断设置中,将PB12配置为外部中断线,并启用下降沿触发。 接下来,我们需要在代码中初始化定时器。在此示例中,我们使用TIM3,并将其配置为1毫秒的定时器。我们还需要在代码中启用中断和定时器计数器。 最后,在主循环中,我们等待中断触发,然后检查按键状态。如果按键被按下,则我们将触发一些操作(例如切换LED状态)。 ``` #include "stm32f4xx.h" void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { // Clear the interrupt TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // Toggle LED or do something else GPIO_ToggleBits(GPIOD, GPIO_Pin_12); } } void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line12) != RESET) { // Wait for debounce int i; for(i=0; i<50000; i++); // Check button state if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0) { // Start timer TIM_Cmd(TIM3, ENABLE); } else { // Stop timer TIM_Cmd(TIM3, DISABLE); TIM_SetCounter(TIM3, 0); GPIO_ResetBits(GPIOD, GPIO_Pin_12); } // Clear the interrupt EXTI_ClearITPendingBit(EXTI_Line12); } } int main(void) { // Initialize system clocks SystemInit(); // Initialize GPIO RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStruct); // Initialize timer RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Period = 1000 - 1; TIM_InitStruct.TIM_Prescaler = 42000 - 1; TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_InitStruct); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC_EnableIRQ(TIM3_IRQn); // Initialize external interrupt EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line = EXTI_Line12; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStruct); NVIC_EnableIRQ(EXTI15_10_IRQn); while(1) { // Wait for interrupt __WFI(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯宝最帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值