LPC1752 定时计数器#

详情请参阅 LPCxx用户手册 的第21章

../../_images/%E5%AE%9A%E6%97%B6%E8%AE%A1%E6%95%B0%E5%99%A8%E5%9F%BA%E6%9C%AC%E5%8A%9F%E8%83%BD.svg

注意

计数模式下不能捕获,输入捕获不能在计数模式

定时计数器操作流程#

  1. 系统控制寄存器(LPC_SC) 中的 外设功率控制寄存(PCONP) 使能定时计数器。 详见 LPCxx用户手册 的第4.8.9小节

  2. 配置 计数器控制寄存器 来设置定时计数器的工作模式及时钟源。 详见 LPCxx用户手册 的第21.6.3小节

  3. 配置 预分频计数器寄存器 来设置定时计数器的工作时钟分频值,实际分频为该寄存器值+1。 内核时钟(CCLK)先经过 系统控制寄存器(LPC_SC) 中的 外设时钟选择寄存器(PCLKSEL) 分频后得到外设时钟(PCLK)。 再经过该寄存器分频的时钟还是定时计数器的实际工作时钟。

    如果 PCLK_TIMER0 = CCLK/4 , PR = 11 :

    CCLK = 48MHz
    PCLK = 48MHz/4 = 12MHz
    CLK = 12MHz/12 = 1MHz

    定时计数器的实际工作时钟为1MHz

  4. 匹配输出:
    • 配置 匹配寄存器(MR) 的值

    • 配置 匹配控制寄存器(MCR) 当匹配发生时是: 中断 , 复位 还是 停止

    • 配置 外部匹配寄存器(EMR) 当匹配发生时 MATx.x 对应的变化信号。 若要输出该信号到引脚的话,则需要将引脚内跟该信号连接

    捕获输入:

    待补全

  5. 设置 定时器控制寄存器使能 位来启动或停止定时计数器

示例代码#

#define TIM_0_PRESCALE              12
#define TIM_0_MATCH_1               156
#define TIM_0_EXTEND_MATCH_OUTPUT   0
CCLK = 48MHz
PCLK = CCLK/4 = 48MHz/4 = 12MHz
CLK = PCLK/TIM_0_PRESCALE = 12MHz/12 = 1MHz
此时如果匹配值为: 156则每隔156us MAT0.1 电平发生1次翻转, 此时 MAT0.1 的周期为312us,其上升沿的频率为: 1000000us/312us = 3205.128205128205 Hz = 3.205 KHz
../../_images/%E5%AE%9A%E6%97%B6%E8%AE%A1%E6%95%B0%E5%99%A8%E5%BC%95%E8%84%9A%E8%BE%93%E5%87%BA.svg
 1void TIM_0_init(void)
 2{
 3       // 开启TIM0外设时钟
 4       LPC_SC->PCONP |= (1 << 1);
 5       // 定时器工作在定时模式,在PCLK的上升沿计数器值增加
 6       LPC_TIM0->CTCR = 0;
 7       // 设置定时器的分频值
 8       LPC_TIM0->PR = TIM_0_PRESCALE - 1;
 9       // 设置匹配寄存器1的值
10       LPC_TIM0->MR1 = TIM_0_MATCH_1 - 1;
11       // 当匹配1发生时计数器复位
12       LPC_TIM0->MCR = 1 << (1 * 3 + 1);
13       // 匹配1发生时MAT0.1引脚发生翻转,MAT0.1引脚初始值为0
14   LPC_TIM0->EMR = 3 << (1 * 2 + 4);
15
16       #if TIM_0_EXTEND_MATCH_OUTPUT
17       // 如果要输出MAT0.1信号,则将P1.29跟MAT0.1连接
18       PIN_Configure(PinMAT0_1.Portnum,PinMAT0_1.Pinnum,PIN_FUNC_3,PIN_PINMODE_TRISTATE,PIN_PINMODE_NORMAL);
19       #endif
20}
定时计数器0复位#
 1static void TIM_0_reset(void)
 2{
 3       uint32_t reg = LPC_TIM0->TCR;
 4    // 设置计数器的控制寄存器的复位位,计数器在下一个上升沿开始复位
 5    LPC_TIM0->TCR = 1 << 1;
 6    // 复位时TC,PC值都会归零
 7    LPC_TIM0->TC = 1;
 8    // 等待复位完成
 9    while (LPC_TIM0 ->TC);
10    // 恢复计数器原来的使能状态
11    LPC_TIM0->TCR = reg;
12}
定时计数器0启停#
 1void TIM_0_start(void)
 2{
 3       TIM_0_reset();
 4       // 使能TM0计数开始计数
 5       LPC_TIM0->TCR = 1;
 6}
 7
 8void TIM_0_stop(void)
 9{
10       LPC_TIM0->TCR &= ~1U;
11}