c - TIMER0 不执行多个比较匹配寄存器中断请求。(MSP430)
问题描述
好的,所以我一直在尝试使用 MSP430FR5994 TI 启动板创建一些代码,该启动板利用 Timer0 和 3 个单独的比较寄存器来触发 3 个单独的 isr。我已经成功地让一个工作,但是一旦我添加另一个比较寄存器,CCIFE 标志设置并且永远不会竞争第二个 isr 的执行。我已经在 CCstudio 和 IAR 的调试器中观察了代码,两者都发生了同样的事情,设置寄存器是正确的,TA0R 寄存器正在计数,并将触发基于 TA0CCR0 的第一个 isr,但所有其他比较 regs R1 2 3 等不会触发和执行成功。代码如下,非常感谢我做错了什么。
#include "msp430.h"
#include <stdbool.h>
#define COUNT_1 12000
#define COUNT_2 800
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
PM5CTL0 &= ~LOCKLPM5;
P1DIR |= BIT0 + BIT1;
P1OUT = BIT0 + BIT1;
//set up and enable timer A or TA0 for continous mode
TA0CCR0 = COUNT_1;
TA1CCR1 = COUNT_2;
TA0CTL = TASSEL__ACLK + MC_2; //set the max period for 16bit timer operation
TA1CTL = TASSEL__ACLK + MC_2;
TA0CCTL0 = CCIE; //enable compare reg 0
TA1CCTL1 = CCIE; //enable compare reg 1
//TA0CTL |= TAIE;
_BIS_SR( GIE); //ENABLE GLOBAL INTERRRUPTS
//set the max period for 16bit timer operation
while(true){}
}
#pragma vector= TIMER0_A0_VECTOR //compare interrupt 0 flahse red led
__interrupt void TIMER0_A0(void) {
P1OUT ^= BIT1 ;
}
#pragma vector = TIMER1_A1_VECTOR //compare interrupt 1 flashes green led
__interrupt void TIMER1_A1(void) {
P1OUT ^= BIT0;
}
解决方案
用户指南在第 25.2.6.1 节中说:
当 TAxCCR0 中断请求被处理时,TAxCCR0 CCIFG 标志自动复位。
但是,其他 CCRx 中断不会发生这种情况,因为多个中断使用相同的中断向量。第 25.2.5.2 节说:
启用的最高优先级中断在 TAxIV 寄存器中生成一个数字(参见寄存器说明)。[…]
对 TAxIV 寄存器的任何访问(读取或写入)都会自动重置最高挂起的中断标志。
因此,您始终必须读取 TAxIV 寄存器(并且对于三个或更多 CCR,您需要它来找出哪个 CCR 触发了中断):
__interrupt void TIMER1_A1(void) {
switch (TA1IV) {
case TAIV__TACCR1:
P1OUT ^= BIT0;
break;
case TAIV__TACCR2:
...
break;
}
}
推荐阅读
- javascript - 如何使对象在 p5.js 中以随时间减少的间隔出现
- angular - 根据行的属性为行指定颜色
- pine-script - input.options 另一个输入的参数
- google-bigquery - ODBC excel BigQuery 连接器是否支持新的 M1 mac?
- wix - WiX - 安装到用户选择安装其余安装的驱动器根目录上的文件夹
- javascript - 使用 forEach 循环 / event.Target 属性的目标输入和 nextElementSibling - JavaScript
- mysql - 在 SQL 中结合 Join 查询和 Where 条件查询
- python - 在 PyQt5 中将 QsciScintilla 的文本光标向左或向右移动
- google-maps-api-3 - 为什么我不能在不运行代码两次的情况下将数据添加到 blazor 组件中的谷歌地图?
- pine-script - 如何跟踪信号模式?