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.

[参考译文] CCS/MSP430G2553:无法从计时器 A 中断中退出

Guru**** 2584465 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/692063/ccs-msp430g2553-unable-to-get-out-of-timer-a-interrupt

器件型号:MSP430G2553

工具/软件:Code Composer Studio

自从过去三个月以来、我一直在使用 msp430g2553、因此我对这很陌生。 我已经编写了代码来使用计时器 A0生成导通时间为90us 的120us 脉冲。 我正在使用 P1.4上的 GPIO 高-低边沿中断进行计数的相同脉冲。 我每20ms 对脉冲进行一次计数。 为了对脉冲进行计数、我使用计时器 A1每20ms 编写一次 ISR。 但是、当我调试代码时、我观察到控制并未从 计时器 A1 ISR 中退出。 这给我造成了问题。 我只是想在20ms 后从 ISR 中获取控制权。 我已附上我的代码。 请通过闪烁代码和大脑上的指示灯来帮助我。 谢谢你。

/*
* count.c
*
*创建日期:2018年5月20日
*作者:Sumit
*/
#include 

#define BuffMax 50 //定义1秒

无符号整型计数的缓冲区限制;

struct 计数
{
unsigned int Pulses[BuffMax];
unsigned int 级别;
unsigned int ID;
};

struct 计数 c;
void main ()
{

unsigned int temp;

WDTCTL = WDTPW + WDTHOLD; //停止 WDT

//时钟系统//
if (CALBC1_1MHz=0xFF)//如果校准常数被擦除
{
while (1);//不加载,陷阱 CPU!
}

DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHZ;//设置范围
DCOCTL = CALDCO_1MHZ;//设置 DCO 阶跃+调制

P1OUT = 0x00;
P1DIR = 0x00;
P1DIR |= BIT2;// P1.2输出
PIT2;// P1SEL = BIT2 //P1.2外设选择

//启动计时器以生成20ms 的中断(TA1.1) P2.1

TA1CCTL1 = CCIE;
TA1CCR0 = 20000;
TA1CTL = tassel_2 + MC_1;


//启动 timerA0 (p1.2)以生成持续时间90US 和周期120US
TA0CCR0 = 120;
TA0CCR1
= 120;/ TA0R1 = CCR1/TA0RTUDR1 /设置周期 // CCR1 PWM 占空比
TA0CTL = tassel_2 + MC_1;// SMCLK、向上





计数模式//初始化端口1.4作为输入及其中断 P1REN |= BIT4;// P1.4上拉/Dpwn P1OUT |= BIT4;// p1.4上拉
P1IE |= BIT4

;// PIT4 |高/低边沿~= PIT4;// PIT4 //清除 P1.4 IFG

//清除所有无用的脉冲
(temp = 0;temp <= BuffMax;temp++)
{
c.Pulses[BuffMax]= 0;
}
Count=0;

_ bis_SR_register (GIE);
// TA1CCTL1 = CCIE;

while (1)
{

_ bis_SR_register (






void


)= 0;_ Timer_A + PMM_1;无符号中断向量= 0;+ PMM_1 = 0


计数= 0;
if (sum < 255)
{
c.puls[c.ID]= sum;
c.ID++;
if (c.ID > BuffMax)
c.ID=0;
}

sum = 0;
for (i=0;i<=Count;i++)
{
SUM+= c.puls[i];

}
c.level =;}puls=0;void







= Port_1;pit_1;pMM_1
(COUNT_1)+= PMIC_TRIBUS_COUNT_TRIBUST_TRIBUST_TRIBUGER/TRIBUCE_COUNT_1;#COUNT_COUNT_TRIBUTRIBUTRUTRIBUTRUTRUTRUTRUTRUTRUTRUTRY= 0;




if (Count > 255)
{
Count = 255;
}

P1IFG &&~BIT4;// P1.4 IFG 已清除
返回;
}

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

    在论坛上发布代码时、请使用 按钮、它是代码格式器。 它将以更可读的状态格式化您的代码、这可能会使您更快地获得帮助。 我已经编辑过您的帖子以反映此更改。

    就您的问题而言、这与使用调试器是一致的。 基本上、当调试器被启用时、CPU 会随着一个侵入式过程而减慢速度。 当您逐行运行时、它会使 CPU 暂停、但在这种情况下、时钟仍在运行、因此计时器等无需 CPU 干预即可运行的外设也会继续运行。 因此、所发生的情况是 CPU 在 ISR 中停止、但计时器仍在运行、因此由于时间范围不同、会触发下一个中断并准备就绪、然后您才能退出 ISR。 如果您在自由运行模式下运行调试器、则芯片将正常运行、但您无法逐行运行、但您可以使用断点检查状态。 (请注意、当您遇到断点时、计时器仍在运行、因此您可以遇到相同的问题。) 如果您需要检查计时或计时器、则需要通过在每次遇到代码时切换 GPIO 或进入计时器中断来执行一些 GPO 调试。 您可以使用逻辑分析仪或 O-示波器来检查频率或时序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、将此行添加到计时器 ISR:
    TA1CCTL1 &=~CCIFG;//清除计时器 IFG (因为其他人将不会)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Jace H 和 Bruce 对我的帮助。 在 ISR 中清除标志后、我将获得脉冲值。 我之前得到了0。 但我担心计时器 ISR 发生的次数。 大家都知道、我调用计时器 ISR 的时间为20ms。 如何确认计时器 ISR 每20ms 运行一次?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Jace H 和 Bruce 对我的帮助。 在 ISR 中清除标志后、我将获得脉冲值。 我之前得到了0。 但我担心计时器 ISR 发生的次数。 大家都知道、我调用计时器 ISR 的时间为20ms。 如何确认计时器 ISR 每20ms 运行一次? 请帮助
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sumit、

    请参阅上面我的 GPIO 调试注释。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jace H、
    每次 ISR 达到时、我都会声明变量并递增。 在主循环中、我与50进行了比较、这证实了我大约完成1分钟并翻转了 LED。
    非常感谢