GPIO中断编程

1、目标

实现KEY1中断,按下、松开按键,串口输出相应信息。

2、原理图

(1)按键:使用PA0引脚

(2)串口不是重点,略

3、配置GPIO

(1)使能GPIO;配置PA0为输入模式。

4、配置SYSCFG(系统配置控制器)

(1)系统配置控制器主要用于管理对可执行代码的存储区域的地址重映射、选择以太网 PHY 接口以及管理 GPIO 的外部中断线连接。

(2)将PA0映射到EXTI0。

(3)注意:STM32F1中GPIO与外部中断的映射配置是通过AFIO模块;STM32F4中是通过SYSCFG模块。

5、配置EXTI

(1)配置EXTI_RTSR、EXTI_FTSR,选择中断触发方式

(2)配置EXTI_IMR:允许EXTI发出中断

(3)清除中断

6、配置NVIC

(1)配置NVIC中的寄存器,允许NVIC把中断发给CPU。

(2)多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。 处理中断时,程序可以写NVIC的寄存器,清除中断。

7、程序

(1)GPIO 和 SYSCFG的配置

复制代码
void key_init(void)
{
    unsigned int *pReg = NULL;
   
    pReg = (unsigned int *)(0x40023800 + 0x30);
    *pReg |= (0x01 << 0);                        /* 使能GPIOA时钟 */
  
    pReg = (unsigned int *)(0x40020000 + 0x00);
    *pReg &= (~(0x03 << 0));                     /* 配置PA0为输入模式 */

    /* 将PA0映射到EXTI0 */
    pReg = (unsigned int *)(0x40013800 + 0x08);  /* SYSCFG_EXTICR1 */
    *pReg &= ~(0x0F << 0);                       /* 清除EXTI0[3:0] */
    *pReg |= (0x00 << 0);                        /* 选择PA0作为EXTI0输入源 */    
}

(2)EXTI配置

复制代码
void exti_init(void)
{
    EXTI_TypeDef *pReg = NULL;
    pReg = (EXTI_TypeDef *)(0x40013C00 + 0x00);
    
    /* 配置EXTI0为双边沿触发 */
    pReg->RTSR |= (0x01 << 0);   /* 使能上升沿触发 */
    pReg->FTSR |= (0x01 << 0);   /* 使能下降沿触发 */

    pReg->IMR |= (0x01 << 0);                     /* 使能EXTI0中断 */
}

(3)NVIC配置

复制代码
void nvic_init(void)
{
    NVIC_Type *pReg = NULL;
    pReg = (NVIC_Type *)(0xE000E100);
    pReg->ISER[0] = (0x01 << 6);                 /* 使能EXTI0中断 */
}

(4)CPU

复制代码
CPSIE I  ; 清除PRIMASK,使能中断

(5)中断程序

复制代码
void EXTI0_IRQHandler(void)
{
    unsigned int *pReg = (unsigned int *)(0x40020000 + 0x10);
    
    if ((*pReg &(1<<0)) == 1)
    {
        puts("KEY1 pressed.\r\n");                    
    }
    else
    {
        puts("KEY1 released.\r\n");
    } 
      
    pReg = (unsigned int *)(0x40013C00 + 0x14);   /* EXTI_PR */
    *pReg |= (0x01 << 0);                         /* 清除EXTI0的挂起位 */

    pReg = (unsigned int *)(0xE000E100 + 0x180);  /* NVIC_ICPR[0] */
    *pReg |= (0x01 << 6);                         /* 清除NVIC的挂起位 */

    /* 注:NVIC_ICPRx 软件写1,用于手动清除挂起位 */
}

(6)NVIC说明

  • 若中断产生但并没有立即执行(例如有一个更高优先级的中断再处理),中断就会被挂起;
  • 挂起位可以软件清零或者软件设置;
  • NVIC 中 中断执行后,其挂起位会被硬件自动清零
相关推荐
zlinear数据采集卡6 分钟前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
bobuddy29 分钟前
CMW500信令测试关键配置要点
嵌入式硬件
花花鱼1 小时前
TinyML Agent:MCU 上的微型智能体,AI 智能体下沉的底层实现
人工智能·单片机·嵌入式硬件
lsz1525901 小时前
嵌入式开发第一步:STM32 F1系列功能介绍与快速上手
stm32·单片机·嵌入式硬件·嵌入式开发·可扩展模块
橘色的喵1 小时前
SD 卡在上电后的完整加载流程:从中断信号到文件系统挂载
单片机·嵌入式硬件·嵌入式·rt-thread·rtos
2CM_Embed10 小时前
Altium Designer 原理图与 PCB 快速相互定位:Cross Probe 交叉探针
嵌入式硬件·pcb·altium designer·c2000
恒锐丰-罗生11 小时前
宽压大电流同步降压优选|CN3906 DC-DC 电源芯片,车载 / 工控 / IoT 全能供电方案
嵌入式硬件·硬件工程
happygrilclh14 小时前
STM32,串口单字节中断接受,每次上电后,会收到一个0x00的解决办法。
单片机·嵌入式硬件
智闲电子设计16 小时前
STM32 独立看门狗 IWDG 实战:系统跑飞,它来兜底复位
stm32·单片机·嵌入式硬件
zcmodeltech17 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类