STM32标准库开发中断流程

在STM32标准外设库(SPL)开发中,外设中断的处理流程通常如下:


一、标准库外设中断处理流程

(1)使能外设时钟

在使用任何外设之前,都必须打开外设的时钟。例如,使用USART1的中断,需先开启USART1和GPIO的时钟:

复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

(2)配置GPIO引脚模式(若需要)

外设的中断功能通常和GPIO引脚关联,例如USART引脚需要配置为复用功能模式:

复制代码
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              // TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             // RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  // 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);

(3)配置外设参数并打开外设中断

使用标准库提供的外设初始化结构,配置外设参数并使能中断。例如,USART接收中断:

复制代码
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

// 使能USART接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

// 使能USART外设
USART_Cmd(USART1, ENABLE);

(4)配置NVIC中断控制器

STM32的中断是由NVIC(Nested Vectored Interrupt Controller)统一管理的,因此要在NVIC中设置中断优先级并使能该中断:

复制代码
NVIC_InitTypeDef NVIC_InitStructure;

// 配置中断分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

// 配置USART1中断通道
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;           // USART1中断向量
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             // 中断使能
NVIC_Init(&NVIC_InitStructure);

(5)编写中断服务函数(ISR)

在标准库开发中,用户需要自己在main.c或者自定义文件中定义中断服务函数:

注意:ISR函数名必须和启动文件中定义的向量表名称一致。以USART1为例:

复制代码
void USART1_IRQHandler(void) 
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 检测接收中断标志
    {
        uint16_t data = USART_ReceiveData(USART1); // 读取接收到的数据
        // 用户处理代码,例如保存数据或发送给其他任务

        USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除中断标志
    }
}

二、完整的外设中断处理流程总结

标准库外设中断处理的完整流程可总结为:

  1. 使能外设和GPIO时钟RCC_APB2PeriphClockCmd()
  2. 配置GPIOGPIO_Init()
  3. 外设参数设置并使能外设中断 → 外设初始化函数,如USART_Init()USART_ITConfig()
  4. NVIC中断控制器配置NVIC_Init()
  5. 编写对应的中断服务函数(ISR) → 用户自行定义IRQHandler函数并处理对应的中断标志

三、注意事项:

  • 一定要确保中断服务函数(如USART1_IRQHandler())函数名与启动文件的中断向量表完全一致,否则中断无法进入。
  • 在ISR函数中,及时清除中断标志位,否则中断会反复进入(死循环)。
  • ISR中尽量简短高效,不要进行耗时操作,可用标志位或者缓冲区传递数据给主程序处理。

以上为STM32标准外设库(SPL)外设中断的标准处理流程,开发时可遵循该流程确保中断功能正常稳定运行。

相关推荐
Zyed1 小时前
[STM32]Day14独立看门狗+窗口看门狗
stm32·单片机·嵌入式硬件
H__Rick1 小时前
C51学习-DAY7
单片机·嵌入式硬件·学习·51单片机
济6171 小时前
BMS系统专栏:认知电池管理系统BMS的知识与功能
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
欢乐熊嵌入式编程1 小时前
第2讲:什么是优秀的软件架构?
stm32·单片机·freertos·低功耗蓝牙·嵌入式架构·efr32
嵌入式ZYXC1 小时前
第9篇:《面试题:ADC前端为什么要加运放跟随器?什么情况下可以不加?》
stm32·单片机·嵌入式硬件·面试·职场和发展
DS小龙哥2 小时前
基于STM32设计的电动车智能充电计费系统
stm32·单片机·嵌入式硬件
普中科技2 小时前
【普中STM32F1xx开发攻略--标准库版】-- 第 49 章 FLASH 字库实验
stm32·单片机·嵌入式硬件·flash·gbk·字库·普中科技
kyle~2 小时前
机器人日志系统
c++·单片机·嵌入式硬件·机器人·ros2
踏着七彩祥云的小丑2 小时前
嵌入式测试学习第 34 天:常见bug类型:死机、重启、数据错乱、通信丢包
单片机·嵌入式硬件·学习
一个嵌入式学徒2 小时前
STM32+ESP8266 接入机智云平台完整步
stm32·单片机·嵌入式硬件