你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103外部中断实现

[复制链接]
STMCU小助手 发布时间:2022-3-19 21:05
  中断是单片机中最重要的一个功能了,通过中断可以提高程序的运行效率,可以是单片机及时的响应各种外设的请求。STM32系列单片机的中断主要由嵌套向量中断控制器来管理。

  嵌套向量中断控制器特性如下:
68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);
16个可编程的优先等级(使用了4位中断优先级);
低延迟的异常和中断处理;
电源管理控制;
系统控制寄存器的实现;
  嵌套向量中断控制器( NVIC ) 和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地
处理晚到的中断。

  外部中断/事件控制器由19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏
蔽。挂起寄存器保持着状态线的中断请求。

  EXTI控制器的主要特性如下:

每个中断/事件都有独立的触发和屏蔽
每个中断线都有专用的状态位
支持多达20个软件的中断/事件请求
检测脉冲宽度低于APB2时钟宽度的外部信号。参见数据手册中电气特性部分的相关参数。


中断控制框图如下:

}KYW@HKM1%QLD8_IN)%VAM3.png

  下面用按键口作为中断检测口,来演示一下中断的使用方法。

  1. //KEY0 PC1  KEY1 PC13  WK_UP  PA0

  2. void KEY_Init(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);

  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_13;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //上拉输入
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9. GPIO_Init(GPIOC, &GPIO_InitStructure);

  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                //下拉输入
  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13. GPIO_Init(GPIOA, &GPIO_InitStructure);
  14. }
复制代码

  首先初始化按键所使用的IO口,这里使用了三个按键,其中一个按键默认为低电平,按键按下后为高电平。其余两个按键默认是高电平,按下按键后为低电平。 下面开始初始化中断。

  1. //KEY0 PC1  KEY1 PC13  WK_UP  PA0
  2. void EXTIx_Init(void)
  3. {
  4. EXTI_InitTypeDef EXTI_InitStructure;
  5. NVIC_InitTypeDef NVIC_InitStructure;

  6. // 1、初始化IO
  7. KEY_Init();                                                                                                        //按键端口初始化
  8. // 2、开启AFIO时钟
  9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);                 //使能复用功能时钟
  10. // 3、设置IO口与中断线的映射关系
  11. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);        //PA0
  12. // 4、初始化线上中断,设置触发条件
  13. EXTI_InitStructure.EXTI_Line = EXTI_Line0;                                        //WK_UP 上升沿
  14. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  15. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  16. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  17. EXTI_Init(&EXTI_InitStructure);

  18. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);        //PC1

  19. EXTI_InitStructure.EXTI_Line = EXTI_Line1;                                        //KEY0 下降沿
  20. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  21. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  22. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  23. EXTI_Init(&EXTI_InitStructure);

  24. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//PC13

  25. EXTI_InitStructure.EXTI_Line = EXTI_Line13;                                        //KEY1 上升沿
  26. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  27. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  28. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  29. EXTI_Init(&EXTI_InitStructure);
  30. // 5、配置中断分组,并使能中断
  31. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  32. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  33. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
  34. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  35. NVIC_Init(&NVIC_InitStructure);

  36. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  37. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  38. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  39. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  40. NVIC_Init(&NVIC_InitStructure);

  41. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  42. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  43. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  44. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  45. NVIC_Init(&NVIC_InitStructure);
  46. }

  47. void EXTI0_IRQHandler(void)
  48. {
  49. if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  50. {
  51. delay_ms(10);
  52. if(WK_UP == 1)
  53. {
  54. LED0 = !LED0;
  55. LED1 = !LED1;
  56. }
  57. EXTI_ClearITPendingBit(EXTI_Line0);
  58. }
  59. }
  60. void EXTI1_IRQHandler(void)
  61. {
  62. if(EXTI_GetITStatus(EXTI_Line1) != RESET)
  63. {
  64. delay_ms(10);
  65. if(KEY0 == 1)
  66. {
  67. LED0 = !LED0;
  68. }
  69. EXTI_ClearITPendingBit(EXTI_Line1);
  70. }
  71. }
  72. void EXTI15_10_IRQHandler(void)
  73. {
  74. if(EXTI_GetITStatus(EXTI_Line13) != RESET)
  75. {
  76. delay_ms(10);
  77. if(KEY1 == 1)
  78. {
  79. LED1 = !LED1;
  80. }
  81. EXTI_ClearITPendingBit(EXTI_Line13);
  82. }

  83. }
复制代码

  初始化中断时需要设置每个IO口对应的中断线,中断线对应关系如下图:

24BJ0WYG9E]9X7LF$O9%@GR.png

  通过上图可以看出所有的P0口对应的都是中断线0,所有的P1口对应的都是中断线1,依次类推。这里使用的三个按键分别是PC1、PC13、PA0,也就是对应的中断线为中断线1、中断线13、中断线0。

  中断线设置完成之后,还需要设置中断分组,也就是设置中断的优先级,当中断同时触发的时候,优先级越高的中断优先处理。

  中断线设置好之后,还需要提供中断入口函数,因为中断触发后,系统就会自动跳转到中断入口函数中,执行中断函数的代码。每个中断入口的函数名称都是固定的,不能自己定义。中断函数的入口名称可以在startup_stm32f10x_hs.s文件中查看。

  1.            ; External Interrupts
  2.             DCD     WWDG_IRQHandler            ; Window Watchdog
  3.             DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
  4.             DCD     TAMPER_IRQHandler          ; Tamper
  5.             DCD     RTC_IRQHandler             ; RTC
  6.             DCD     FLASH_IRQHandler           ; Flash
  7.             DCD     RCC_IRQHandler             ; RCC
  8.             DCD     EXTI0_IRQHandler           ; EXTI Line 0
  9.             DCD     EXTI1_IRQHandler           ; EXTI Line 1
  10.             DCD     EXTI2_IRQHandler           ; EXTI Line 2
  11.             DCD     EXTI3_IRQHandler           ; EXTI Line 3
  12.             DCD     EXTI4_IRQHandler           ; EXTI Line 4
  13.             DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
  14.             DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
  15.             DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
  16.             DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
  17.             DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
  18.             DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
  19.             DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
  20.             DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2
  21.             DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
  22.             DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
  23.             DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
  24.             DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
  25.             DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
  26.             DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
  27.             DCD     TIM1_UP_IRQHandler         ; TIM1 Update
  28.             DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
  29.             DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
  30.             DCD     TIM2_IRQHandler            ; TIM2
  31.             DCD     TIM3_IRQHandler            ; TIM3
  32.             DCD     TIM4_IRQHandler            ; TIM4
  33.             DCD     I2C1_EV_IRQHandler         ; I2C1 Event
  34.             DCD     I2C1_ER_IRQHandler         ; I2C1 Error
  35.             DCD     I2C2_EV_IRQHandler         ; I2C2 Event
  36.             DCD     I2C2_ER_IRQHandler         ; I2C2 Error
  37.             DCD     SPI1_IRQHandler            ; SPI1
  38.             DCD     SPI2_IRQHandler            ; SPI2
  39.             DCD     USART1_IRQHandler          ; USART1
  40.             DCD     USART2_IRQHandler          ; USART2
  41.             DCD     USART3_IRQHandler          ; USART3
  42.             DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
  43.             DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
  44.             DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
  45.             DCD     TIM8_BRK_IRQHandler        ; TIM8 Break
  46.             DCD     TIM8_UP_IRQHandler         ; TIM8 Update
  47.             DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation
  48.             DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare
  49.             DCD     ADC3_IRQHandler            ; ADC3
  50.             DCD     FSMC_IRQHandler            ; FSMC
  51.             DCD     SDIO_IRQHandler            ; SDIO
  52.             DCD     TIM5_IRQHandler            ; TIM5
  53.             DCD     SPI3_IRQHandler            ; SPI3
  54.             DCD     UART4_IRQHandler           ; UART4
  55.             DCD     UART5_IRQHandler           ; UART5
  56.             DCD     TIM6_IRQHandler            ; TIM6
  57.             DCD     TIM7_IRQHandler            ; TIM7
  58.             DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1
  59.             DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2
  60.             DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3
  61.             DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
复制代码

这里的中断向量表中列出了所有中断函数入口名称。

当按键按下后,程序就会跳转到中断函数中去,在中断函数中通过LED灯来指示不同按键按下的效果。


收藏 评论0 发布时间:2022-3-19 21:05

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版