使用定时器10产生100ms的定时,定时器时钟TIM_CLK为100M。说明PSC和ARR的计算过程,并编程实现。
时间: 2024-12-21 20:28:38 浏览: 0
在使用定时器10产生100毫秒定时时,我们通常涉及到的是51单片机系列的定时器配置。对于100MHz的时钟(TIM_CLK),我们需要调整预分频器(Prescaler, PSC)和自动重装载寄存器(Auto Reload Register, ARR)。
PSC是用来将主时钟频率分频到定时器的工作频率的,它决定了定时器计数器每增加一次所需的时间周期数。假设我们想要得到100ms的定时,由于1s = 1000ms,所以我们需要大约10次计数,也就是1000 * 10 = 10000个时钟周期。由于主时钟是100MHz,我们需要将这个数值除以主时钟频率来确定PSC值。计算公式大致是:
\[ PSC = \frac{10000}{100000000} \]
然后取整因为PSC通常是8位无符号数,所以需要向下取整。比如如果计算结果是0.10001,那么PSC就设置为1。
ARR则是设定定时器的最大计数值,在溢出后会自动重新加载到ARR的值开始计数。同样,我们也需要大约10000个时钟周期。但由于有些系统可能会有一些额外的操作时间,通常我们会稍微放大这个值,比如设为10001。
在编程实现上,这通常涉及以下几个步骤:
```c
// 定义定时器相关的寄存器地址
#define TMOD 0x87 // T0模式控制寄存器
#define TH0 0x89 // 高8位定时初值寄存器
#define TL0 0x8A // 低8位定时初值寄存器
#define PCON 0x8F // 片选控制寄存器
void initTimer10_100ms() {
// 设置定时器工作于模式1(T1模式),定时/计数功能,计数从TH0和TL0开始
PCON |= (1 << 6); // 设置TMOD的GATE位
TMOD &= ~(1<<0);
// 计算并设置PSC和ARR
uint16_t prescale = (100000000 / 10000) - 1; // 下取整
TH0 = 0; // 初始化高8位计数器
TL0 = prescale & 0xFF; // 低8位填入PSC值
TH0 = prescale >> 8;
// 开启定时器
TIMSK |= (1 << OCIE0); // 开启定时器中断请求
}
void main() {
initTimer10_100ms();
while(1);
}
```
阅读全文