我想根据下面的真值表在函数中设置各种时钟源。基本上我想根据我传给setClockSource函数的参数写入TCCR0B寄存器(Atmega328)。表和寄存器的图像如下。
我无法弄清楚它是如何做到最好的。我想过将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工作室
答案 0 :(得分:1)
这样做:
void setClockSource (CLOCK_SOURCE clockSource)
{
TCCR0B = TCCR0B & 0xF8 | clockSource;
}
因此,您将保持高位并设置低位。