[STM32F1] stm32f103rct6的中断配置

[复制链接]
52|0
Puchou 发表于 2025-10-12 21:39 | 显示全部楼层 |阅读模式
EXTI (Extern Interrupt) 外部中断

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

支持的触发方式:上升沿/下降沿/双边沿/软件触发

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

(1) 不同端口、同一pin口,共用一个中断线:如PA1、PB1、PC1共用外部中断线1——EXTI_Line1;

(2) 同一pin口共用一个中断线,但16个中断线却只共用7个中断服务函数:其中中断线EXTI_Line0-4独立拥有一个中断服务,中断线5-9共用一个中断服务函数,中断线10-15共用一个中断服务函数。

GPIO_PIN不能相同:PA1和PB1不行,PA6和PA7可以,PA9和PB15可以,PB0和PB1可以

1369568e9bf4d3c7f7.png

stm32的每个IO都可以作为外部中断输入,中断控制支持19个外部中断或事件请求

中断线0~15:外部IO口的输入中断;

线16:连接PVD事件;  

线17:连接RTC闹钟事件;

线18:连接到USB唤醒事件。

stm32F10有112个IO口,每个IO映射到外部中断线的关系如下所示:

112通用I/O端口以下图的方式连接到16个外部中断/事件线上:

3500768e9bf45b5c2a.png

7958168e9bf3f2d063.png

外部中断通用I/O映像

30768e9bf2e891f1.png

(图源于《STM32F10XXX参考手册》)

如上图,GPIO_PIN相同的gpio共用了一个中断线。

GPIOX.0映射到EXTI0  (X可以是A.B.C.D.E.F.G),0到15个EXTI 每组ABCDEFG7个IO口。
但是不是每个中断线都对应一个中断函数,IO口外部中断向量表中只有7个中断向量,即7个中断服务函数,见下表:

7973068e9bf24795e4.png

从此外部中断向量表中可以看出:5~9中断线公用一个中断服务函数,10~15公用一个。

中断线和中断服务之间的关系

  DCD     EXTI0_IRQHandler           ; EXTI Line 0
  DCD     EXTI1_IRQHandler           ; EXTI Line 1            
  DCD     EXTI2_IRQHandler           ; EXTI Line 2
  DCD     EXTI3_IRQHandler           ; EXTI Line 3
  DCD     EXTI4_IRQHandler           ; EXTI Line 4
  DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
  DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10

附:DCD EXTI0_IRQHandler 是STM32启动文件(例如startup_stm32f10x_hd.s)中用于中断向量表初始化的指令,用于将外部中断0(EXTI0)的中断服务函数(ISR)地址映射到处理器可识别的入口点。

注意:不可以同时配置PA6和PA8触发外部中断

因为EXTI_Line6和EXTI_Line8是共用一个中断服务函数的,那触发EXTI_Line6和触发EXTI_Line8就进同一个中断服务函数了

解决方案:

进服务函数之后,判断是哪根中断线触发的就行:

if(ITStatus EXTI_GetITStatus(EXTI_Line6)){
中断线6程序+清标志位6


if(ITStatus EXTI_GetITStatus(EXTI_Line8)){
中断线8程序+清标志位8


常用库函数:
1、设置IO与中断线的映射关系 :GPIO_EXTILineConfig(GPIO_PortSource, GPIO_PinSource)
2、初始化中断线配置:EXTI_Init(EXTI_InitTypeDef *EXTI_InitStructure)
typedef struct{EXTI_Line, EXTI_Mode, EXTI_Trigger, EXTI_LineCmd)
3、判断中断线的中断状态是否发生 :EXTI_GetTStatus(EXTI_Line)
4、清除中断标志:EXTI_ClearTPendingBit(EXTI_Line)
外部中断配置步骤:
1、初始化IO输入:GPIO_Init()
2、开启IO复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)   这个时钟必须开启
3、设置IO与中断线的映射关系:GPIO_EXTILineConfig()
4、初始化:EXTI_Init()
5、配置中断分组NVIC:NVIC_Init()
6、中断服务函数:EXTI_IRQHandler()
7、清除中断标志位:EXTI_CleatTPendingBit()
————————————————
版权声明:本文为CSDN博主「哄娃睡觉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ddidi111/article/details/151722458

您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

270

帖子

0

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