您好!
我必须在使用 MSP430FR5969 Launch Pad 的 I/O 中断处理程序内创建计时器延迟(采用轮询方法)。 I/O 中断只执行一次、之后程序停止、然后我应该复位微控制器。 只有在复位后、程序才会按我的预期执行。 我还尝试清除中断标志、但即使在清除中断标志后、它也会进入 ISR_TRAP。
如何在 I/O 中断处理程序中使用计时器延迟?
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.
您好!
我必须在使用 MSP430FR5969 Launch Pad 的 I/O 中断处理程序内创建计时器延迟(采用轮询方法)。 I/O 中断只执行一次、之后程序停止、然后我应该复位微控制器。 只有在复位后、程序才会按我的预期执行。 我还尝试清除中断标志、但即使在清除中断标志后、它也会进入 ISR_TRAP。
如何在 I/O 中断处理程序中使用计时器延迟?
我在整理这里的序列时遇到了一些问题。 您可能需要(按步骤、按时间顺序)描述您希望发生的情况以及(根据需要)每个步骤实际发生的情况。
如果您的计划是始终在延迟后立即重置 MCU、那么我认为在 ISR 内部旋转没有任何问题、直到那时。 如何执行复位?
ISR_Trap 几乎总是意味着您已经启用了一个中断、但没有为其提供 ISR。 MCU 复位似乎不可能使 ISR (代码+矢量字)消失,因此我怀疑还会发生其他情况--也许您意外启用了另一个中断。 您是否正在使用 RTC?
如果您可以发布相关代码(不要忘记在底部使用"Insert->Code"),这里的人可能会看到一些内容。
您好!
我在 launchpad 上使用的是具有全强度的12MHz HFXTCLK。我没有对 SMCLK 使用任何预分频值(我只对计时器使用预分频器)。
我将全速12MHz 时钟用于我的系统。 我想使用16位计时器延迟在中断发生时创建64ms 的脉冲。 在中断发生后、I/O 引脚提供64ms 的脉冲时间。 但是、在处理程序代码执行后、代码会在我无法创建相同中断后结束一次。
在调试模式下、分步调试过程会在执行处理程序代码后引导我进入 ISR_Trap。 请参阅以下代码。
#include <msp430.h>
/**
* main.c
*/
// I/O PORT 1 is used in this program
void clk_con()
{
CSCTL0_H = CSKEY >> 8;
CSCTL1 = 0X000C;
CSCTL2 = 0X0155;
CSCTL3 = 0X0000;
CSCTL4 = 0XCC01;
CSCTL0_H = 0;
}
void tmr_con(){
TA1CTL = 0x02D2;
TA1EX0 = 0X0007;
TA1CCTL0 = 0X0010;;
//TA1CCR0 = 0X2EE0;
}
void delay()
{
while(!(TA1CTL & TAIFG));
TA1CTL &= ~(TAIFG);
}
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
PM5CTL0 &= ~LOCKLPM5;
io_con();
clk_con();
FRCTL0 = FRCTLPW | NWAITS_1;
tmr_con();
__bis_SR_register(GIE);
return 0;
}
#pragma vector= PORT1_VECTOR
__interrupt void PORT1(void)
{
TA1CCR0= 0X2EE0;
P1OUT |= 0X01;
TA1CCTL0 = (~CCIFG);
delay();
P1OUT = 0X00;
TA1CTL |= TACLR;
P1IFG = 0X00;
}
> TA1CCTL0 = 0X0010;;
这将设置 CCIE、这将导致 Timer1_A0_vector 中断、 从而使您进入 ISR_Trap [参考用户指南(SLAU367P)表25-6和25.2.6.1]。
您对 CCR0中断不感兴趣、因此只需删除此行代码即可。
------
> TA1CTL = 0x02D2;
这等效于
> TA1CTL = tassel_2 | ID_3 | MC_1 | TAIE; // SMCLK/8、向上、启用
TAIE 将导致 Timer1_A1_vector 中断[参考 UG 第25.2.6.2]节、这将使您进入 ISR_Trap。
您不想在 TAIFG 上中断、因为您要对其进行轮询、所以请尝试:
> TA1CTL = tassel_2 | ID_3 | MC_1; // SMCLK/8、向上
------
> TA1CCR0= 0X2EE0;
这不会重置 TA1计数器、因此您的延迟将是周期中剩余的任何时间(因为它一直在计数)。 我建议您将其移至 tmr_con()并将其替换为(此处):
> TA1CTL |= TACLR; //重置计数器以获得完整周期
------
更一般的情况:在编码时,main()函数返回,(在我调用时)最终在 abort()中的循环中。 它不会导致 MCU 复位。