我使用的芯片为新唐M0516,主频配置为内部22M,倍频到50MHz。
现在遇到的问题是配置TMR1定时1ms中断,第一次进入后就很难进入。但也不是完全不能进入。
观察TDR寄存器,在单步的时候并不是+1的,而是一个很大的数字。
而且程序在没有进入的TM1的时候,TIMER1->TISR = 1,已经置位了。。。求教是哪儿出了问题。
以下是时钟初始化以及TM1初始化以及TM1中断处理程序。
void SYS_Init(void)
{
/* Unlock protected registers */
SYS_UnlockReg();
/*---------------------------------------------------------------------------------------------------------*/
/* Init System Clock */
/*---------------------------------------------------------------------------------------------------------*/
/* Enable Internal RC clock */
CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk; // CLK_PWRCON_OSC22M_EN_Msk = 0x00000004
/* Waiting for IRC22M clock ready */
while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk)); //CLK->CLKSTATUS = 0x0000001C
/* Switch HCLK clock source to internal RC */
CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLK_S_Msk; //CLK->CLKSEL0 = 0x000000002
CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HIRC;
/* Enable PLL and Set PLL frequency */
CLK->PLLCON = PLLCON_SETTING; //CLK->PLLCON = 0x00085639
/* Waiting for clock ready */
while(!(CLK->CLKSTATUS & (CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_OSC22M_STB_Msk))); //CLK->CLKSTATUS = 0x0000001C
/* Switch HCLK clock source to PLL */
CLK->CLKSEL0 = CLK_CLKSEL0_HCLK_S_PLL;
CLK->CLKSEL1 = CLK_CLKSEL1_PWM23_S_HCLK // Óõ½µÄÍâÉè, Ñ¡ÔñÆäʱÖÓ
| CLK_CLKSEL1_TMR1_S_HCLK
| CLK_CLKSEL1_TMR3_S_HCLK
| CLK_CLKSEL1_ADC_S_HCLK ;
/* Enable IP clock */
CLK->APBCLK = CLK_APBCLK_TMR1_EN_Msk | CLK_APBCLK_TMR3_EN_Msk |
CLK_APBCLK_PWM23_EN_Msk | CLK_APBCLK_ADC_EN_Msk;
}
void Timer1Init(void)
{
TIMER1->TCSR = TIMER_TCSR_DBGACK_TMR_Msk | TIMER_TCSR_IE_Msk | TIMER_TCSR_MODE_Msk // 2¸ö 25MHz ʱÖÓºó²ÅÄÜÔÙ¶Á
| TIMER_TCSR_CRST_Msk | TIMER_TCSR_TDR_EN_Msk + 49 ; // ¸´Î», 50·ÖƵ, 1us ¼ÆÊý
TIMER1->TCMPR = 1000 ;
NVIC_SetPriority(TMR1_IRQn, 1) ; // ÖжÏÓÅÏȼ¶Îª 1
NVIC->ISER[0] = 1<<TMR1_IRQn ; // ´ò¿ªÖжÏÏòÁ¿
TIMER1->TCSR |= TIMER_TCSR_CEN_Msk ; // Æô¶¯Timer, Õâ¸öÊǶÁ¸ÄдָÁî
}
void TMR1_IRQHandler(void) // 1000usÃëÖжÏÒ»´Î
{
TIMER1->TISR = ~0 ; // ÇåÖжϱêÖ¾
TIMER1->TEXISR = ~0 ; // Çå±êÖ¾Ðè2¸öTimerʱÖÓ(25M)ÖÜÆÚ
tmr1ms_flag = 1;
}
|