0

我正在使用 SDCC 编译器。

我想要实现的是在其自己的中断处理程序期间以模式 2 自动重新加载重新配置 Timer0。这是C代码:

void reconf(void)  __interrupt(1){
    TR0=0;
    TH0=0xC0;
    TL0=0xC0;
    TR0=1;
}

以下是问题:

  1. 在 Timer0 自己的中断处理程序执行期间,是否可以在模式 2 自动重载模式下为 Timer0 重新配置 TL0 和 TH0?

  2. 是否有必要在重新配置期间停止 Timer0,因为它在中断期间没有运行?

  3. TH0 和 TL0 值是否在中断程序开始之前被压入堆栈?如果这些值被推入堆栈,然后在例程处理程序执行期间我重新配置这些值,这些值是否会在退出中断时被堆栈中的 POP 值覆盖?

4

1 回答 1

1

在解决您的问题之前,我认为有必要指出什么是TR0,TH0TL0。它们不是函数的本地变量,也不是位于堆栈上的变量(假设您有一个调用堆栈,大多数 8051 应用程序都没有——查找内存覆盖)。这些是特殊功能寄存器,通常缩写为SFR。您可以阅读有关 SFR的更多信息,但出于您的问题的目的,您可以从范围的角度将它们视为全局变量。

  1. 您可以随时修改TL0和寄存器,包括在 Timer 0 外设的中断处理程序中。TH0

  2. 不必停止计时器来修改其值,但请注意,在您执行此操作时它会继续计数。如果您在低字节滚动时写入,这可能是一个问题,您最终可能会得到一个与您预期不同的计时器值。

    <previous code>  // Timer increments to 0x12fe
    TH0 = 0xff;      // Timer is now 0xffff
                     // Timer increments to 0x0000
    TL0 = 0x52;      // Timer is now 0x0052
                     // Timer increments to 0x0053
    

    您尝试将计时器设置为 0xff52,但结果为 0x0052。这是一个极端的例子,但风险是存在的。TL0先写后写可以降低风险TH0,但关闭定时器是最简单的解决方案。

  3. 由于您现在知道这一点TL0并且TH0是具有全局范围的 SFR,因此您不必担心堆栈或任何其他函数参数传递机制会干扰它们。

于 2013-09-25T20:11:57.277 回答