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;
}
以下是我写的代码 其中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);
}
好的谢谢 已经解决。
解决就好,有时间一起讨论
以后一定多多请教
互相学习吧,,,,,
我也是一知半解的,都是新人