Cortex-M0系列 ~ 外部中断
STM32的每个I/O都可以作为外部中断的中断输入口,每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。这里使用的外部中断来检测按键,下面是相关配置代码~
void EXTIX_Init()
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* Enable Button(GPIOA) clock 使能I/O口时钟*/ RCC_AHBPeriphClockCmd(User_Button_GPIO_CLK, ENABLE);/* Enable SYSCFG clock 使能系统时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//I/O口配置为输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 外部中断配置 */SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource3);EXTI_InitStructure.EXTI_Line = EXTI_Line3;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);/* 中断优先级配置 */NVIC_InitStructure.NVIC_IRQChannel = EXTI2_3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
初始化对I/O口,外部中断线,中断优先级做配置,接着还要编写中断服务函数,A8,M3,M4等都可以自己在中断初始化配置时自定义中断服务函数名,而在M0中只能直接调用库函数给我们准备好的中断函数名。
//上面我们用的是A3脚,所以是触发EXTI2_3_IRQHandler函数
void EXTI2_3_IRQHandler(void)
{//检测中断位状态if(EXTI_GetITStatus(EXTI_Line3) != RESET){//产生中断时的对应操作Key_Flag = true;Key_Value1 = 1;//产生中断,清除中断位EXTI_ClearITPendingBit(EXTI_Line3);}
}
EXTI2_3_IRQHandler()
函数为 EXTI_Line2
、 EXTI_Line3
中断线共用,即是PA2、PA3是共用同一个中断服务函数,类似的 EXTI4_15_IRQHandler
是中断线4-15的中断服务函数,这里就有个疑问了,这么多中断线都是跑同一个函数,那要怎么区分不同中断线的操作呢?!细心的朋友可能已经找到答案了~ if(EXTI_GetITStatus(EXTI_Line3) != RESET)
进入中断服务函数后都会先进行一个 if 判断,即检测该中断线是否发生中断,例如我设置了PA2、PA3为两外部中断,那么我的中断服务函数应该是这么写,I/O初始化那些的另行配置
void EXTI2_3_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line2) != RESET){//code//产生中断,清除中断位EXTI_ClearITPendingBit(EXTI_Line2);}if(EXTI_GetITStatus(EXTI_Line3) != RESET){//code//产生中断,清除中断位EXTI_ClearITPendingBit(EXTI_Line3);}
}
4-15的中断也是一样的道理,还有注意一点就是中断函数中不要调用延时函数,中断是一个很快的操作,在其中加入延时会引发不必要的错误,可以是修改变量的状态来达到某个目的,但需要考虑项目耦合性。
总结一下使用I/O口外部中断的一般步骤:
- 定义结构体,使能I/O、系统时钟
- 初始化I/O口为输入
- 初始化线上中断,设置触发条件等
- 配置中断分组(NVIC),并使能中断
- 编写中断服务函数
Cortex-M0系列 ~ 外部中断相关推荐
- STC89C52的四个 外部中断 基本使用方法
1. STC89C52中断系统 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的.STC89C52系列单片机提供了8个中断请求源,它们分别是: 外部中断0(NT0): 对应I/O :P32 ...
- STM32 基础系列教程 3 – 外部中断
前言 学习stm32 GPIO 的外部中断使用,用中断模式实现简单的按键输入功能,用按实现基础实验二中的LED亮灭切换功能! 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的 ...
- 基于Cortex M0+的STM32L0系列简介
L0系列是意法半导体于2014年新推出的超低功耗的MCU,基于ARM Cortex M0+内核.目前有STM32L0x1,STM32L0x2,STM32L0x3三个子系列,默认主频为32M,RAM都是 ...
- 32位ARM®Cortex®-M0+内核单片机 XL32F003系列MCU
XL32F003系列微控制器采用高性能的32位ARM®Cortex®-M0+内核,宽电压工作范围的MCU.嵌入高达64 Kbytes flash和8 Kbytes SRAM存储器,最高工作频率32 M ...
- STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)
STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...
- zigbee CC2530 系列教程 5 外部中断实验
所有课程见此链接: zigbee CC2530 系列教程 0 课程介绍 4.4外部中断实验 4.4.1 实验目的 了解使用外部中断的方法,在中断处理函数中切换LED的状态. 4.4.2 实验讲解 首先 ...
- 【单片机学习笔记】(31):串口调试技巧、TFT触摸屏初识别、stm32F4与F1对比使用(全系列初始化概览)、YSF4的光耦隔离保护、外部中断与定时器消抖相结合的按键检
串口调试技巧 可以将调试时会用到,但实际演示是不需要用到的代码用 #if xxx //这里放调试代码 #endif xxx是 一个宏定义,如果等于0则不编译相关代码,如果为1则编译相关代码 TFT ...
- S32K系列S32K144学习笔记——GPIO外部中断
一用S32K144苦似海,道友,能不用,千万不去用. 本例程基以下如图所示接口操作,MCU为S32K144,开发平台S32DSworkspace 功能描述:检测信号输入,如有低电平信号输入,则亮灯,无 ...
- PIC18F系列单片机外部中断
PIC18F系列单片机外部中断 以外部中断0为例,代码如下 void INTx_Init (void)//外部中断 {TRISBbits.TRISB0 = 1;INTCON2bits.INTEDG0 ...
最新文章
- Fragment里面嵌套Fragment注意事项
- 【深度学习入门到精通系列】Recurrent和Residual解释
- 如何快速融入一家公司
- HTML之六:图像的热区连接
- python的异常处理
- 让MySql支持Emoji表情(MySQL中4字节utf8字符保存方法)
- 容器性能比无容器服务器,【译】容器 vs 无服务器(Serverless)
- ocx控件 postmessage消息会消失_APP控件之二——弹框
- python秒转换成小时分钟秒_仅需1秒!搞定100万行数据:超强Python数据分析利器...
- 自己的父母,能把钱交给他们存吗?
- 语音合成论文和英伟达撞车,韩国小哥紧急放出全部草稿代码和样本 | 资源帖...
- 批量修改图片的后缀名格式
- 解决夜神模拟器设置了代理后无法上网
- android 国际区号注册手机号编码 以及常用城市列表
- Oracle 12C新特性总结
- Vue3——Suspense组件
- 最好的投资是投资自己:20本投资书单推荐
- APP第三方安全检测
- Signal protocol 开源协议理解
- 数据结构-----引论
热门文章
- Python Flask 搭建微信小程序后台详解
- SpringBoot AOP 记录操作日志、异常日志
- 【hexo系列】02.hexo和obsidian实现笔记丝滑
- 华为机试:找到比自己强的人数
- mac笔记本的触控板多次触发滚轮事件 mousewheel
- Python 计算与伪造TCP序列号
- LDA计算 perplexity(困惑度)确定主题个数(代码)
- M - Mediocre String Problem Gym - 101981M
- 百度编辑器(UEditor)自定义工具栏
- major头文件_关于C++中使用头文件gdal_priv.h