STM32_外部中断_寄存器操作

文章目录

  • 一、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)
	    {
	        // 主循环无需处理,中断异步响应
	    }
	}
相关推荐
Saniffer_SH2 小时前
【高清视频】AI服务器调试利器:PCIe功耗分析设备 Quarch PAM 深度解析
网络·人工智能·驱动开发·嵌入式硬件·测试工具·计算机外设·压力测试
安庆平.Я2 小时前
STM32——FreeRTOS - 任务创建和删除*
stm32·单片机·嵌入式硬件
BT-BOX10 小时前
第三章|新建STM32CubeMX工程生成keil工程和proteus联调仿真
stm32·嵌入式硬件·proteus
forAllforMe11 小时前
用STM32+LAN9252, 生成一个etherCAT 从机系统,实现数据采集功能
网络·stm32·嵌入式硬件
yezhailiaoke12 小时前
【CANoe测试系列】-程控电源控制
单片机·嵌入式硬件
-Springer-15 小时前
STM32 学习 —— 个人学习笔记9-2(USART串口数据包 & 串口收发 HEX 及 文本 数据包)
笔记·stm32·学习
白掰虾16 小时前
一分钟上手STM32CubeMX2——STM32C5点灯
stm32·单片机·嵌入式硬件·stm2cubemx2·stm32c5
YY_Share16 小时前
为什么笔记本电脑电源适配器基本是19V供电
嵌入式硬件·电路设计
宁静致远202117 小时前
Cadence Allegro 17.4的neck模式(瓶颈模式)走线
嵌入式硬件·硬件