文章目录
- 一、EXTI寄存器
-
- [ 1.中断屏蔽寄存器(EXTI_IMR)](# 1.中断屏蔽寄存器(EXTI_IMR))
- [ 2.事件屏蔽寄存器(EXTI_EMR)](# 2.事件屏蔽寄存器(EXTI_EMR))
- [ 3.上升沿触发选择寄存器(EXTI_RTSR)](# 3.上升沿触发选择寄存器(EXTI_RTSR))
- [ 4.下降沿触发选择寄存器(EXTI_FTSR)](# 4.下降沿触发选择寄存器(EXTI_FTSR))
- [ 5.软件中断事件寄存器(EXTI_SWIER)](# 5.软件中断事件寄存器(EXTI_SWIER))
- [ 6.挂起寄存器(EXTI_PR)](# 6.挂起寄存器(EXTI_PR))
- [ 7.外部中断/事件寄存器映像](# 7.外部中断/事件寄存器映像)
- 二、ARIO寄存器
-
- [ 1.事件控制寄存器(AFIO_EVCR)](# 1.事件控制寄存器(AFIO_EVCR))
- [ 2.复用重映射和调试I/O配置寄存器(AFIO_MAPR)](# 2.复用重映射和调试I/O配置寄存器(AFIO_MAPR))
- [ 3.外部中断配置寄存器 1(AFIO_EXTICR1)](# 3.外部中断配置寄存器 1(AFIO_EXTICR1))
- [ 4.外部中断配置寄存器 2(AFIO_EXTICR2)](# 4.外部中断配置寄存器 2(AFIO_EXTICR2))
- [ 5.外部中断配置寄存器 3(AFIO_EXTICR3)](# 5.外部中断配置寄存器 3(AFIO_EXTICR3))
- [ 6.外部中断配置寄存器 4(AFIO_EXTICR4)](# 6.外部中断配置寄存器 4(AFIO_EXTICR4))
- 三、实例代码_外部中断(按键触发)
-
- [ 以 PA0 按键触发上升沿中断、翻转 PC13 LED 为例。](# 以 PA0 按键触发上升沿中断、翻转 PC13 LED 为例。)
一、EXTI寄存器
1.中断屏蔽寄存器(EXTI_IMR)
偏移地址:0x00
复位值:0x0000 0000

2.事件屏蔽寄存器(EXTI_EMR)
偏移地址:0x04
复位值:0x0000 0000

3.上升沿触发选择寄存器(EXTI_RTSR)
偏移地址:0x08
复位值:0x0000 0000

4.下降沿触发选择寄存器(EXTI_FTSR)
偏移地址:0x0C
复位值:0x0000 0000

5.软件中断事件寄存器(EXTI_SWIER)
偏移地址:0x10
复位值:0x0000 0000

6.挂起寄存器(EXTI_PR)
偏移地址:0x14
复位值:0xXXXX XXXX

7.外部中断/事件寄存器映像

二、ARIO寄存器
1.事件控制寄存器(AFIO_EVCR)
地址偏移:0x00
复位值:0x0000 0000

2.复用重映射和调试I/O配置寄存器(AFIO_MAPR)
地址偏移:0x04
复位值:0x0000 0000



3.外部中断配置寄存器 1(AFIO_EXTICR1)
地址偏移:0x08
复位值:0x0000


4.外部中断配置寄存器 2(AFIO_EXTICR2)
地址偏移:0x0C
复位值:0x0000

5.外部中断配置寄存器 3(AFIO_EXTICR3)
地址偏移:0x10
复位值:0x0000

6.外部中断配置寄存器 4(AFIO_EXTICR4)
地址偏移:0x14
复位值:0x0000

三、实例代码_外部中断(按键触发)
以 PA0 按键触发上升沿中断、翻转 PC13 LED 为例。
c
#include "stm32f10x.h"
/**
* @brief GPIO初始化:PA0(中断输入)、PC13(LED输出)
*/
void GPIO_Init_Exti(void)
{
// 1. 开启GPIOA、GPIOC、AFIO时钟(EXTI必须开启AFIO)
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
// 2. 配置PA0为下拉输入(按键按下→高电平)
GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0); // 清空模式/配置位
GPIOA->CRL |= GPIO_CRL_CNF0_1; // 下拉输入(CNF0[1:0]=10)
GPIOA->ODR &= ~GPIO_ODR_ODR0; // 下拉(ODR0=0)
// 3. 配置PC13为推挽输出(LED)
GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13); // 清空模式/配置位
GPIOC->CRH |= GPIO_CRH_MODE13_0; // 10MHz输出模式
GPIOC->ODR |= GPIO_ODR_ODR13; // 初始LED熄灭
}
/**
* @brief EXTI0中断配置(PA0触发)
*/
void EXTI0_Init(void)
{
// 1. 绑定PA0到EXTI0(AFIO_EXTICR1寄存器)
AFIO->EXTICR[0] &= ~AFIO_EXTICR1_EXTI0;
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
// 2. 配置上升沿触发
EXTI->RTSR |= EXTI_RTSR_TR0; // 开启上升沿触发
EXTI->FTSR &= ~EXTI_FTSR_TR0; // 关闭下降沿触发
// 3. 开启EXTI0中断请求(屏蔽位)
EXTI->IMR |= EXTI_IMR_MR0;
// 4. 配置NVIC(EXTI0对应6号中断通道)
SCB->AIRCR = 0x05FA0800; // 优先级分组2:2位抢占+2位子优先级
NVIC->IP[6] &= ~0xFF; // 清空优先级
NVIC->IP[6] |= 0x20; // 抢占优先级2,子优先级0(高4位有效)
NVIC->ISER[0] |= (1 << 6); // 使能6号中断
}
/**
* @brief EXTI0中断服务函数(必须与启动文件中名称一致)
*/
void EXTI0_IRQHandler(void)
{
// 检查中断标志位,避免误触发
if(EXTI->PR & EXTI_PR_PR0)
{
// 业务逻辑:翻转PC13 LED
GPIOC->ODR ^= GPIO_ODR_ODR13;
// 清除中断标志位(写1清除,关键!)
EXTI->PR |= EXTI_PR_PR0;
}
}
// 主函数
int main(void)
{
GPIO_Init_Exti();
EXTI0_Init();
while(1)
{
// 主循环无需处理,中断异步响应
}
}