外部中断通用I/O映像
中断处理函数分配
EXTI寄存器一览
以下图片全部摘自STM32中文参考手册
中断屏蔽寄存器(EXTI_IMR)
往对应的位写1就是开启中断,写0就是关闭中断
例如开放来自线0上的中断请求
EXTI->IMR|=1<<0;//开放来自线0上的中断请求
事件屏蔽寄存器(EXTI_EMR)
参考**中断屏蔽寄存器(EXTI_IMR)**的操作
上升沿触发选择寄存器(EXTI_RTSR)
设置对应的外部中断触发事件为上升沿
上升沿就是电平从0到1
例如允许输入线0上的上升沿触发
EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发
下降沿触发选择寄存器(EXTI_FTSR)
设置对应的外部中断触发事件为下降沿
下降沿就是电平从1到0
例如允许输入线0上的下降沿触发
EXTI->FTSR|=1<<0;//允许输入线0上的下降沿触发
软件中断事件寄存器(EXTI_SWIER)
对应位写1则触发中断
挂起寄存器(EXTI_PR)
这个寄存器和SR寄存器差不多,都是检查相应的中断是否发生,不同的是清除的方式
外部中断配置寄存器 1(AFIO_EXTICR1)
外部中断配置寄存器 2(AFIO_EXTICR2)
外部中断配置寄存器 3(AFIO_EXTICR3)
外部中断配置寄存器 4(AFIO_EXTICR4)
实例操作
这里我们开启外部中断线0上的PA0
步骤
1)开启PA的时钟,配置IO
RCC->APB2ENR|=1<<2;//使能PA时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0配置清零
GPIOA->CRL|=0X00000008;//PA0下拉输入
GPIOA->ODR|=0<<0;//PA0下拉
2)开启复用时钟,设置 IO 口与中断线的映射关系
RCC->APB2ENR|=1<<0;//开启复用辅助时钟
AFIO->EXTICR[0]&=~(0XF<<0);//清除原来的设置
AFIO->EXTICR[0]|=0<<0;//外部中断0映射到PA0上
特别注意这里的AFIO->EXTICR寄存器的编号
3)开启外部中断线上中断,设置触发条件
EXTI->IMR|=1<<0;//开放来自线0上的中断请求
EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发
4)配置中断分组(NVIC),并使能中断
MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2
5)编写中断服务函数
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
delay_ms(10); //消抖
if(GPIOA->IDR&1<<0) //PA0按下
{
LED1=!LED1;
}
EXTI->PR=1<<0; //清除线0上的中断标志位
}
源文件
EXTI.C
#include "EXTI.h"
#include "delay.h"
#include "led.h"
void exti_init(void)
{
RCC->APB2ENR|=1<<2;//使能PA时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0配置清零
GPIOA->CRL|=0X00000008;//PA0下拉输入
GPIOA->ODR|=0<<0;//PA0下拉
RCC->APB2ENR|=1<<0;//开启复用辅助时钟
AFIO->EXTICR[0]&=~(0XF<<0);//清除原来的设置
AFIO->EXTICR[0]|=0<<0;//外部中断0映射到PA0上
EXTI->IMR|=1<<0;//开放来自线0上的中断请求
EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发
MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2
}
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
delay_ms(10); //消抖
if(GPIOA->IDR&1<<0) //PA0按下
{
LED1=!LED1;
}
EXTI->PR=1<<0; //清除线0上的中断标志位
}
EXTI.H
#ifndef __EXTI_H
#define __EXTI_H
#include "sys.h"
void exti_init(void);
#endif
MAIN.C
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "EXTI.h"
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化为115200
led_init(); //LED初始化
exti_init(); //EXTI初始化
while(1)
{
LED0=!LED0; //LED0用来指示程序正在运行
delay_ms(200);
}
}
结果
LED0(红灯)闪烁,代表程序正在运行
按下PA0之后,PA0电平由0变到1,LED1亮(绿灯)
上一篇:STM32F4 GPIO(一)
下一篇:【STM32】HAL库-DAC
推荐阅读最新更新时间:2024-11-16 21:41
设计资源 培训 开发板 精华推荐
- 使用 Microchip Technology 的 TC38C46COE 的参考设计
- EVAL-AD7792EBZ,AD7792 评估板,16 位,470SPS,用于热电偶的 3CH ADC
- AM3GH-2412SZ 12V DC/DC转换器的典型应用
- LTC4077 演示板、双输入 USB/AC 适配器锂离子电池充电器
- AD8037-EBZ,具有 AD8037 宽带宽、低失真钳位放大器的评估板
- 用于工业 HB LED 照明的 7-LED 高亮度 LED 驱动器
- LTC2992HMS-1 双向 30V 至 300V 高侧功率监视器的典型应用
- ADA4062-4ARUZ运算放大器用作陷波滤波器电路的典型应用电路
- PIC16F1509 太阳能 LED 安全灯
- 使用 ROHM Semiconductor 的 BD45261 的参考设计