请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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; } }