微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ATMEL SAM3X 芯片定时器通道2 通道3怎么设置

ATMEL SAM3X 芯片定时器通道2 通道3怎么设置

时间:10-02 整理:3721RD 点击:
各位大神,当我使用atmel的SAM3x8E芯片设置定时器做1s定时实验时 使用TC0通道0时可以实现功能,但使用TC0的其他通道或是使用TC1和TC2两个定时器都无法实现功能是怎么回事?
以下是我写的代码 其中TC0可以实现功能,TC2却无法实现功能
#include "sam3xa.h"
#include "header.h"
void Init_output(Pio *p,uint32_t pio_pin)
{
    PMC->PMC_PCER0=1<<ID_PIOB;
    p->PIO_PER=pio_pin;
   
   
   
    p->PIO_OER=pio_pin;  
   
   
   
    p->PIO_PUER=pio_pin;
   
}
void Init_tc(void)
{
   
        Init_output(PIOB,PIO_PB20);

        PMC->PMC_PCER0=(1UL<<ID_TC0);
      
        
    TC0->TC_CHANNEL[0].TC_CMR=TC_CMR_WAVE    //波形模式
                        |TC_CMR_TCCLKS_TIMER_CLOCK4    //时钟4,:MCK/128
                                 
                  |TC_CMR_WAVSEL_UP_RC;   
       TC0->TC_CHANNEL[0].TC_CCR=TC_CCR_CLKEN|TC_CCR_SWTRG;//时钟使能 ,软件控制
   
        
    //波形仅上升RC比较时触发
    /*设置RC产生中断的时间*/
    //TC0->TC_CHANNEL[0].TC_RC=TC_RC_RC(656250);//1s定时
        
        TC0->TC_CHANNEL[0].TC_RC=TC_RC_RC(600100);//(655360);//定时
        TC0->TC_CHANNEL[0].TC_SR;
        
    TC0->TC_CHANNEL[0].TC_IER=TC_IER_CPCS;//RC比较时产生中断
   
    /*使能TC0中断*/
    NVIC_DisableIRQ(TC0_IRQn);
    NVIC_ClearPendingIRQ(TC0_IRQn);
    NVIC_SetPriority(TC0_IRQn,1);
    //NVIC_EnableIRQ(TC0_IRQn);
    NVIC->ISER[0]=1<<TC0_IRQn;
   
   
}
void TC0_Handler(void)
{
  uint8_t status = TC0->TC_CHANNEL[0].TC_SR;
    /* 判断中断是否为RC比较触发的 */
    if (status & TC_SR_CPCS)
        {
          if ((PIOB->PIO_ODSR &PIO_PB20))
        {
            PIOB->PIO_CODR = PIO_PB20;
                        
        }
        else
        {
            PIOB->PIO_SODR = PIO_PB20 ;
        }
        }
        
}
void Init_tc2(void)
{
   
        
        Init_output(PIOB,PIO_PB18);
  
        PMC->PMC_PCER0=(1UL<<ID_TC2);
        
        
    TC2->TC_CHANNEL[0].TC_CMR =TC_CMR_WAVE    //波形模式
                                  |TC_CMR_BURST_NONE
                        |TC_CMR_TCCLKS_TIMER_CLOCK3    //时钟4,:MCK/128
                  |TC_CMR_WAVSEL_UP_RC;    //波形仅上升RC比较时触发

            
        TC2->TC_CHANNEL[0].TC_RC=TC_RC_RC(655360);//定时
    TC2->TC_CHANNEL[0].TC_IER=TC_IER_CPCS;//RC比较时产生中断
    TC2->TC_CHANNEL[0].TC_CCR=TC_CCR_CLKEN|TC_CCR_SWTRG;//时钟使能 ,软件控制
   
    /*使能TC2中断*/
    NVIC_DisableIRQ(TC2_IRQn);
    NVIC_ClearPendingIRQ(TC2_IRQn);
    NVIC_SetPriority(TC2_IRQn,0);
    NVIC_EnableIRQ(TC2_IRQn);
       // NVIC->ISER[0]=1<<TC2_IRQn;
   
}
//int n=0;
void TC2_Handler(void)
{
    uint8_t status = TC2->TC_CHANNEL[0].TC_SR;
    /* 判断中断是否为RC比较触发的 */
    if (status & TC_SR_CPCS)
    {
               
            PIOB->PIO_SODR = PIO_PB18;
        
    }
        PIOB->PIO_SODR = PIO_PB18;
      
        
}

没玩过这个片子,我用的sam4s,给你我的rtt,参考一下,中间用的几个函数,你看看官方的库函数吧
void configure_rtt(uint32_t u32_mdata)
{
        uint32_t ul_previous_time,u32msdata;
        u32msdata = (uint32_t)(u32_mdata * 32.768);
        /* Configure RTT for a 1 second tick interrupt */
        rtt_init(RTT, u32msdata);
        ul_previous_time = rtt_read_timer_value(RTT);
        while (ul_previous_time == rtt_read_timer_value(RTT));
        /* Enable RTT interrupt */
        NVIC_DisableIRQ(RTT_IRQn);
        NVIC_ClearPendingIRQ(RTT_IRQn);
        NVIC_SetPriority(RTT_IRQn, 0);
        NVIC_EnableIRQ(RTT_IRQn);
        rtt_enable_interrupt(RTT, RTT_MR_RTTINCIEN);
}

好的谢谢 已经解决。

解决就好,有时间一起讨论

以后一定多多请教

互相学习吧,,,,,

我也是一知半解的,都是新人

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top