嵌入式ARM架构学习7——时钟、定时器
一、什么是抖动(Bouncing)
当按键按下或松开时,金属触点不是理想瞬间接触/断开,而是机械振动,导致电平在短时间内反复跳变,这就是抖动。
抖动时间:通常为 5μs ~ 10ms,劣质按键甚至更长
结果:MCU 会误认为按键被多次按下/松开
二、硬件层面消除抖动
方法 | 原理 | 优点 | 缺点 |
---|---|---|---|
RC 低通滤波 + 施密特触发器 | 用电容吸收高频抖动,施密特触发器整形 | 简单、成本低 | 电容值需匹配,响应变慢 |
专用消抖芯片 / 施密特触发器芯片 | 硬件整形,直接输出干净信号 | 稳定可靠 | 增加成本 |
按键换型 | 使用霍尔按键、光学按键等无触点开关 | 无抖动 | 成本高 |
⚠️ 注意:单独加电容(不加施密特触发器)效果不好,因为电容充放电本身也会引入缓慢上升沿,反而容易被 MCU 误判为多次电平变化。
三、软件层面消除抖动(最常用)
1. 延时采样法(延时消抖)
if (key_read() == 0) { // 首次检测到按下delay_ms(10); // 延时 10msif (key_read() == 0) { // 再次确认// 真正按键按下}
}
优点:简单、通用
缺点:阻塞 CPU(可用非阻塞方式优化)
2. 状态机法(非阻塞)
typedef enum {KEY_UP,KEY_DOWN,KEY_CONFIRM
} KeyState;KeyState key_scan(KeyState state) {switch (state) {case KEY_UP:if (key_read() == 0) return KEY_DOWN;break;case KEY_DOWN:if (key_read() == 0) {delay_ms(10);if (key_read() == 0) return KEY_CONFIRM;}return KEY_UP;case KEY_CONFIRM:if (key_read() == 1) return KEY_UP;break;}return state;
}
优点:非阻塞,适合主循环轮询
缺点:占用少量状态变量
3. 定时器采样法(最推荐)
每 1ms 进入一次定时器中断,读取按键电平
连续 N 次(如 8 次)稳定为同一电平,才认为有效
可实现“消抖 + 长按/短按/双击”等复杂逻辑
四 时钟树:
五、定时器:
定时器 (EPIT GPT):是一个通过对已知频率的时钟信号进行计数,来实现定时、延时或事件计数功能的硬件模块或软件机制。
时钟(clock):在电子系统中是一个产生稳定、周期性振荡信号的电路或组件。这个信号像节拍器或心跳一样,为数字电路中的各种操作提供同步时序基准。
实时时钟(RTC real time clock): 是微处理器中的一个功能模块,用于在系统主电源关闭的情况下,继续提供精确的日历和时间信息。
1.硬件概念
(1)时钟源:晶体整荡器:
工作做原理:将石英晶体切割成音叉,施加电压,会产生稳定的震荡。
(2)PLL(phase locked loop)锁相环电路: 倍频
(3)Prescale 分频器: 分频
(4)PFD(phase fractional Prescale)相位分数分频器: 输出频率可升可降2.代码编写
(1)kernal: CCM_ANALOG_PLL_ARMn
(1)先选择osc_clk,让step_clk为24MHz
(2)再将PLL1的输出改成step_clk,让ARM暂时工作在24MHz;
(3)配置PLL为1056,注意设置倍频因子之前先把PLL之后的二分频设置好,避免ARM内核故障!!
(4)最后改回pll1_main_clk
(2)528 PLL:CCM_ANALOG_PFD_528n
(3)480 PLL:CCM_ANALOG_PFD_480n
(4)AHB_CLK_ROOT(132M)
CBCMR[PRE_PERIPH_CLK_SEL]
CBCDR[PERIPH_CLK_SEL]
CBCDR[AHB_PODF](5)IPG_CLK_ROOT(66M)
CBCDR[IPG_PODF](6)PERCLK_CLK_ROOT(66M)
CSCMR1[PERCLK_CLK_SEL]
CSCMR1[PERCLK_PODF]
六、通用目的定时器
51单片机2两个定时器timer1、timer2
1.51单片机定时器工作原理
8位可自动重装,16位中段服务程序中手动重装。
(EPIT):
2.i.max6ull定时器工作原理
3.EPIT(Enhanced Periodic Interrupt Timer):增强型周期中断定时器
实验:1s中断,中断服务函数中反转led灯频率计算时1000*1000=1MHz
存储计算时1024*1024=1MByte4.GPT(General Purpose Timer):通用目的定时器
输入捕获和比较输出
实验:利用自由运行模式编写精准延时函数
1、什么是PLL,Prescaler、FPD,它们各自有什么作用?
2、IMX6ULL中有几个PLL?几个PFD?
3、简述ARM PLL的配置流程
4、IMX6ULL中的EPIT和GPT的工作原理是什么?