某系统中利用定时器/计数器О进行系统定时,完成下面各部分内容(Fpclk=11.0592MHZ)。 (1)定时器通过系统时钟实现TC累加,达到定时记数的目的,请画出定时器的基本计数框图。 (2)写出定时器时钟为2分频,实现定时1秒时长的定时器初始化程序。 (3)写出定时器时钟不分频的情况下,每两秒时长利用外部匹配О实现匹配输出为方波的初始化程序。 (4)写出定时器时钟为不分频,测量下图脉冲宽度的程序段。
时间: 2024-02-13 09:01:15 浏览: 95
计时程序,采用定时器
5星 · 资源好评率100%
1. 定时器的基本计数框图如下所示:
```
+---------+ +------+
Fpclk -| PCLKSEL |-|--> PCLK | |
+---------+ | | +------------+
+-->| TC |-->| |
| | | Counter |
+------+ | |
+------------+
```
定时器的计数器 TC 通过 PCLKSEL 寄存器选择的时钟源 PCLK 进行累加,从而实现定时计数的目的。
2. 定时器时钟为2分频,实现定时1秒时长的定时器初始化程序如下所示(假设定时器为 TIMER0):
```
// 使能 TIMER0 的时钟
PCLKSEL0 |= (1 << 2);
// 将 TIMER0 的时钟分频系数设置为 2
TIMER0_PR = 1;
// 将 TIMER0 的计数器清零
TIMER0_TC = 0;
// 将 TIMER0 的匹配寄存器 MR0 设置为 1 秒钟的计数值
TIMER0_MR0 = 11059200;
// 将 TIMER0 的匹配控制寄存器 MCR 设置为清空计数器和产生中断
TIMER0_MCR = (1 << 1) | (1 << 0);
// 使能 TIMER0 的中断
NVIC_EnableIRQ(TIMER0_IRQn);
// 启动 TIMER0
TIMER0_TCR = (1 << 0);
```
3. 定时器时钟不分频的情况下,每两秒时长利用外部匹配О实现匹配输出为方波的初始化程序如下所示(同样假设定时器为 TIMER0):
```
// 使能 TIMER0 的时钟
PCLKSEL0 |= (1 << 2);
// 将 TIMER0 的计数器清零
TIMER0_TC = 0;
// 将 TIMER0 的匹配寄存器 MR0 设置为计数值为 Fpclk * 2 秒的计数值
TIMER0_MR0 = 22118400;
// 将 TIMER0 的匹配控制寄存器 MCR 设置为清空计数器和产生外部匹配信号
TIMER0_MCR = (1 << 1) | (1 << 4);
// 使能 TIMER0 的外部匹配信号
PINSEL1 |= (1 << 12);
// 启动 TIMER0
TIMER0_TCR = (1 << 0);
```
4. 定时器时钟为不分频,测量脉冲宽度的程序段如下所示:
```
// 使能 TIMER0 的时钟
PCLKSEL0 |= (1 << 2);
// 将 TIMER0 的计数器清零
TIMER0_TC = 0;
// 等待上升沿触发
while ((FIO0PIN & (1 << 0)) == 0);
// 将 TIMER0 的匹配寄存器 MR0 设置为计数值为 0xFFFFFFFF,即最大值
TIMER0_MR0 = 0xFFFFFFFF;
// 将 TIMER0 的匹配控制寄存器 MCR 设置为清空计数器和产生中断
TIMER0_MCR = (1 << 1) | (1 << 0);
// 使能 TIMER0 的中断
NVIC_EnableIRQ(TIMER0_IRQn);
// 启动 TIMER0
TIMER0_TCR = (1 << 0);
// 等待中断触发
while (!timer0_interrupt_flag);
// 关闭 TIMER0
TIMER0_TCR = 0;
// 测量脉冲宽度
pulse_width = TIMER0_CR0;
```
注意,以上代码仅供参考,具体实现方式可能因芯片型号、开发环境等因素而异。
阅读全文