工具/软件:Code Composer Studio
我正在尝试在 MSP430 Launchpad 中为按钮添加中断服务例程(ISR)、以便按下按钮可以暂停 PWM 占空比的变化(因此红色 LED 亮度保持恒定)。 再次按下按钮时,PWM 变化恢复(在按下第一个按钮之前,在相同的占空比值和“方向”)。 但是、当我按下按钮时、没有任何反应;红色 LED 会继续改变强度。 有人可以帮助我、看看按钮为什么不工作?
我在 timerA.c 中执行了 PWM 实现
#include "LED.h" #include "timerA.h" void ConfigureTimerA (void) { TA0CTL =(MC0 | TACLR); TA0CTL |=(tassel_2 |ID_2 | MC_1); //将值分配给时间 A0;捕获/比较寄存器0 TA0CCR0 = TA0CC499 ;TA0CCTL1 = TA0CC0 |启用 TA0CC0 | TA0CCTR1;TA0CC0 = TA0CCTR1 = TAIE; } 无符号整型方向= 0; #pragma vector = TIMER0_A0_VECTOR // CCIFG0 的中断服务例程__INTERRUPT void Timer0_A0_routine (void) { //最小强度下的光 IF (TACCR1 =0) 方向= 1; //光处于最大强度 、否则(TACCR0 = TACCR1) 方向= 0; } #pragma vector = TIMER0_A1_vector // CCIFG1和 TAIFG 的中断服务例程__interrupt void Timer0_A1_routine (void) { //如果同时指示了 TAIFG (开)和 CCR1 (关)中断、则会对 LED 产生净影响 //为空。 无符号 ON、OFF; //(16位) 关闭= TA0CTL 和 TAIFG; ON = TA0CCTL1 & CCIFG; 如果(开和关){ //不执行任何操作 TA0CTL &=~TAIFG; TA0CCTL1 &=~CCIFG; } 如果(关闭)为{、则为其他值 TO_OFF_LED1; TA0CTL &=~TAIFG; } 否则、如果(开){ TON_LED1; TA0CCTL1 &=~CCIFG; } 否则{ 对于(;;);//不应是可能 的} if (on){// CCR1 //在最小增加占空比时亮起 if (DIRECTION ==0) TACCR1 --; //最大减小占空比时的光 否则、如果(DIRECTION = 1) TACCR1++; } }
这是我实现按钮的位置
#include "button.h" #include "LED.h" void InitializePushButtonPortPin (void) { P1DIR &=~BIT3; P1REN |= BIT3; P1OUT |= BIT3; P1IE |= BIT3; P1DIR &=~BIT6; } #pragma vector = Port1_vector //按钮中断服务例程 __interrupt void button_routine (void) { TA0CCTL0 ^= CCIE; P1IFG &=~BIT3; }
这是我的主要方法
#include
#include "LED.h"
#include "button.h"
#include "timerA.h"
//全局变量
char LEDBit = LED1;
//函数原型
void ConfigureClockModule (void);
void main (void)
{
//停止看门狗计时器,并配置时钟模块。
WDTCTL = WDTPW + WDTHOLD;
ConfigureClockModule();
//初始化与 LED 关联的端口引脚,然后关闭 LED。
InitializeLEDPortPins();
//配置计时器 A 以生成所需的中断。
ConfigureTimerA();
enable_interrupts ();
//无限循环
while (1){
}
}
void TimeDelay (unsigned int delay、unsigned int resolution){
无符号 i;
TA0CTL =(MC_0 |TACLR);
TA0CCR0 =分辨率;
TA0CTL =(tassel_2|ID_2|MC_1);
对于(i=0;i