当前位置: 首页 > web >正文

嵌入式按键原理、中断过程与中断程序设计(键盘扫描程序)

按键去抖动
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号波型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为
5ms~10ms。

低电平有效

  • CNFy=10 → 上拉/下拉输入模式。

  • MODEy=00 → 输入模式(忽略速度)。

 


 中断

从发展过程来看:
中断 (interrupt) 最初被用来替换 I/O 操作的轮询处理方式,以提高I/O 处理的效率。
随后,中断又包含了自陷 (trap ,也称为内部中断或是软件中断) 的功能。
后来,中断的概念得到进一步扩大,被定义为 导致程序正常执行流程发生改变的事件 ( 不包括程序的分支情况) 。可把概念被扩大的中断称为广义中断。
实际应用中,广义的中断通常被分为中断(Interrupt)、自陷 (Traps)和异常(exception)等类别。
中断 是由于 CPU 外部的原因而改变程序执行流程的过程,属于异步事件,又称为硬件中断。自陷和异常则为同步事件;
自陷 表示通过处理器所拥有的软件指令、可预期地使处理器正 在执行的程序的执行流程发生变化,以执行特定的程序。自陷是显式的事件,需要无条件地执行;
Motorola 68000 系列中的 Trap 指令
ARM 中的 SWI 指令
Intel 80x86 中的 INT 指令
异常 CPU 自动产生的自陷,以处理异常事件。
如被 0 除、执行非法指令和内存保护故障等。
异常没有对应的处理器指令,当异常事件发生时,处理器也需要无条件地挂起当前运行的程序,执行特定的处理程序

 STM32的中断

CM3 内核支持256 个中断,其中包含了16 个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32 只用了CM3 内核的一部分。
STM32 有 76 个中断 ,包括16 个内核中断和60 个可屏蔽中断,具有 16 级 可编程的中断 优先级
常用的就是这60 个可屏蔽中断,以下介绍的就是这60 个可屏蔽中断。
NVIC 是(Nested vectoredinterrupt controller,嵌套向量中断控制器);用于为中断分组,从而分配抢占优先级和响应优先级。
ISER[2]:ISER 全称是:Interrupt Set-Enable Registers, 这是一个 中断使能寄存器组 。上面说了STM32 的可屏蔽中断 只有 60 个 ,这里用了2 个32 位的寄存器,总共可以表示64 个中断。而STM32 只用了其中的前60 位。
ISER[0]的 bit0~bit31 分别对应中断0~31。ISER[1]的bit0~27对应中断32~59;这样总共60 个中断就分别对应上了。你要 使能某个中断,必须设置相应的ISER位为1 ,使该中断被使能(这里
仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。

 

IPR[15]:全称是:Interrupt Priority Registers,是一个 中断优先级控制的寄存器组 。这个寄存器组相当重要!STM32 的中断分组与这个寄存器组密切相关。
IPR 寄存器组由15 个32bit 的寄存器组成 ,每个可屏蔽中断占用8bit,这样总共可以 表示15*4=60 个可屏蔽中断 。刚好和STM32 的可屏蔽中断数相等。IPR[0]的[31~24], [23~16],[15~8],[7~0]分别对应中中断3~0,依次类推,总共对应60 个外部中断。

EXTI External interrupt/event controller 外部中断/ 事件控制器,管理了控制器的 20 个中断 /
事件线。每个中断 / 事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿
的检测。 EXTI 可以实现对每个中断 / 事件线进行单独配置,可以单独配置为中断或者事件,以及
触发事件的属性。
EXTI 支持配置 20 个中断和事件屏蔽位;
GPIO 端口连接到 16 个外部中断 / 事件线上 ;EXTI_Line0—EXTI_Line15
EXTI_Line16 连接到 PVD 输出 ;
EXTI_Line17 连接到 RTC 闹钟事件 ;
EXTI_Line18 连接到 USB 唤醒事件 ;
EXTI_Line19 连接到以太网唤醒事件 ( 只适用于互联型产品 );

 

 

 


STM32键盘中断编程
1 ) 初始化IO口为输入。
这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/ 下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。 在干扰较大的地方,就算使用了上拉/ 下拉,也建议使用外部上拉/ 下拉电阻,这样可以一定程度防止外部干扰带来的影响。
GPIOC->CRL&=0XFFFFF000;//PC0-2设置成输入   清零PC0、PC1、PC2的配置位
GPIOC->CRL|=0X00000888;  设置PC0、PC1、PC2为上拉/下拉输入
  • CNFy[1:0]=10:上拉/下拉输入模式。

  • MODEy[1:0]=00:输入模式(忽略输出速度)。

2 ) 开启IO口复用时钟,设置IO口与中断线的映射关系。
STM32 IO 口与中断线的对应关系需要配置外部中断配置寄存器 EXTICR ,这样我们要先开启复用时钟,然后配置 IO 口与中断线的对应关系。才能把外部中断与中断线连接起来。
RCC->APB2ENR|=1<<4; // 使能 PORTC 时钟
3 ) 开启与该IO口相对的线上中断/ 事件,设置触发条件。
这一步,我们要配置中断产生的条件, STM32 可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置,
同时要开启中断线上的中断。这里需要注意的是:如果使用外部中断,并设置该中断的EMR 位的话,会引起软件仿真不能跳 到中断,而硬件上是可以的。而不设置EMR ,软件仿真就可以
进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。
Ex_NVIC_Config(GPIO_C,0,FTIR); // 下降沿触发
Ex_NVIC_Config(GPIO_C,1,FTIR); // 下降沿触发
Ex_NVIC_Config(GPIO_C,2,FTIR); // 下降沿触发
4 ) 配置中断分组(NVIC),并使能中断。
这一步,我们就是配置中断的分组,以及使能,对 STM32 的中断来说,只有配置了NVIC 的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
5 ) 编写中断服务函数。
这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起 硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定
要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。
void EXTI0_IRQHandler(void)
{ …………
EXTI->PR=1<<0; //清除LINE0上的中断标志位
}

 

http://www.xdnf.cn/news/3911.html

相关文章:

  • chrome 浏览器怎么不自动提示是否翻译网站
  • C++ STL简介:构建高效程序的基石
  • SwinTransformer 改进:与PSConv结合的创新设计
  • 管理配置信息和敏感信息
  • 前端开发,文件在镜像服务器上不存在问题:Downloading binary from...Cannot download...
  • 在JSP写入Text文件方法指南
  • 【IP101】边缘检测技术全解析:从Sobel到Canny的进阶之路
  • 2023年第十四届蓝桥杯省赛B组Java题解【 简洁易懂】
  • Spark,Idea中编写Spark程序 2
  • 题解:AT_abc245_e [ABC245E] Wrapping Chocolate
  • Go语言中的无锁数据结构与并发效率优化
  • Circular Plot系列(三):【视频教程】复现NCS图表之高大上的单细胞UMAP环形图
  • process terminated with status -1073741515
  • 永久免费的Google Colab 入门指南
  • C语言——寻找子串
  • 动态规划--回文串问题
  • 【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
  • Vue常用优化
  • d3_v7绘制折线图
  • 启发式算法-遗传算法
  • C++ - 类和对象 #类的默认成员函数 #构造函数 #析构函数 #拷贝构造函数 #运算符重载函数 #赋值运算符重载函数
  • AI 入门:关键概念
  • 高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第四章 不定积分同步测试卷 B卷
  • n8n 快速入门1:构建一个简单的工作流
  • 强化学习机器人模拟器——GridWorld:一个用于强化学习的 Python 环境
  • unorder_map/set的底层实现---C++
  • ESP32S3 多固件烧录方法、合并多个固件为单一固件方法
  • LangChain4J-XiaozhiAI 项目分析报告
  • 线程间通信--线程间顺序控制
  • C++类_局部类