6.4 STM32F103c8t独立按键功能深入剖析(神舟51+ARM)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Bit3
0x2200_0008
跨度一个字 = 4 个字节 = 32 个 bit
Bit4
0x2200_000C
跨度一个字 = 4 个字节 = 32 个 bit
Bit5
0x2200_0010
跨度一个字 = 4 个字节 = 32 个 bit
Bit6
Байду номын сангаас
0x2200_0014
跨度一个字 = 4 个字节 = 32 个 bit
5. 如何用代码与位带操作挂钩
在 STM32 中,一个寄存器是 32 位的,32 个 bit 中的任意其中一个 bit 所对应的 别名空间到底该如何访问呢?首先分为两种情况,一种是在 SRAM,一种是在 FLASH 中,两个别名空间的起地位置是不同的,SRAM 是从 0x2200_0000 开始,而 FLASH 是从 0x4200_0000 开始。
这样呢,1MB SRAM 就可以 32M 个对应别名区空间,就是 1 位膨胀到 32 位(1bit 变 为 1 个字);我们对这个别名区空间开始的某一字操作,置 0 或置 1,就等于它映射的 SRAM 或 I/O 相应的某地址的某一位的操作。
4. STM32 中位带操作的具体部署情况是 支持位带操作的两个内存区的范围是:
从 0 开始计数到 31 截止,所以第 14bit 相当于是第 13。
可以从下图看到,GPIO 端口 B 的起始地址是 x04001_0C00,GPIOB_BSRR 寄存器的偏 移地址是 0x10,访问的第 14bit 位的 BS13。
那么通过公式:
FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 换算 0x4200_0000 + ((0x40010c00-0x40000000)*8 + 12)*4 = 实际地址 在这里我们就不具体计算了,SRAM 访问也是同理
从上图可看出,理想波形与实际波形之间是有区别的,为什么呢?因为实际波形在按下 和释放的瞬间会有抖动现象出现,这是因为通常的按键所用开关为机械弹性开关,当机械触 点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通, 在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,抖动时间的 长短和按键的机械特性有关,一般为 5~l0ms。为了不产生这种现象而作的措施就是按键消 抖。通常我们手动按下键然后立即释放,这个动作中稳定闭合的时间超过 20ms。因此单片 机在检测键盘是否按下时都要加上去抖动操作。
6.1.2 按键属性
键盘实际上就是一组按键,在单片机外围电路中,通常用到的按键都是机械弹性开关, 当开关闭合时,线路导通,开关断开时,线路断开,下图是几种单片机系统常见的按键:
弹性小按键被按下时闭合,松手后自动断开;自锁式按键按下时闭合且会自动锁住,只 有再次按下时才弹起断开。
单片机的外围输入控制用小弹性按键较好,单片机检测按键的原理是:单片机的 I/O 口 既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,我们把按键的一端接 地,另一端与单片机的某个 I/O 口相连,开始时先给该 I/O 口赋一高电平,然后让单片机不 断地检测该 I/O 口是否变为低电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连, 变成低电平,程序一旦检测到 I/O 口变为低电平则说明按键被按下,然后执行相应的指令。
6.4 独立按键............................................................................................................................2 6.1.1 按键的分类.......................................................................................................2 6.1.2 按键属性...........................................................................................................2 6.1.3 STM32 的位带操作..........................................................................................3 6.1.4 例程 01 STM32 芯片按键点灯(无防抖)....................................................8 6.1.5 例程 02 STM32 芯片按键点灯-增加了防抖的代码.....................................14
消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。按键的消抖,可用硬 件或软件两种方法,硬件的去抖主要是用专用的去抖动电路,也有专用的去抖动芯片;另外 一种方式就是用软件延时的方法就能很容易解决抖动问题,而没有必要再添加多余的硬件电 路。所以软件消抖适合按键比较多的情况,而硬件消抖适合按键比较少的情况。
3. 如何设计和实现位带操作的? 从编程者这个角度来说,我们操作的对象是一个一个的 bit 位,而对于 STM32 来说,它
内内部只能是 32 位 bit 每次的访问。如果要实现这个技术,必须要做一个映射,也就是从 1 个 bit 映射到 32 个 bit,就是用 STM32 内部的一次访问(32 个 bit)来代表编程者认为的 1 个 bit。
实现方法:一般来说,软件消抖的方法是不断检测按键值,直到按键值稳定。假设检测 到按键按下之后,为了避免检测到很多的抖动,可以先延时 5ms~10ms,再次检测,如果 按键还被检测按下,那么就认为有一次按键输入(因为如果不避开抖动的话,会有很多次按 键输入信号出现,通过去抖,模拟人的按下的过程和时间,按下和松开按键实际也占用了 20ms 以上的时间,记录正确的按键次数。
假如在 SRAM 中的一个寄存器的地址是 A,访问寄存器 A 中的第 n 个 bit 位。 那么该如何计算呢?我们知道 SRAM 中别名区的起始地址是 0x2200_0000 对应 SRAM 中实际寄存器地址 0x2000_0000,SRAM 中每 1 个 bit,都会对应别名区中的 32 个 bit,那么实际地址的公式应该如下:
序号 支持位带操作的两个内存区的范围
1
SRAM 区中的最低 1MB:
0x2000_0000-0x200F_FFFF
2
片上外设区中的最低 1MB:
0x4000_0000-0x400F_FFFF
下面是内部空间映射图:
对应的别名区空间范围 SRAM 所对应的别名区 32MB 空间: 0x2200_0000-0x23FF_FFFF 片上外社区所对应的别名区 32MB 空间: 0x4200_0000-0x43FF_FFFF
6.4 独立按键 6.1.1 按键的分类
目前,按键有多种形式。有机械接触式,电容式,轻触式等。 1. 按制作工艺分: 硬板按键:带弹簧的按键焊接在印刷电路板上 软板键盘:以导电橡胶作为接触材料放在以聚脂薄膜作为基底的印刷电路上所形成的按 键。
2. 按工艺原理分: 可以将键盘分为编码键盘和非编码键盘,编码键盘的键盘电路内包含有硬件编码器,当 按下某—个键后,键盘电路能直接提供与 该键相对应的编码信息,例如 ASCII 码。 非编 码键盘的键盘电路中只有较简单的硬件,采用软件来识别按下键的位置,并提供与按下 键 相对应的中间代码送主机,然后由软件将中间代码转换成相应的字符编码,例如 ASCII 码; 非编码键盘主要靠软件编程来识别的,在单片机组成的各种系统中,用的较多的是非编码键 盘。非编码键盘又分为独立键盘和行列式(又称矩阵式)键盘。
(A‐0x20000000)*8+n 好了,最后整理整个换算公式如下,FLASH 与 SRAM 的原理都是想通的: SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4
6. 举例说明: 比如我要访问如下寄存器 GPIOB_BSRR 中的第 14bit 位 BS13,注意因为寄存器内部是
例如:SRAM 区中的最低 1MB 空间中的 0x2000_0000 的 8 个 bit,分别对应如下:
地址
对应的 bit 位
别名空间
Bit 对应的别名空间
0x2000_00000
Bit1
0x2200_0000
跨度一个字 = 4 个字节 = 32 个 bit
Bit2
0x2200_0004
跨度一个字 = 4 个字节 = 32 个 bit
那 STM32 内部是如何解决的呢?它是在支持位带操作的地方,取个别名区空间,而这 个别名区空间可以让一次 32 位来进行访问,对这个别名进行操作就相当于对 SRAM 或者 I/O 存储空间中的位(1 个寄存器里的位就是 1 个 bit,1 个 bit 最后对应别名区空间的 32 个位, 因为 STM32 芯片内部只能是 32 位去访问)进行操作。
外设空间实现对这些区域的某一位的单独直接操作。
2. 为什么要用位带操作? 那么 51 单片机中间不是有位的操作吗,而 STM32 为什么要提出位带的操作呢?首先,
这里不得不提一个事情就是 STM32 的内部区域访问只能是 32 位的字,不能是字节或者半 字,这部分 STM32 在神舟开发板手册的 GPIO 章节中提到过;而 51 单片机里一个 bit(一 个字节等于 8 个 bit,一个字是 32 个 bit)。这个是 STM32 的特点决定的,所以 STM32 使 用一种新型的方式来解决这个问题,设计一个办法来解决用一次访问 32bit 的这样的操作达 到 51 单片机那种只访问一个 bit 的效果。
6.1.3 STM32的位带操作
1. 什么是位带操作 还记得 51 单片机吗? 单片机 51 中也有位的操作,以一位(BIT)为数据对象的操作;
例如 51 单片机可以简单的将 P1 端口的第 2 位独立操作,P1.2=0 或者 P1.2=1,就是这样把
P1 口的第三个脚(bit2)置 0(输出低电平)或者置 1(输出高电平)。 而现在 STM32 的位段、位带别名区这些就是为了实现这样的功能,可以在 SRAM、I/O
Bit7
0x2200_0018
跨度一个字 = 4 个字节 = 32 个 bit
Bit8
0x2200_001C
跨度一个字 = 4 个字节 = 32 个 bit
可以看到上表和上图,0x2000_0000 中的一个 bit 位对应了别名区的一个 32 位的字,也
就是说 STM32 芯片的内部寄存器的任意一个位,都其实对应的是别名区的 32 个位。
如果按键较多,就用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正 有键按下。当检测到按键释放后,也要给 5ms~10ms 的延时,待后沿抖动消失后才能转入 该键的处理程序,这样就靠软件模拟整个按键的过程,控制只取最稳定的那个按键状态。
那么接下来” SRAM 实际寄存器地址偏移 0x2000_0000 的 bit 数”该如何计算呢? 对,用寄存器的地址减去这个基地址,然后在乘以 8(因为一个地址对应 8 个 bit), 所以就可以得到以下的公式:
(A‐0x20000000)*8 以上这个公式可以知道实际寄存器离基地址有多少个 bit 的距离,访问该寄存器的第 n 个 bit 位还必须加上一个 n,就变成以下的公式:
0x2200_0000 + (SRAM 实际寄存器地址偏移 0x2000_0000 的 bit 数)* 4 因为 0x2200_0000 这个地址每增加 1,实际上就是增加 8 个 bit(一个地址对应 一个字节),实际寄存器中的 1 个 bit 对应 32 个 bit,所以就乘以 4,地址本身增加 1 是 8bit,8bit 乘以 4 倍刚好是 32bit。
相关文档
最新文档