在C

时间:2015-06-30 17:30:26

标签: avr-gcc

我想根据下面的真值表在函数中设置各种时钟源。基本上我想根据我传给setClockSource函数的参数写入TCCR0B寄存器(Atmega328)。表和寄存器的图像如下。 Register and Modes 我无法弄清楚它是如何做到最好的。我想过将enum用于各种模式,如下所示。

    enum CLOCK_SOURCE{
      NO_CLOCK_SOURCE=0x0;
      NO_PRESCALING=0x01;
      CLK_8=0x02;
     // and so on
}

但问题出在setClockSource()函数中,如何在不影响第3-7位的情况下写入TCCR0B寄存器?我应该首先清除最后3位,然后用TCCR0B清除OR TIMER_MODE值吗?如果没有清除,我可能无法保证最后3位的正确值。什么是有效的方式?

void setClockSource (enum CLOCK_SOURCE clockSource)
{
    TCCR0B&=0xF8;    // First Clear last 3 bits
    TCCR0B|=clockSource;
}

我们是否有可用于设置时钟源的库函数?我正在使用Atmega工作室

1 个答案:

答案 0 :(得分:1)

这样做:

void setClockSource (CLOCK_SOURCE clockSource)
{
    TCCR0B = TCCR0B & 0xF8 | clockSource;
}

因此,您将保持高位并设置低位。