前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STM32的外部中断(以按键为例)

STM32的外部中断(以按键为例)

原创
作者头像
皓琦
发布2023-12-26 13:45:41
3070
发布2023-12-26 13:45:41
举报
文章被收录于专栏:STM32学习STM32学习

一、外部中断

1、外部中断介绍

外部中断一般用于接收外部特殊电平,比如红外线解码、倒车雷达(超声波)等其他外部信号,STM32的每个GPIO口都支持中断功能,上本文基于按键讲述外部中断功能。

2、外部中断的特性

EXTI控制器的主要特性如下:

● 每个中断/事件都有独立的触发和屏蔽

● 每个中断线都有专用的状态位

● 支持多达20个软件的中断/事件请求

● 检测脉冲宽度低于APB2时钟宽度的外部信号。参见数据手册中电气特性部分的相关参数。

3、外部中断/事件控制器框图(如图1所示)
图1 框图
图1 框图

要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。

4、外部中断/事件线路映像(给我们讲述了硬件线路怎么选择)

112通用I/O端口以如图2的方式连接到16个外部中断/事件线上:

图2 外部中断通用I/O映像
图2 外部中断通用I/O映像

外部中断线一共有16条中断线,PA0...PG0挂载在中断线0上,PA1...PG1挂载在中断线1等,通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟。

4、外部中断配置步骤

●GPIO口需要配置为输入模式

● 开启外设中断功能:打开指定的GPIO口中断功能;

● 配置中断产生的电平(边沿,包括上升沿:由低电平变为高电平,下降沿:由高电平变为低电平,双边沿将上升沿和下降沿放在一起);

● 配置中断的优先级。

二、代码实现

1、exti.c文件

代码语言:#include "exti.h"
复制
/*
函数功能: 配置外部中断(按键)
硬件连接:
		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文件

代码语言:#ifndef EXTI_H
复制
#define EXTI_H
#include "stm32f10x.h"
#include "key.h"
#include "usart.h"
void EXTI_Init(void);
#endif

3、main.c文件

代码语言:#include "stm32f10x.h"
复制
#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、实验现象

图3
图3
图4
图4

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、外部中断
    • 1、外部中断介绍
      • 2、外部中断的特性
        • 3、外部中断/事件控制器框图(如图1所示)
          • 4、外部中断/事件线路映像(给我们讲述了硬件线路怎么选择)
            • 4、外部中断配置步骤
            • 二、代码实现
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档