打印
[技术问答]

求教,新唐M0516,TMR1工作不正常的问题!

[复制链接]
1127|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kk810226|  楼主 | 2017-2-8 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用的芯片为新唐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;
}


沙发
springvirus| | 2017-2-9 08:41 | 只看该作者

前阵子用M0516做了东东,用BSP包的例程操作了4个TIMER,没出现问题

建议直接使用BSP包,避免直接操作寄存器有所遗漏

使用特权

评论回复
板凳
643757107| | 2017-2-9 22:50 | 只看该作者
用官方的库吧,别用寄存器,可能哪儿漏了什么。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝