打印
[技术问答]

M058ZDN 定时器使用OSC10KHz做时钟源

[复制链接]
1757|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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);
}

QQ截图20150805155422.png (40.4 KB )

QQ截图20150805155422.png
沙发
yiyigirl2014| | 2016-1-11 10:58 | 只看该作者
使用内部RC22MHz,
TMR0 使用OSC22MHz ,定时100us
TMR1 使用OSC22MHz ,定时10ms
TMR2 使用OSC10KHz , 定时2ms
最后那个图片是什么软件的配置?新唐提供了图形化的配置工具吗

使用特权

评论回复
板凳
稳稳の幸福| | 2016-1-11 22:57 | 只看该作者
NUC1xx内建了PLL,能使用外部 12MHz的晶振或是内部22M振荡器产生系统所需的时钟,由PLL所产生的时钟再经过适当除频,即可作为CPU的工作频率。另外NUC1xx也提供经由外部32KHz的晶振或是内部10KHz 振荡器直接供给作为CPU工作频率的方式。因此,NUC1xx对于工作时钟的设定,提供了很大的灵活性。

使用特权

评论回复
地板
bingg| | 2016-1-12 17:27 | 只看该作者
yiyigirl2014 发表于 2016-1-11 10:58
使用内部RC22MHz,
TMR0 使用OSC22MHz ,定时100us
TMR1 使用OSC22MHz ,定时10ms

我也想知道最后那个图片怎样配置的

使用特权

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

本版积分规则

18

主题

95

帖子

1

粉丝