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.

[参考译文] MSP430FR6989:为什么 TB0R 不递增?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/949406/msp430fr6989-why-does-tb0r-not-increment

器件型号:MSP430FR6989

我有下面的代码、在这里我尝试去去除按钮按压操作的抖动、并使用按钮来切换板载 LED。

从 MSP_init()函数中可以看出、我已经将 B 计时器设置为用作去抖计时器、并且我正在使用 CCR4作为寄存器来触发 B1矢量 ISR。 当我在调试模式下运行程序时、我注意到 TB0R 不是递增的、尽管系列用户指南(S.26.2.1)建议它应该随着时钟的每个上升边沿递增计数。 因此、TB0R 始终为0x0000、因此、CCR4始终作为我插入去抖变量的任何值结束。  

由于我没有设置低功耗模式、我认为我必须处于激活模式、因此所有时钟应该都在运行。 因此、TB0CTL |= TBSSL_ACLK 应该使 TB0R 与 ACLK 成步递增。 但是、在调试器中 TB0R 根本不会递增。 无论我使用步进函数(其他帖子建议有时不让计时器递增)还是"运行/播放"按钮、以及我是否在 ISR 内设置断点、都是如此。 同样、如果我刷写程序、我将能够打开指示灯、但去抖计时器中断从未达到、因此我无法通过再次按下按钮来关闭指示灯。

为什么 TB0R 不递增、我需要怎么做才能使其递增计数?

#include 

//=================== 函数原型===================================
void MSP_init ();

//=========================== 全局范围=================================
//定义
#define ROWS (BIT1 | BIT2 | BIT3 | BIT4)
#define cols (BIT4 | BIT4 | BIT6 | BIT4)

//有用常量和其他值
unsigned int 去抖= 0x01ff;//去抖延迟将在稍后完成。








//======================================== Main ================================================
void main (void)
{
//计时器填充
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;

//常量
unsigned char numer[3]={0xff、0xff、0xff};//一、几十、几百
unsigned char i = 0;
unsigned char sum;

//初始化
P2OUT &=~0xff;
P8OUT &=~0xff;
P9OUT &=~BIT0;
MSP_init();

_enable_interrupt ();

P2上的//端口中断。
P2IES |=行;//下降沿
//P2IES &=~行;//上升沿
P2IFG &=~0xff;//清除中断标志
P2IE |= rows;//interrupts on 1-4

//测试循环:
while (1){}











//========================= 函数=================================================



//MSP 初始
化 void MSP_init()
{
//设置 LED 的输出端口

P2DIR |= BIT6 | BIT7; // P2.6和 P2.7设置为输出
P2SEL1 &=~Ω(BIT6 | BIT7);//连接 P2.6和 P2.7
P2SEL0 |= BIT6 | BIT7; //至 TB0.5和 TB0.6
P3DIR |= BIT6 | BIT7; // P3.6和 P3.7设置为输出
P3SEL1 |= BIT6 | BIT7; //连接 P3.6和 P3.7
P3SEL0 &=~(BIT6 | BIT7);//至 TB0.2和 TB0.3

//初始化:
P8DIR |= cols;//Output
P8OUT &=~cols;//输出0
P2DIR &=~行;//输入
P2REN |= ROWS;//Pullup 电阻器
P2OUT |= ROWS;//输出为1 (稍后将下拉)

TB0CTL = TBSSEL_ACLK | ID_1 | MC_UP | TBCLR;//setup timer b
}




//=========================== 中断=================================

#pragma vector = TIMER0_B1_VECTOR
__INTERRUPT void T0B1_ISR (void)
{
switch (__evo_in_range (TB0IV、14))
{
情况0:中断; //无中断
案例2:中断; // CCR1未使用
案例4:中断; // CCR2
案例6:中断;

判例8://ccr4
TB0CCTL4 &=~CCIE;//禁用中断
P2IE |= ROWS;//在去抖延迟后重新启用中断
中断;

案例10:中断;
案例12:中断;
案例14:中断;
默认值:break;
}
}

#pragma vector = port2_vector //关联函数。 具有中断矢量
_interrupt void Port_2 (void) // ISR 的名称
{
开关(__evo_in_range (P2IV、P2IV_P2IFG7))
{
//我使用 P2.1-2.4作为输入。
案例 P2IV_NONE:break;//向量0:无中断
案例 P2IV_P2IFG0:中断;//向量2:P2.0

案例 P2IV_P2IFG1://BIT1、依此类推
//在中断上:
P2IE &=~行;//禁用中断
P2IFG &=~0xff;//清除中断标志
TB0CCR4 = TB0R +去抖;//禁用去抖周期的按钮中断
TB0CCTL4 = CCIE;//在 TB0CCR4上启用中断
//测试
P1DIR ^= BIT0;
P1OUT ^= BIT0;
中断;

案例 P2IV_P2IFG2:中断;
案例 P2IV_P2IFG3:中断;
案例 P2IV_P2IFG4:中断;
案例 P2IV_P2IFG5:中断;//矢量12:P2.5
案例 P2IV_P2IFG6:中断;//向量14:P2.6
案例 P2IV_P2IFG7:中断;//向量16:P2.7
默认值:break;
}
}

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

    >    TB0CTL = TBSSEL__ACLK | ID__1 | MC__UP | TBCLR;//setup timer b

    This sets TB0 into Up mode, but I don't see anything that sets TB0CCR0, so it's counting to 0.

    在上下文中、我怀疑您实际上需要 MC__Continuous.

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

    是的、没错。 讽刺的是、我在不同的代码段中设置了正确的时钟模式、我甚至没有注意到我将工作代码段与该代码进行比较时的区别。

    感谢您的帮助!