gpt4 book ai didi

c - 定时器中断期间重新配置定时器 中断 8051

转载 作者:行者123 更新时间:2023-11-30 15:45:31 24 4
gpt4 key购买 nike

我正在使用 SDCC 编译器。

我想要实现的是在 Timer0 自己的中断处理程序期间以模式 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 的值?

最佳答案

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

  1. 您可以随时修改 TL0TH0 寄存器,包括在定时器 0 外设的中断处理程序内。

  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. 由于您现在知道 TL0TH0 是具有全局范围的 SFR,因此您不必担心堆栈或任何其他函数参数传递机制干扰他们。

关于c - 定时器中断期间重新配置定时器 中断 8051,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18979766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com