嵌入式ARM架构学习7——时钟、定时器

发布于:2025-09-14 ⋅ 阅读:(24) ⋅ 点赞:(0)

 一、什么是抖动(Bouncing)

当按键按下或松开时,金属触点不是理想瞬间接触/断开,而是机械振动,导致电平在短时间内反复跳变,这就是抖动

  • 抖动时间:通常为 5μs ~ 10ms,劣质按键甚至更长

  • 结果:MCU 会误认为按键被多次按下/松开

二、硬件层面消除抖动

方法 原理 优点 缺点
RC 低通滤波 + 施密特触发器 用电容吸收高频抖动,施密特触发器整形 简单、成本低 电容值需匹配,响应变慢
专用消抖芯片 / 施密特触发器芯片 硬件整形,直接输出干净信号 稳定可靠 增加成本
按键换型 使用霍尔按键光学按键等无触点开关 无抖动 成本高

⚠️ 注意:单独加电容(不加施密特触发器)效果不好,因为电容充放电本身也会引入缓慢上升沿,反而容易被 MCU 误判为多次电平变化。


 三、软件层面消除抖动(最常用)

1. 延时采样法(延时消抖)
if (key_read() == 0) {          // 首次检测到按下
    delay_ms(10);               // 延时 10ms
    if (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=1MByte

4.GPT(General Purpose Timer):通用目的定时器
    输入捕获和比较输出
    实验:利用自由运行模式编写精准延时函数
    
    1、什么是PLL,Prescaler、FPD,它们各自有什么作用?
    2、IMX6ULL中有几个PLL?几个PFD?
    3、简述ARM PLL的配置流程
    4、IMX6ULL中的EPIT和GPT的工作原理是什么?


网站公告

今日签到

点亮在社区的每一天
去签到