本帖最后由 forget345 于 2015-8-5 16:51 编辑
情景:需要休眠模式定时醒来,故TMR2 使用OSC10KHz 做唤醒
使用内部RC22MHz,
TMR0 使用OSC22MHz ,定时100us
TMR1 使用OSC22MHz ,定时10ms
TMR2 使用OSC10KHz , 定时2ms
使用 http:、、nuvoton-m0.com//code/cn/Init_M051/wiz/index.htm 设置初始化 (请替换p://)
现象:
使用 新塘提供的网页初始化,
发现TMR0 ,TMR1 时间不对,并且TMR0和TMR2最短时间5ms, TMR1最短时间16ms
时钟初始化如下:
void SYS_Init(void)
{
/* 解锁保护的寄存器 */
SYS_UnlockReg();
/* 使能 OSC22M,OSC10K */
SYSCLK->PWRCON |= SYSCLK_PWRCON_OSC22M_EN_Msk
| SYSCLK_PWRCON_OSC10K_EN_Msk;
/* 等待时钟稳定 */
SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_OSC22M_STB_Msk
| SYSCLK_CLKSTATUS_OSC10K_STB_Msk);
/* 切换HCLK和SysTick的时钟源 */
SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_IRC10K | SYSCLK_CLKSEL0_STCLK_IRC22M_DIV2;
/* 切换IP模块的时钟源 */
SYSCLK->CLKSEL1 = SYSCLK_CLKSEL1_TMR0_IRC22M
| SYSCLK_CLKSEL1_TMR1_IRC22M
| SYSCLK_CLKSEL1_TMR2_HCLK;
SYSCLK->CLKDIV = (0 << SYSCLK_CLKDIV_HCLK_N_Pos)
| (0 << SYSCLK_CLKDIV_UART_N_Pos)
| (0 << SYSCLK_CLKDIV_ADC_N_Pos);
/* !!! SysTick被设定为来自"OSC22M/2", 当开始该时钟时,
请不要在SysTick->CTRL中使用SysTick_CTRL_CLKSOURCE_Msk位。*/
/* PLL掉电模式 */
SYSCLK->;PLLCON = 0x0005C22E;
/* 现在可以安全的关闭没使用的时钟了! */
SYSCLK->PWRCON &= ~(SYSCLK_PWRCON_XTL12M_EN_Msk);
/* 使能外围设备时钟 */
SYSCLK->APBCLK = SYSCLK_APBCLK_TMR0_EN_Msk
| SYSCLK_APBCLK_TMR1_EN_Msk
| SYSCLK_APBCLK_TMR2_EN_Msk;
/* 重置外围设备 */
SYS->IPRSTC2 = SYS_IPRSTC2_TMR0_RST_Msk
| SYS_IPRSTC2_TMR1_RST_Msk
| SYS_IPRSTC2_TMR2_RST_Msk
| SYS_IPRSTC2_GPIO_RST_Msk;
SYS->IPRSTC2 = 0;
/* 锁定保护的寄存器 */
SYS_LockReg();
}
void TMR0_Init()
{
//_TIMER_RESET(TIMER0);
TIMER0->TCSR = TIMER_TCSR_IE_Msk
| TIMER_TCSR_MODE_PERIODIC
| TIMER_TCSR_TDR_EN_Msk
| TIMER_TCSR_CEN_Msk
| TIMER_TCSR_PRESCALE(20);
TIMER0->TCMPR = 55;
TIMER0->TEXCON = TIMER_TEXCON_TX_PHASE_RISING;
NVIC_EnableIRQ(TMR0_IRQn);
NVIC_SetPriority(TMR0_IRQn,3);
}
void TMR0_IRQHandler(void) //100us
{
((TIMER0)->TISR = TIMER_TISR_TIF_Msk);
//Led_Pin = ~Led_Pin;
}
void TMR1_Init()
{
TIMER1->TCSR = TIMER_TCSR_IE_Msk
| TIMER_TCSR_MODE_PERIODIC
| TIMER_TCSR_CEN_Msk
| TIMER_TCSR_TDR_EN_Msk
| TIMER_TCSR_PRESCALE(200);
TIMER1->TCMPR = 553;
TIMER1->TEXCON = TIMER_TEXCON_TX_PHASE_RISING;
NVIC_EnableIRQ(TMR1_IRQn);
NVIC_SetPriority(TMR0_IRQn,4);
}
void TMR1_IRQHandler(void)
{
((TIMER1)->TISR = TIMER_TISR_TIF_Msk);
// Led_Pin =~ Led_Pin;
}
void TMR2_Init()
{
TIMER2->TCSR = TIMER_TCSR_IE_Msk
| TIMER_TCSR_MODE_PERIODIC
| TIMER_TCSR_TDR_EN_Msk
| TIMER_TCSR_CEN_Msk
| TIMER_TCSR_PRESCALE(1);
TIMER2->TCMPR = 1;
TIMER2->TEXCON = TIMER_TEXCON_TX_PHASE_RISING;
NVIC_EnableIRQ(TMR2_IRQn);
NVIC_SetPriority(TMR2_IRQn,5);
}
void TMR2_IRQHandler(void)
{
((TIMER2)->TISR = TIMER_TISR_TIF_Msk);
// Led_Pin =~ Led_Pin;
}
int main(void)
{
SYS_Init();
TMR0_Init();
TMR1_Init();
TMR2_Init();
while(1)
{
};
}
void HardFault_Handler(void)
{
while(1);
}
|