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/MSP430F5529:计时器干扰

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/948798/ccs-msp430f5529-timer-glitches

器件型号:MSP430F5529

工具/软件:Code Composer Studio

我创建了一些代码、使 LED 在总6秒的时间周期内平滑地淡入和淡出。  除非引发中断、否则它会一直重复执行此操作。  除了一件事、这个代码运行完美:我偶尔会在 LED 上遇到小毛刺脉冲。  它会随着它的衰减而闪烁。  我怀疑这与我设置计时器的方式(或环路计时)有关。  我对这款处理器还不是很熟悉、但要准确地推测我的错误、但如果你们中有一位很棒的人想要看一看、我会很感激。

#include 

volatile signed int i = 0;
volatile signed int j = 305;
volatile signed int k = 1;
volatile signed int l = 1;

void _delay_ms (volatile unsigned int length)
{
volatile unsigned int delay = 0;
for (delay = 0;delay < length;delay++)
{
_delay_cycles (1000);
}
}

int main (void)
{
WDTCTL = WDT_MDLY_32;// 32ms 间隔(默认值)
_EINT(); //启用中断
SFRIE1 |= WDTIE; //启用 WDT 中断

//**注:此设置需要在板上的 LED1和 P1.2之间放置一根跳线**

P1DIR |= BIT2; //为输出设置计时器 A 0.1 (P1.2)
P1SEL |= BIT2; // P1.2特殊功能
SFRIE1 |= WDTIE;//启用 WDT 中断

P1DIR &=~BIT1; //将 P1.1设置为输入(SW2)
P1REN |= BIT1; //启用上拉电阻器
P1OUT |= BIT1; //正确的 IO 所需
P1IE |= BIT1; //在 P1.1上启用中断
P1IES |= BIT1; //为中断启用 hi->lo 边缘
P1IFG &=~BIT1; //清除任何错误的中断标志

P2DIR &=~BIT1; //将 P2.1设置为输入(SW1)
P2REN |= BIT1; //启用上拉电阻器
P2OUT |= BIT1; //正确的 IO 所需
P2IE |= BIT1; //在 P2.1上启用中断
P2IES |= BIT1; //为中断启用 hi->lo 边缘
P2IFG &=~BIT1; //清除任何错误的中断标志

TA0CCR0 = 328;
TA0CCTL1 = OUTMOD_7;
TA0CCR1 = 0;

TA0CTL = tassel_1 + MC_1;

while (1)
{
如果(l ==1)
i += k;
其他
I = I;
_delay_ms (10);
if (i <= 0)
k = k*-1;
if (i >=j)
k = k*-1;
}
}

#pragma vector = WDT_vector
__interrupt void watchdog_timer (void)
{
TA0CCR1 = I;
}//

此 ISR 处理 SW1按键#pragma
vector = port2_vector
__interrupt void port2_ISR (void)
{
//让我们清除标志
P2IFG &=~BIT1;

//去抖部分
_DELAY_CYCLES (25000);

//如果 SW1未按下,则返回
if ((P2IN&BIT1)!=0x00)
{
返回;
}
//暂停褪色
如果(l ==1)
{
L = 0;
}
}

//此 ISR 处理 SW2键按
#pragma vector = Port1_vector
__interrupt void Port1_ISR (void)
{
//让我们清除标志
P1IFG &=~BIT1;

//去抖部分
_DELAY_CYCLES (25000);

//如果未按下 SW2,则返回
if (((P1IN&BIT1)!=0x00)
{
返回;
}
//继续褪色
if (l ==0)
{
L = 1;
}
}