[STM32F4] STM32F4xx 中断机制

[复制链接]
1207|29
 楼主| 梅花香自123 发表于 2023-10-18 15:44 | 显示全部楼层 |阅读模式
第四部分 中断机制
一、中断
中断响应: CPU指令执行过程中,被“紧急”事件打断。

中断处理: 停止正在运行的程序并转入处理新情况的程序。

中断返回: 处理完毕后又返回原被暂停的程序继续运行。

二、ARM Cortex M4中断机制
中断控制器IC“通知”MCU,有“事”(中断事件)啦,MCU会停止正在做的程序事件,转而中断处理。

M4给不同的事件(中断),一个唯一的中断编号(为了区分不同的中断事件)。当不同的中断事件产生时,MCU作不同的处理。

 楼主| 梅花香自123 发表于 2023-10-18 15:45 | 显示全部楼层
中断向量表 79711652f8d016209b.png
 楼主| 梅花香自123 发表于 2023-10-18 15:45 | 显示全部楼层
产生中断后,CPU到指定的地址取中断处理函数的函数指针,然后去执行中断响应函数。
 楼主| 梅花香自123 发表于 2023-10-18 15:45 | 显示全部楼层
中断处理函数
在STM32F407的汇编启动文件中startup_stm32f40xx.s规定了每一个中断函数的固定的名字。
 楼主| 梅花香自123 发表于 2023-10-18 15:45 | 显示全部楼层
  1. __Vectors       DCD     __initial_sp               ; Top of Stack
  2.                 DCD     Reset_Handler              ; Reset Handler
  3.                 DCD     NMI_Handler                ; NMI Handler
  4.                 DCD     HardFault_Handler          ; Hard Fault Handler
  5.                 DCD     MemManage_Handler          ; MPU Fault Handler
  6.                 DCD     BusFault_Handler           ; Bus Fault Handler
  7.                 DCD     UsageFault_Handler         ; Usage Fault Handler
  8.                 DCD     0                          ; Reserved
  9.                 DCD     0                          ; Reserved
  10.                 DCD     0                          ; Reserved
  11.                 DCD     0                          ; Reserved
  12.                 DCD     SVC_Handler                ; SVCall Handler
  13.                 DCD     DebugMon_Handler           ; Debug Monitor Handler
  14.                 DCD     0                          ; Reserved
  15.                 DCD     PendSV_Handler             ; PendSV Handler
  16.                 DCD     SysTick_Handler            ; SysTick Handler

  17.                 ; External Interrupts
  18.                 DCD     WWDG_IRQHandler                   ; Window WatchDog                                       
  19.                 DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
  20.                 DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
  21.                 DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
  22.                 DCD     FLASH_IRQHandler                  ; FLASH                                          
  23.                 DCD     RCC_IRQHandler                    ; RCC                                             
  24.                 DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
  25.                 DCD     EXTI1_IRQHandler                  ; EXTI Line1                                             
  26.                 DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
  27.                 DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
  28.                 DCD     EXTI4_IRQHandler                  ; EXTI Line4                                             
  29.                 DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0                                   
  30.                 DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1                                   
  31.                 DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2                                   
  32.                 DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3                                   
  33.                 DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4                                   
  34.                 DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5                                   
  35.                 DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6                                   
  36.                 DCD     ADC_IRQHandler                    ; ADC1, ADC2 and ADC3s                           
  37.                 DCD     CAN1_TX_IRQHandler                ; CAN1 TX                                                
  38.                 DCD     CAN1_RX0_IRQHandler               ; CAN1 RX0                                               
  39.                 DCD     CAN1_RX1_IRQHandler               ; CAN1 RX1                                               
  40.                 DCD     CAN1_SCE_IRQHandler               ; CAN1 SCE                                               
  41.                 DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s                                    
  42.                 DCD     TIM1_BRK_TIM9_IRQHandler          ; TIM1 Break and TIM9                  
  43.                 DCD     TIM1_UP_TIM10_IRQHandler          ; TIM1 Update and TIM10                 
  44.                 DCD     TIM1_TRG_COM_TIM11_IRQHandler     ; TIM1 Trigger and Commutation and TIM11
  45.                 DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare                                   
  46.                 DCD     TIM2_IRQHandler                   ; TIM2                                            
  47.                 DCD     TIM3_IRQHandler                   ; TIM3                                            
  48.                 DCD     TIM4_IRQHandler                   ; TIM4                                            
  49.                 DCD     I2C1_EV_IRQHandler                ; I2C1 Event                                             
  50.                 DCD     I2C1_ER_IRQHandler                ; I2C1 Error                                             
  51.                 DCD     I2C2_EV_IRQHandler                ; I2C2 Event                                             
  52.                 DCD     I2C2_ER_IRQHandler                ; I2C2 Error                                               
  53.                 DCD     SPI1_IRQHandler                   ; SPI1                                            
  54.                 DCD     SPI2_IRQHandler                   ; SPI2                                            
  55.                 DCD     USART1_IRQHandler                 ; USART1                                          
  56.                 DCD     USART2_IRQHandler                 ; USART2                                          
  57.                 DCD     USART3_IRQHandler                 ; USART3                                          
  58.                 DCD     EXTI15_10_IRQHandler              ; External Line[15:10]s                                 
  59.                 DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line                  
  60.                 DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI line                        
  61.                 DCD     TIM8_BRK_TIM12_IRQHandler         ; TIM8 Break and TIM12                  
  62.                 DCD     TIM8_UP_TIM13_IRQHandler          ; TIM8 Update and TIM13                 
  63.                 DCD     TIM8_TRG_COM_TIM14_IRQHandler     ; TIM8 Trigger and Commutation and TIM14
  64.                 DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare                                   
  65.                 DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7                                          
  66.                 DCD     FSMC_IRQHandler                   ; FSMC                                            
  67.                 DCD     SDIO_IRQHandler                   ; SDIO                                            
  68.                 DCD     TIM5_IRQHandler                   ; TIM5                                            
  69.                 DCD     SPI3_IRQHandler                   ; SPI3                                            
  70.                 DCD     UART4_IRQHandler                  ; UART4                                          
  71.                 DCD     UART5_IRQHandler                  ; UART5                                          
  72.                 DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors                  
  73.                 DCD     TIM7_IRQHandler                   ; TIM7                  
  74.                 DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                                   
  75.                 DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                                   
  76.                 DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                                   
  77.                 DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                                   
  78.                 DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4                                   
  79.                 DCD     ETH_IRQHandler                    ; Ethernet                                       
  80.                 DCD     ETH_WKUP_IRQHandler               ; Ethernet Wakeup through EXTI line                     
  81.                 DCD     CAN2_TX_IRQHandler                ; CAN2 TX                                                
  82.                 DCD     CAN2_RX0_IRQHandler               ; CAN2 RX0                                               
  83.                 DCD     CAN2_RX1_IRQHandler               ; CAN2 RX1                                               
  84.                 DCD     CAN2_SCE_IRQHandler               ; CAN2 SCE                                               
  85.                 DCD     OTG_FS_IRQHandler                 ; USB OTG FS                                      
  86.                 DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5                                   
  87.                 DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6                                   
  88.                 DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7                                   
  89.                 DCD     USART6_IRQHandler                 ; USART6                                          
  90.                 DCD     I2C3_EV_IRQHandler                ; I2C3 event                                             
  91.                 DCD     I2C3_ER_IRQHandler                ; I2C3 error                                             
  92.                 DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End Point 1 Out                     
  93.                 DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End Point 1 In                       
  94.                 DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI                        
  95.                 DCD     OTG_HS_IRQHandler                 ; USB OTG HS                                      
  96.                 DCD     DCMI_IRQHandler                   ; DCMI                                            
  97.                 DCD     CRYP_IRQHandler                   ; CRYP crypto                                    
  98.                 DCD     HASH_RNG_IRQHandler               ; Hash and Rng
  99.                 DCD     FPU_IRQHandler                    ; FPU
  100.                                          
  101. __Vectors_End
 楼主| 梅花香自123 发表于 2023-10-18 15:45 | 显示全部楼层
void ***_isr(void)
void EXTI0_IRQHandler(void){}
 楼主| 梅花香自123 发表于 2023-10-18 15:46 | 显示全部楼层
说明:

无返回 无入口参数
普通函数 申明 定义 调用(主动)但是中断响应函数 CPU被动调用
中断响应函数的函数名必须和中断向量表中的一致
 楼主| 梅花香自123 发表于 2023-10-18 15:46 | 显示全部楼层
STM32F4xx 中断管理
任何中断产生到CPU响应,都要经过两个阶段:
 楼主| 梅花香自123 发表于 2023-10-18 15:46 | 显示全部楼层
1. 中断源的控制
中断源: 产生中断的设备。

设备要能够产生中断,必须有一根中断请求线(IRQ Line),而且这根中断请求线,必须连到嵌套中断控制器(NVIC,(Nested Vectored Interrupt Controller))
 楼主| 梅花香自123 发表于 2023-10-18 15:47 | 显示全部楼层
2. 中断控制器的控制 NVIC
对所有的中断输入引脚进行管理和控制,给CPU内核一个中断信号,通知CPU某设备产生中断。

一个设备产生了中断首先要经过 “中断源”这一级,“中断源”可以屏蔽或使能中断(disable/enable 自己的中断),即便是外部电路上产生了一个“事件”,中断源可以不向它上一级NVIC(中断控制器)报告。若“报告”:在NVIC的输入引脚上产生一个“跳变”。

中断控制器(NVIC)它也可以控制中断,它在收到外设的中断信号后,也可以选择enable/disable这个中断,意思是,它可以选择向它的上一级(CPU)报告或不报告。
 楼主| 梅花香自123 发表于 2023-10-18 15:48 | 显示全部楼层
四、STM32F4XX 外部中断
异常: CPU产生的,如:指令错误

中断: 外设(出CPU以外的设备)产生(UART I2C TIM GPIO)

外部中断: 指GPIO的外部电路上产生的中断 (如按键中断)

EXTI: external interrupt 外部中断

STM32F4的中断控制器支持23个外部中断/事件请求(EXTI0-EXTI22)

EXTI线0~15:对应外部IO口的输入中断 如:GPIOx.1映射到EXTI1

注意:一条中断线的在同一时间只能被一个IO口映射。

例子:S1-KEY0—PA0 —EXTI0–NVIC–CPU-EXTI0_IRQHandler
 楼主| 梅花香自123 发表于 2023-10-18 15:49 | 显示全部楼层
GPIO外部中断的路线图
71248652f8e03575e3.png

外部电路变化 -> 引脚电平变化 -> GPIO控制器 -> SYSCFG选择器-> EXTI外部中断控制器 -> NVIC中断控制器 -> CPU(Cortex M4)

GPIO控制器: 配置引脚为输入模式…

SYSCFG选择器: 选择GPIO引脚作为EXTIn的输入引脚

EXTI外部中断控制器: 边沿选择 中断屏蔽…


 楼主| 梅花香自123 发表于 2023-10-18 15:50 | 显示全部楼层
外部中断的代码实现
0. 按键原理图
首先查看按键原理图:


85036652f8e2092e61.png

可知:KEY0 -> PA0 -> EXTI0 -> NVIC -> CPU EXTI0_IRQHandler

​ KEY1 -> PE2 -> EXTI2 -> NVIC -> CPU EXTI2_IRQHandler

​ KEY2 -> PE3 -> EXTI3 -> NVIC -> CPU EXTI3_IRQHandler

​ KEY3 -> PE4 -> EXTI4 -> NVIC -> CPU EXTI4_IRQHandler
 楼主| 梅花香自123 发表于 2023-10-18 15:50 | 显示全部楼层
按下输出低电平,松开输出高电平,如果要按下检测电路,即选择下降沿选择寄存器
 楼主| 梅花香自123 发表于 2023-10-18 15:50 | 显示全部楼层
1. 中断源的控制
GPIO控制器的配置

时钟使能:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

GPIO_Init 配置(input mode)

GPIO_InitTypeDef p;
p.GPIO_Mode = GPIO_Mode_IN;  //输入模式
p.GPIO_OType = GPIO_OType_PP; //推挽
p.GPIO_Pin = GPIO_Pin_0;  //引脚编号
p.GPIO_PuPd = GPIO_PuPd_NOPULL; //无上拉、无下拉
p.GPIO_Speed = GPIO_Speed_50MHz;//输出速率50MHz
GPIO_Init(GPIOA, &p);   //初始化
p.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_Init(GPIOE, &p);
 楼主| 梅花香自123 发表于 2023-10-18 15:50 | 显示全部楼层
SYSCFG选择器的配置

时钟使能:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

选择相应的GPIO引脚作为外部中断的输入引脚:

SYSCFG_EXTILineConfig用来选择相应的GPIO引脚作为外部中断的输入引脚

void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);

EXTI_PortSourceGPIOx:选择GPIO口分组 如:EXTI_PortSourceGPIOA
EXTI_PinSourcex:选择引脚的编号 如:EXTI_PinSource0
例子:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
 楼主| 梅花香自123 发表于 2023-10-18 15:50 | 显示全部楼层
EXTI外部中断控制器的配置

EXTI_Init用来配置EXTI外部中断控制器(边沿选择、中断屏蔽,……)
 楼主| 梅花香自123 发表于 2023-10-18 15:51 | 显示全部楼层
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  EXTI Init Structure definition  
  3.   */
  4. typedef struct
  5. {
  6.   uint32_t EXTI_Line;               /*!< Specifies the EXTI lines to be enabled or disabled.
  7.                                          This parameter can be any combination value of [url=home.php?mod=space&uid=144993]@ref[/url] EXTI_Lines */
  8.    
  9.   EXTIMode_TypeDef EXTI_Mode;       /*!< Specifies the mode for the EXTI lines.
  10.                                          This parameter can be a value of @ref EXTIMode_TypeDef */

  11.   EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
  12.                                          This parameter can be a value of @ref EXTITrigger_TypeDef */

  13.   FunctionalState EXTI_LineCmd;     /*!< Specifies the new state of the selected EXTI lines.
  14.                                          This parameter can be set either to ENABLE or DISABLE */
  15. }EXTI_InitTypeDef;

 楼主| 梅花香自123 发表于 2023-10-18 15:51 | 显示全部楼层
/**
  * @brief  EXTI mode enumeration  
  */
typedef enum
{
  EXTI_Mode_Interrupt = 0x00,
  EXTI_Mode_Event = 0x04
}EXTIMode_TypeDef;
 楼主| 梅花香自123 发表于 2023-10-18 15:51 | 显示全部楼层
/**
  * @brief  EXTI Trigger enumeration  
  */
typedef enum
{
  EXTI_Trigger_Rising = 0x08,    //上升沿 指某个点的电位由低电位变成高电位的瞬间
  EXTI_Trigger_Falling = 0x0C,     //下降沿 指某个点的电位由高电位变成低电位的瞬间
  EXTI_Trigger_Rising_Falling = 0x10  //双边沿 两个状态都可以
}EXTITrigger_TypeDef;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1216

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部