各位大神,当我使用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;
}
以后一定多多请教
一周热门 更多>