STM32学习记录--Day5

今天了解了:

中断

中断有多个类别包括:USART中断,I2C中断等;

并通过NVIC来分配中断的优先级

EXTI

EXTI的内部结构:

EXTI线

🔧 ​​一、EXTI系统核心架构​

1. ​​中断源输入(左上区域)​
  • ​GPIO引脚​
    支持最多4个GPIO端口(A/B/C/D)的引脚作为中断源。
    ​注意​:每个GPIO引脚都能触发中断。
  • ​信号合并​
    多个GPIO引脚通过 ​"多路选择器(MUX)"​ 汇合到一条EXTI线上。
    ​关键限制​​同一时间,每条EXTI线只能连接一个GPIO引脚!​
2. ​​中断线分配(中间黄色铃铛图标)​
  • ​EXTI线数量​
    共有​20条独立中断线​
    • EXTI0~EXTI15​16条通用线​(可分配给任意GPIO引脚)
    • EXTI16~EXTI19​4条专用线​(用于特定事件,如PVD、RTC闹钟等)
  • ​资源复用​
    EXTI0可同时被PA0、PB0、PC0、PD0使用,但只能选择其中一个。
3. ​​中断触发逻辑(右上区域)​
  • 每条EXTI线可独立配置​触发模式​
    • 上升沿触发(Rising Edge
    • 下降沿触发(Falling Edge
    • 双边沿触发(Both Edges
  • 中断信号最终传递到 ​NVIC(嵌套向量中断控制器)​,执行用户中断服务函数。

⚙️ ​​二、GPIO与EXTI的绑定规则​

1. ​​引脚号决定EXTI线号​
  • ​引脚0(如PA0/PB0)→ 绑定到EXTI0​
  • ​引脚1(如PA1/PB1)→ 绑定到EXTI1​
  • ...
  • ​引脚15(如PA15/PB15)→ 绑定到EXTI15​
2. ​​端口选择(通过AFIO寄存器配置)​
  • ​示例代码(STM32标准库)​
  • 以中断优先级分组2为例:
cpp 复制代码
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
cpp 复制代码
//#1.初始化PA5和PA6
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//PA5
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//PA6
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStruct);	
	
	//#2.为EXTI5和EXTI6分配引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
	
	//#3.初始化EXTI的线
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line5;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStruct);
	
	EXTI_InitStruct.EXTI_Line = EXTI_Line6;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStruct);
	
	//#4.配置NVIC
	NVIC_InitTypeDef NVIC_InitStruct;
	
	NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStruct);

⚠️ ​​三、重要设计约束​​​

  1. 专用中断线​​:

    • EXTI16:连接PVD(可编程电压检测)
    • EXTI17:连接RTC闹钟
    • EXTI18:连接USB唤醒事件
    • EXTI19:连接RTC入侵检测
      ​注意​:这些线无法分配给GPIO引脚。

💎 ​​四、总结与配置流程​

  1. ​硬件连接​ ​:

    确定要用作外部中断的GPIO引脚(如PA0)。

  2. ​EXTI线映射​ ​:

    根据引脚号选择EXTI线(如PA0 → EXTI0)。

  3. ​端口绑定​ ​:

    AFIO_EXTICR寄存器中设置EXTI0的信号源为GPIOA(而非GPIOB等)。

  4. ​中断参数配置​​:

    • 选择触发模式(上升沿/下降沿/双边沿)
    • 使能中断(EXTI->IMR寄存器)
    • 在NVIC中启用该EXTI线的中断请求
  5. ​实现中断服务函数​ ​:

    编写EXTI0_IRQHandler()函数并清除中断标志。