在开发中遇到一个问题。为了省电,定时器0的10MS定时,的时钟用了LXT的低速的。启动计数器的寄存器会写不成功。可能解释成外设模块的寄存器的时钟也是给切换成了LXT的。所以在高速总线下写低速外设的寄存器不成功。为什么外设的寄存器不是用高速总线的呢?希望有高人能解释一下。谢谢。
但是以后如何防止低速外设的寄存器写入了却不成功不启动的事?想想有时候觉得很恐怖的,谁知道它什么时候会写入不成功呢?每一个寄存器,变量付值都要确认一遍,或者多遍等到付值成功的话是不是很郁闷?现在凑合那么用了。
void TIM0_Configuration(void)
{
UNLOCKREG();
/* Enable TIMER0 clock */
CLK->APBCLK |= CLK_APBCLK_TMR0_EN;
/* Select 32.768 Khz LXT */
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_TMR0_MASK) | CLK_CLKSEL1_TMR0_LXT ;
/* Select 12Mhz HIRC */
// CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_TMR0_MASK) | CLK_CLKSEL1_TMR0_HIRC;
// CLK->TESTCLK = 0x80 + 0x03; //MCLKO : MCLK_EN=1;MCLK_SEL=LXT;
// CLK->TESTCLK = 0x80 + 0x20; //MCLKO : MCLK_EN=1;MCLK_SEL=TMR0_CLK;
/* Using TIMER0 in PERIODIC_MODE */
TIMER0->CTL = (TIMER0->CTL & ~TIMER_CTL_MODESEL_MASK) | TIMER_CTL_MODESEL_PERIODIC;
TIMER0->PRECNT = 7;
TIMER0->CMPR = 41; // Timer CLK = 32.768KHZ / (7 + 1) = 4096HZ // INT= 99.9HZ = 10.01MS
// TIMER0->CMPR = 15000; // Timer CLK = 12.000MHZ / (7 + 1) = 1500000HZ // INT= 100 HZ = 10.00MS
/* Enable TIMER0 Intettupt */
TIMER0->ISR = TIMER0->ISR; // clear pending interrupt
TIMER0->IER |= TIMER_IER_TMRIE;
NVIC_EnableIRQ(TMR0_IRQn);
/* Start counting */
TIMER0->CTL |= TIMER_CTL_TMREN;
int i=0;
while((TIMER0->CTL&0x80) != 0x80)
{
TIMER0->CTL |= TIMER_CTL_TMREN;i++;
}
DBG_PRINTF("Do %d times TIMER0->CTL=%x\n\r",i,TIMER0->CTL);
}
可以从半主机中看到要连续付107次才能成功启动定时器0. |