外部中断一般用于接收外部特殊电平,比如红外线解码、倒车雷达(超声波)等其他外部信号,STM32的每个GPIO口都支持中断功能,上本文基于按键讲述外部中断功能。
EXTI控制器的主要特性如下:
● 每个中断/事件都有独立的触发和屏蔽
● 每个中断线都有专用的状态位
● 支持多达20个软件的中断/事件请求
● 检测脉冲宽度低于APB2时钟宽度的外部信号。参见数据手册中电气特性部分的相关参数。
要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。
112通用I/O端口以如图2的方式连接到16个外部中断/事件线上:
外部中断线一共有16条中断线,PA0...PG0挂载在中断线0上,PA1...PG1挂载在中断线1等,通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟。
●GPIO口需要配置为输入模式
● 开启外设中断功能:打开指定的GPIO口中断功能;
● 配置中断产生的电平(边沿,包括上升沿:由低电平变为高电平,下降沿:由高电平变为低电平,双边沿将上升沿和下降沿放在一起);
● 配置中断的优先级。
1、exti.c文件
/*
函数功能: 配置外部中断(按键)
硬件连接:
WK_UP=PA0
硬件特性: WK_UP,按下为高电平,KEY0,KEY1按下为低电平
*/
void EXTI_Init(void)
{
/*1. 配置GPIO为输入模式*/
KEY_Init();
/*2. 开放中断线的中断请求功能*/
EXTI->IMR|=1<<0; //外部中断线0
/*3. 配置触发中断的边沿信号*/
EXTI->FTSR|=1<<0; //中断线0_下降沿
EXTI->RTSR|=1<<0; //中断线0_上升沿
/*4. 开启AFIO时钟*/
RCC->APB2ENR|=1<<0;
/*5. 配置具体产生中断请求的GPIO口*/
AFIO->EXTICR[0]&=~(0xF<<0*4); //PA0
/*6. 设置外部中断线的优先级*/
STM32_SetPriority(EXTI0_IRQn,NVIC_PriorityGroup_2,2,2);
}
/*
函数功能: 外部中断线0 服务函数
*/
void EXTI0_IRQHandler(void)
{
if(WK_UP)
{
printf("按键WK_UP按下!\n");
LEDO=0;
LED1=0;
}
//清除中断线0上的中断请求
EXTI->PR|=1<<0;
}
2、exti.h文件
#define EXTI_H
#include "stm32f10x.h"
#include "key.h"
#include "usart.h"
void EXTI_Init(void);
#endif
3、main.c文件
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "exti.h"
#include "usart.h"
#include "string.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main(void)
{
KEY_Init();//按键初始化
LED_Init();//LED初始化
EXTI_Init();
USARTx_Init(USART1,72,115200);
USARTx_Init(USART2,36,9600);
USARTx_Init(USART3,36,115200);
while(1)
{
LED0=1;
LED1=1;
}
}
4、实验现象
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。