This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2510:定时器1通道2输出比较

Guru**** 2523310 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/657077/cc2510-timer-1-channel-2-output-compare

器件型号:CC2510

我正在使用计时器1通道2作为输出比较、以便在 P1_0上每5秒发出一个脉冲。

我对终端 countd 进行编程以获得精度、但当我启用 P1_0的外设功能时、我在示波器上测量已设置的行、直到达到终端计数时才保持低电平。

当达到终端计数时、它会将脉冲设置为编程设置、但我不知道为什么在启用外设后已经设置了它?  

在手册中、说明 P1_0没有上拉或下拉功能、并且我没有连接到引脚的阻抗。

void main (void)
{
EA = 0;//禁用所有中断
P1SEL &=~(BIT0); //将 P1_0设置为通用 I/O
P1DIR |=(BIT0); //将 P1_0设置为输出
P1INP &=~(BIT0 | BIT2 | BIT4 | BIT4 | BIT5 | BIT7); //将 P1_0设置为上拉/下拉
P2INP &=~(P2INP_PDUP1); //将 P1_0设置为上拉
P1_0 = 0;

// Timer1上的1ms 中断(具有最高优先级)
T1CTL &=~T1CTL_CH2IF; //清除计时器1通道2中断标志
T1CTL &=~T1CTL_OVFIF; //清除计时器1溢出中断标志

T1CCTL2 &=~T1CCTL2_IM; //放捆定时器1通道2中断屏蔽
OVFIM = 1; //启用定时器1溢出中断屏蔽

P2DIR =(P2DIR &~P2DIR_PRIP0)| P2DIR_PRIP0_2; //如果 PERCFG 将2个外设分配给同一引脚(定时器1通道0和1 - USART1)
、则采用之前的顺序 P2SEL |= P2SEL_PRI0P1; //为使用端口1
PERCFG 的 Timer 1优先于 USART 0 |= PERCFG_T1CFG; // Timer1到备用位置2、P1_2

T1CCTL0 =(T1CCTL0 &~T1CCTL0_CMP)| T1CCTL0_MODE | T1C0_SET_ON_CMP;//将计时器1通道0设置为比较模式并在比较 T1CC0L
= 0xc7时设置输出; //设置定时器1通道0比较值低字节
T1CC0H = 0x32; //设置计时器1通道0比较值高字节

T1CCTL2 =(T1CCTL2 &~T1CCTL2_CMP)| T1CCTL2_MODE | T1C2_SET_ON_CMP;//设置计时器1通道2以比较模式并设置比较 T1CTL
=(T1CTL &~(T1CTL)| T1CTL_DIV_MODE | T1CTL 模块模式 //首次挂起定时器1操作并清除预分频器、接下来设置为模操作并将节拍频率除以1
T1IE = 1; //启用定时器1中断使能
EA = 1;//使能所有中断

while (1)
{
;
}
}_interrupt
void Timer1_ISR (void)
{
if (T1CTL 和 T1CTL_OVFIF)
{
//保持简单!
T1CTL =(~T1CTL_OVFIF & 0xF0)|(T1CTL & 0x0F);
timeTicker++;

if (nextSyncReceivedTime.fraction > 6500)// 13000个周期=1ms
{
if (timesticker =nextSyncReceivedTime.time)
{
//出于某种原因,该行在该代码之后也会变为高电平(不需要)
P1SEL |= BIT0; // P1_0至外设功能(定时器1 CH 2输出、在下一个中断时设置输出)

T1CCTL2 =(T1CCTL2 &~T1CCTL2_CMP)| T1CCTL2_MODE | T1C2_SET_ON_CMP;//将计时器1通道2设置为比较模式并设置比较上的输出
T1CC2L =(uint8)(nextSyncReceivedTime.fraction & 0x00ff); //设置定时器1通道2比较值低字节
T1CC2H =(uint8)((nextSyncReceivedTime.fraction >> 8)& 0x00ff); //设置计时器1通道2比较值高字节
timeTickClearComparePulseBeforeThisTimeTick = timeTicker + 5;
}
}
if (timeTickClearComparePulseBeforeThisTimeTick &&(timeTicker >= timeTickClearComparePulseBeforeThisTimeTick))
{
//启用 I/O 功能的计时器
P1SEL &=~(BIT0); // P1_0至通用 I/O (在此中断期间设置输出)
P1_0 = 0;
}
}
} 

任何帮助都是很好的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我找到了错误。 如果我启用用于外设的 IO、则计时器仍在前面的设置上运行。

    设置新的终端计数将立即生效。 错误是我没有停止计时器、只切换到通用 IO。

    因此、为了解决这个问题、我首先初始化了计时器1通道2、以便在比较时清除、并将终端计数设置为0。

    T1CCTL2 =(T1CCTL2 &~T1CCTL2_CMP)| T1CCTL2_MODE | T1C2_CLR_ON_CMP;//设置计时器1通道2以比较模式并在比较时清除输出
    T1CC2L = 0x0; //禁用定时器1通道2比较值低字节
    T1CC2H = 0x0; //禁用定时器1通道2比较高字节值 

    如果我然后将 Timer 1通道2设置为在比较时设置、它将不会像初始化的那样设置行。

    当我禁用定时器1时、我应该完全禁用它、而不仅仅是禁用外设功能。

    if (timeTickClearComparePulseBeforeThisTimeTick &&(timeTicker >= timeTickClearComparePulseBeforeThisTimeTick)
    {
    //为 I/O 函数
    P1SEL &=~(BIT0)启用计时器; // P1_0至通用 I/O (在此中断期间设置输出)
    T1CCTL2 =(T1CCTL2 &~T1CCTL2_CMP)| T1CCTL2_MODE | T1C2_CLR_ON_CMP;//设置计时器1通道2以比较模式并在比较时清除输出
    T1CC2L = 0; //禁用定时器1通道2比较值低字节
    T1CC2H=0; //禁用定时器1通道2比较值高字节
    P1_0 = 0;
    
    timeTickClearComparePulseBeforeThisTimeTick = 0;
    } 

    这样、我只会看到1个脉冲。