STM32中断处理名和中断处理函数名及中断处理函数所在文件

本文介绍了STM32F103系列的中断处理,强调了其中断名和处理函数名在库函数中的固定命名规则。中断名位于stm32f10x.h的IRQn_Type枚举中,中断处理函数名可在startup_stm32f10x_xd.s文件的特定行找到,而这些函数实际实现通常在stm32f10x_it.c文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌入式之路,贵在日常点滴

                                                                ---阿杰在线送代码

  STM32中断名和中断处理函数名在库函数中有固定命名,我们不可以像51单片机一样随机定义。 本文我们以STM32F103系列为例:

中断名其所在位置为stm32f10x.h中的IRQn_Type(167行)枚举中,比如


/**
 * @brief STM32F4XX Interrupt Number Definition, according to the selected device 
 *        in @ref Library_configuration_section 
 */
typedef enum IRQn
{
/******  Cortex-M4 Processor Exceptions Numbers ****************************************************************/
  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                                          */
  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M4 Memory Management Interrupt                           */
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M4 Bus Fault Interrupt                                   */
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M4 Usage Fault Interrupt                                 */
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M4 SV Call Interrupt                                    */
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M4 Debug Monitor Interrupt                              */
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M4 Pend SV Interrupt                                    */
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M4 System Tick Interrupt                                */
/******  STM32 specific Interrupt Numbers **********************************************************************/
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                                         */
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt                         */
  TAMP_STAMP_IRQn             = 2,      /*!< Tamper and TimeStamp interrupts through the EXTI line             */
  RTC_WKUP_IRQn               = 3,      /*!< RTC Wakeup interrupt through the EXTI line                        */
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                                            */
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                              */
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                              */
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                              */
  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                              */
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                              */
  DMA1_Stream0_IRQn           = 11,     /*!< DMA1 Stream 0 global Interrupt                                    */
  DMA1_Stream1_IRQn           = 12,     /*!< DMA1 Stream 1 global Interrupt                                    */
  DMA1_Stream2_IRQn           = 13,     /*!< DMA1 Stream 2 global Interrupt                                    */
  DMA1_Stream3_IRQn           = 14,     /*!< DMA1 Stream 3 global Interrupt                                    */
  DMA1_Stream4_IRQn           = 15,     /*!< DMA1 Stream 4 global Interrupt                                    */
  DMA1_Stream5_IRQn           = 16,     /*!< DMA1 Stream 5 global Interrupt                                    */
  DMA1_Stream6_IRQn           = 17,     /*!< DMA1 Stream 6 global Interrupt                                    */
  ADC_IRQn                    = 18,     /*!< ADC1, ADC2 and ADC3 global Interrupts                             */
 
#if defined (STM32F40_41xxx)
  CAN1_TX_IRQn                = 19,     /*!< CAN1 TX Interrupt                                                 */
  CAN1_RX0_IRQn               = 20,     /*!< CAN1 RX0 Interrupt                                                */
  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                                */
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                                */
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                                     */
  TIM1_BRK_TIM9_IRQn          = 24,     /*!< TIM1 Break interrupt and TIM9 global interrupt                    */
  TIM1_UP_TIM10_IRQn          = 25,     /*!< TIM1 Update Interrupt and TIM10 global interrupt                  */
  TIM1_TRG_COM_TIM11_IRQn     = 26,     /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                                    */
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                             */
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                             */
  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                             */
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                              */
  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                              */
  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                              */
  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                              */
  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                             */
  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                             */
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                                           */
  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                                           */
  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                                           */
  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                                   */
  RTC_Alarm_IRQn              = 41,     /*!< RTC Alarm (A and B) through EXTI Line Interrupt                   */
  OTG_FS_WKUP_IRQn            = 42,     /*!< USB OTG FS Wakeup through EXTI line interrupt                     */
  TIM8_BRK_TIM12_IRQn         = 43,     /*!< TIM8 Break Interrupt and TIM12 global interrupt                   */
  TIM8_UP_TIM13_IRQn          = 44,     /*!< TIM8 Update Interrupt and TIM13 global interrupt                  */
  TIM8_TRG_COM_TIM14_IRQn     = 45,     /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */
  TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                                    */
  DMA1_Stream7_IRQn           = 47,     /*!< DMA1 Stream7 Interrupt                                            */
  FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                             */
  SDIO_IRQn                   = 49,     
### STM32中断函数规则与示例 STM32的中断服务函数名称遵循固定的命约定,这些函数名通常在启动文件中预先定义好。对于每一个外设,其对应的中断服务程序称由`PPP_IRQHandler`构成,其中`PPP`表示具体的外设称[^1]。 #### 中断服务函数规则 - **通用格式**: `XXX_IRQHandler` - `XXX` 是具体外设的字缩写,例如定时器(TIM)、串口(USART)、外部中断线(EXTI)等。 - **举例说明** - 定时器1 的中断服务函数名为 `TIM1_IRQHandler`。 - USART1 的中断服务函数名为 `USART1_IRQHandler`。 - 外部中断线4 的中断服务函数名为 `EXTI4_IRQHandler`[^2]。 #### 示例代码分析 以下是几个典型的中断服务函数实现: ##### 外部中断线4 (`EXTI4`) ```c void EXTI4_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line4) == SET) { // 检查中断标志位是否被设置 EXTI_ClearITPendingBit(EXTI_Line4); // 清除中断挂起位 for (uint8_t i = 0; i < 5; i++) { // 执行特定操作 LED_FLASH(); } } } ``` ##### 外部中断线5至9 (`EXTI9_5`) ```c void EXTI9_5_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line5) == SET) { // 检查中断标志位是否被设置 EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断挂起位 for (uint8_t i = 0; i < 5; i++) { // 执行特定操作 LED3_FLASH(); } } } ``` 上述代码展示了如何通过检查中断状态并清除相应的中断标志来完成中断处理逻辑。 #### 中断优先级配置结构体 为了更好地管理中断优先级,在初始化过程中可以使用NVIC的结构体进行配置。以下是一个简单的NVIC初始化结构体定义: ```c typedef struct { uint8_t NVIC_IRQChannel; /*!< 配置要使能或禁用的IRQ通道 */ } NVIC_InitTypeDef; ``` 此结构体中的成员变量用于指定需要启用或者关闭的具体中断源[^4]。 #### 抢占优先级与子优先级的关系 关于中断优先级的概念,需要注意的是抢占优先级决定了当前正在执行的任务能否被打断;而响应优先级则是在相同抢占级别下决定哪个任务会先被执行。当两个中断具有不同的抢占优先级时,较高抢占级别的中断能够打断较低抢占级别的中断运行;如果两者抢占优先级一致,则依据各自的响应优先级顺序依次执行[^5]。 ### 总结 综上所述,STM32系列微控制器中的中断服务函数采用统一的标准命方式,并且可以通过修改启动文件内的向量表来自定义映射关系。同时合理规划各中断之间的优先级有助于构建高效稳定的嵌入式应用系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值