STM32F10x外部中断EXTI

目录

一、EXTI是什么?

二、使用方法

1.功能框图及寄存器

2.库函数编程

总结



提示:以下是本篇文章正文内容,下面案例可供参考

一、EXTI是什么?

         EXTI(External interrupt/event controller)外部中断事件控制器,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。

二、使用方法

1.功能框图及寄存器

20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:

● 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)

● 设置软件中断寄存器的请求位(EXTI_SWIER)

当配置好软件中断事件寄存器为1时,当边沿检测电路触发为1,需配置软件中断事件寄存器,写1,将挂起寄存器置1,挂起位为1,即发生了选择的触发请求,再配置对应的中断和事件屏蔽寄存器,即可触发中断控制。

外部中断/事件外部映像

2.库函数编程

#include "exti.h"
#include "delay.h"
#include "beep.h"
#include "uart.h"

/**
  * @brief  This function is nvic config
  * @param  None
  * @retval None
  */

void nvic_config(void)
{ 

	NVIC_InitTypeDef nvic_initsturct;
	nvic_initsturct.NVIC_IRQChannel=EXTI0_IRQn;
   
    nvic_initsturct.NVIC_IRQChannelPreemptionPriority=0x02;
    nvic_initsturct.NVIC_IRQChannelSubPriority=0x03;
	 nvic_initsturct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&nvic_initsturct);
}
   



/**
  * @brief  This function is exti init
  * @param  None
  * @retval None
  */
void exti_init(void)
{
    EXTI_InitTypeDef exti_initsturct; 
    key_init();
	
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
   exti_initsturct.EXTI_Line=EXTI_Line0;
  
   exti_initsturct.EXTI_Mode=EXTI_Mode_Interrupt;
   exti_initsturct.EXTI_Trigger=EXTI_Trigger_Rising;
	 exti_initsturct.EXTI_LineCmd=ENABLE;
   EXTI_Init(&exti_initsturct);
	

nvic_config();

 
}
/**
  * @brief  This function is EXTI0_IRQHandler
  * @param  None
  * @retval None
  */

void EXTI0_IRQHandler(void)
{
	delay_ms(20);//消抖
	if(EXTI_GetITStatus(EXTI_Line0)!=RESET)//WK_UP按键
	{				 
		led1=!led1;
		printf("in exti");
		delay_ms(200);//消抖
		
	}
	EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
}


总结

EXTI编程步骤  1.初始化用来触发中断的GPIO

                         2.初始化EXTI结构体(需使能APB2Periph AFIO时钟,配置外部中断线Line)

                         3.配置NVIC中断优先级(先配置分组,后配置优先级)

                         4.配置中断服务函数EXTIX_IRQHandle

                         5.在中断服务函数中检测中断标志位,并在结束时清除中断标志位

在学习外部中断中遇到了一个坑,首先是笔者是把正点原子和野火的课程混听,跟着野火在触发的GPIO输入模式上选择了浮空输入,但是在正点原子的板子上,浮空输入无法触发中断,发现是因为当我正常按下按钮无法触发中断,当我用万用表去测量PA0的电压时,这是按下按钮,便可以正常触发中断,事后对这个现象进行了分析,是由于正点原子和野火在板子按钮的处理方式稍有些不同,野火在外部电路中接了下拉电阻,所以可以设置为浮空输入,而正点原子外部电路没有上下拉

所以需要将gpio设置为下拉输入。

正点原子

野火

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32中,可以使用外部中断来处理矩阵键盘的按键触发事件。外部中断/事件控制器(EXTI)是STM32F10x系列微控制器中的一个模块,它包含多达20个用于产生事件/中断请求的边沿检测器。每根输入线都可以单独进行配置,以选择中断或事件类型以及相应的触发事件(上升沿触发、下降沿触发或边沿触发)\[2\]。 为了处理矩阵键盘的外部中断,可以定义一个结构体来记录按键触发时的相关信息。例如,可以定义一个名为KEYBOARD_Typedef的结构体,其中包含active、x、y和num等字段。当按键触发时,active字段可以被置为1,x和y字段可以记录行列值,num字段可以记录最后的键值\[3\]。 通过配置外部中断和编写相应的中断服务函数,可以实现对矩阵键盘的外部中断处理。具体的实现方式和代码细节可能会因具体的STM32型号和开发环境而有所不同,建议参考相关的STM32开发文档和示例代码进行具体的配置和编程。 #### 引用[.reference_title] - *1* *3* [stm32以中断方式扫描矩阵键盘](https://blog.csdn.net/13011803189/article/details/126249580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【STM32】4*4矩阵键盘(外部中断触发方式)](https://blog.csdn.net/qq_52561717/article/details/120893098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值