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/MSP430FR6989:为什么 P9DIR 点亮绿色 LED?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/780051/ccs-msp430fr6989-why-does-the-p9dir-turn-on-the-green-led

器件型号:MSP430FR6989

工具/软件:Code Composer Studio

在我的代码中、我必须使用按钮打开绿色 LED、并使用计时器让红色 LED 闪烁。 当我设置方向的值时、例如 P9DIR=GreenLed 和 P1DIR=RedLed、它会自动打开 Green Led。 我将我的代码和值与其他两个进行了比较、它对他们有用、但对我不有用。 微控制器是否存在我不了解的问题或是否存在错误? 我已经从函数中取出了很多代码、使其更易于阅读。

代码如下:

#include
#define RED_LED 0x0001 // P1.0是红色 LED
#define GREEN_LED 0x80 //绿色 LED
#define RED_OFF 0xFE
#define GREEN_OFF 0x7F
#define BUTTON11 0x02
#define Development 0x5A80 //停止看门狗计时器
#define ENABLE_Pins 0xFFFE //需要使用输入和输出
#define ACLK 0x0100 // Timer_A ACLK 源
#define Up 0x0010 // Timer_A 向上计数模式
#define TAIFG 0x0001 //用于查看 Timer A 中断标志
/*********
//***功能原型
/*********
void stop_watchdog_timer (void);//这些函数没有
void enable_inputs_and_outputs (void);//输入或输出
void timer0_will _count_up_for_500ms (void);
void toggle_red_LED (void);
void toggle_red_LED_off (void);
void clear_timer0_elapsed_flag (void);
void timer0_count_for_500ms (void);//新添加的原型
void timer0_in_up_mode (void);//新添加的原型
void pullup_elid (void);
void toggle_green_LED (void);
void toggle_green_LED_off (void);
void button (void);


/*********
unsigned int timer0_500ms_elapsed (void);//具有输出、但无输入
/*********
MAIN ()

unsigned char interval=0;//计数650个计数
WDTCTL =开发;
PM5CTL0 = ENABLE_Pins;
P9DIR = GREEN_LED;       //////// 当它到达该点时、它会自动打开绿色 LED
TA0CTL = ACLK |向上;
TA0CCR0 = 650;
P1OUT=0x02;
P1REN=0x02;
P1DIR = RED_LED;

while (1)

if (((BUTTON11 & P1IN)=0)

TOGGLE_GREW_LED();

其他

TOGGLE_GREW_LED_OFF ();

if (timer0_500ms_elapsed ())

clear_timer0_elapsed_flag ();
间隔=间隔+1;
if (间隔= 1)

TOGGLE_RED_LED ();
clear_timer0_elapsed_flag ();
间隔=间隔+1;

if (间隔=30)

TOGGLE_RED_LED_OFF ();
clear_timer0_elapsed_flag ();


}//结束 while (1)
}//end main()

//***功能定义
void stop_watchdog_timer (void)

WDTCTL =开发;//禁用开发的看门狗计时器

//
void enable_inputs_and_outputs (void)

PM5CTL0 = ENABLE_Pins;//启用输入和输出

//

//
void toggle_red_LED (void)

P1OUT = RED_LED;//在引脚 P1.0上切换红色 LED

//
void clear_timer0_elapsed_flag (void)

TA0CTL = TA0CTL &(~TAIFG);//正如我们之前看到的那样,这首先会显示

//
unsigned int timer0_500ms_elapsed (void)

返回 TA0CTL 和 TAIFG;

//

void timer0_will _count_up_for_500ms (void)

timer0_count_for_500ms ();// Timer0将计数0.5秒
timer0_in_up_mode ();//在向上计数模式中

//
void timer0_count_for_500ms (void)

TA0CCR0 = 650;// 20000 * 25us = 0.5s

//
void timer0_in_up_mode (void)

TA0CTL =向上| ACLK;//使用 ACLK 计数到 TA0CCR0中的值

//
void pullup_elid (void)

P1OUT=0x02;
P1REN=0x02;

void toggle_green_LED (void)

P9OUT =绿色 LED;

void toggle_green_LED_off (void)

P9OUT=0x7F;

void toggle_red_LED_off (void)

P1OUT=0x00;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Corey、PxDIR 寄存器将 IO 引脚方向设置为输入(0)或输出(1)。 PxOUT 寄存器设置 IO 引脚的状态(0 =低电平、1 =高电平)。
    我怀疑 PxOUT 寄存器位没有正确设置、在代码中的那个点、很可能= 1。 在设置 DIRECTION 位之前、请先尝试设置 PxOUT 寄存器位= 0。