STM32学习记录--Day5

发布于:2025-08-02 ⋅ 阅读:(12) ⋅ 点赞:(0)

今天了解了:

中断

中断有多个类别包括: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为例:
  • 	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  • //#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()函数并清除中断标志。


网站公告

今日签到

点亮在社区的每一天
去签到