大家好、我正在尝试利用 Launchpad 的 OutofBox 演示源来证明一些功能并获得平台方面的一些经验。 我遇到了一个问题、其中 TimerA0 ISR 代码似乎没有执行、我很难弄清楚原因。 可以有人来看看、教育我吗? 我觉得这是一件很小的事情、我似乎无法找到。
让我感到困惑的一件事是、如果我在 ISR 中取消对 printf()语句的注释、代码将按预期执行。 我将此处所述的两个 LED 用作状态机检测调试、以确定它们是否被调用。 我尝试仅发布相关代码段、但可以在适当时提供更多内容。
#pragma vector = TIMER0_A0_VECTOR
__INTERRUPT void TIMER0_A0_ISR (void)
{
//同时按住按钮 S1和 S2
如果(!(P1IN 和 BIT2)&&!(P2IN 和 BIT6))
{
保持计数++;
isrcount++;
如果(保持计数= 40)
{
//停止计时器 A0
Timer_A_stop (timer_A0_BASE);
//更改模式
// printf ("检测到模式开关\n");
如果(*模式==0)
{
//此部件工作
// printf ("切换到 ADCRAW 模式\n");
(*模式)= ADCRAW_MODE;
P1OUT |= BIT0;//打开 LED1
P4OUT &=~BIT0;//关闭 LED2
}
如果(*模式=ADCRAW_MODE)则为其他值
{
//此部分不会-此代码仅在未注释的 printf()语句中执行,但随后会正常运行
// printf ("切换到 LINEARFLOW 模式\n");
P1OUT &=~BIT0;//关闭 LED1
P4OUT |= BIT0;//打开 LED2
(*模式)= LINEARFLOW_MODE;
}
如果(*模式=LINEARFLOW_MODE)则为其他模式
{
// printf ("切换到 HFLOW 模式\n");
P1OUT |= BIT0;//打开 LED1
P4OUT |= BIT0;//打开 LED2
(*模式)= gpHFLOW_MODE;
}
如果(*模式=gpHFLOW_MODE)则为其他值
{
// printf ("切换到 ADCRAW 模式\n");
P1OUT |= BIT0;//打开 LED1
P4OUT &=~BIT0;//关闭 LED2
(*模式)= ADCRAW_MODE;
}
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); //退出 LPM3
}
}
//按钮 S1已松开
IF (P1IN 和 BIT2)
{
*S1buttonDebounb回= 0; //清除按钮去抖
P1OUT &=~BIT0;
}
//按钮 S2被释放
IF (P2IN 和 BIT6)
{
*S2buttonDebounb回= 0; //清除按钮去抖
P4OUT &=~BIT0;
}
//同时释放按钮 S1和 S2
IF (((P1IN 和 BIT2)&&(P2IN 和 BIT6))
{
//停止计时器 A0
Timer_A_stop (timer_A0_BASE);
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出 LPM3
}
}
int main (void)
{
//WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
WDT_A_HOLD (_MSP430_BASEADDRESS_WDT_A__); //停止 WDT
/*
* LaunchPad 演示包含此代码以从低功耗模式唤醒
*
//检查是否从 LPMx.5唤醒
IF (SYSRSTIV = SYSRSTIV_LPM5WU)
{
init_gpio();
_enable_interrupt ();
switch (*模式)
{
案例 ADCRAW_MODE:
中断;
案例 LINEARFLOW_MODE:
中断;
案例 GPHFLOW_MODE:
中断;
}
}
else // else 必须是首次引导,运行 inits
{
/*
*在我们执行任何有趣的操作之前初始化例程
*
init_gpio();
init_Clock();
init_rtc();
init_lcd();
GPIO_clearInterrupt (GPIO_PORT_P1、GPIO_PIN2);
GPIO_clearInterrupt (GPIO_PORT_P2、GPIO_PIN6);
*S1buttonDebounce =*S2buttonDebounce =* MODE = 0;
_enable_interrupt ();
RTC_setModulo (RTC_BASE、8191);
RTC_enableInterrupt (RTC_BASE、RTC_overflow_interrupt);
RTC_START (RTC_BASE、RTC_CLOCKSOURCE_XT1CLK);
displayScrollText ("flow demo");//引导消息-仅限大写
字符}
/*
*主循环
*
while (1)
{
switch (*模式)
{
案例 ADCRAW_MODE:
displayScrollText ("选择 ADC 原始模式");
ClearLCD();
//调用 ADC Init & Start
中断;
案例 LINEARFLOW_MODE:
displayScrollText ("选择线性流模式");
ClearLCD();
中断;
案例 GPHFLOW_MODE:
displayScrollText ("GPH not implemented");
ClearLCD();
中断;
默认值: //必须是首次启动
DisplayScrollText ("保持 S1和 S2以切换模式");
ClearLCD();
中断;
}
_bis_SR_register (LPM3_bits | GIE);//输入 LPM3
__no_operation();
}
}// main 的末尾()