C语言 MSP430 指示灯完全不闪烁



我一直在尝试打开MSP430G2553上的 LED,但它不起作用。我已经尝试了 TI 的代码示例、预生成的代码编辑器工作室 LED 闪烁项目,甚至是过去在 MSP430 上运行的先前代码。它们似乎都不起作用。可能是什么问题?可能是硬件故障吗?这是我的代码:

#include  <msp430.h>
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  P1DIR |= 0x01;                            // Set P1.0 to output direction
  for (;;)
  {
    volatile unsigned int i;
    volatile unsigned int j;
    P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR
    i = 25000;                              // Delay
    while(i--) {
       j = 2;
       while(j--);
    }
  }
}

我在MSP430FR5994开发板上遇到了一个问题,其中 LED 不会在闪烁示例中打开,但在"开箱即用体验"项目中会打开。比较代码,我确定与 pmm.c 的区别在于这一行:

//For FRAM devices, at start up, the GPO power-on default
//high-impedance mode needs to be disabled to activate previously
//configured port settings. This can be done by clearing the LOCKLPM5
//bit in PM5CTL0 register
PM5CTL0 &= ~LOCKLPM5;

将其放在main()的顶部似乎可以解决任何问题,并且LED的行为符合预期。

你能试试这个版本吗(仍然是一个轮询循环,但让我们保持非常基本)?

#include <msp430.h>
int main(void) {
  volatile int i;
  WDTCTL = WDTPW | WDTHOLD;
  P1DIR |= 0x01;
  P1OUT = 0x00;
  for (;;) {
    P1OUT ^= 0x01;
    for (i = 0x6000; i > 0; i--) { };
  }
  return 0;
}

我在 2010 年使用 MSP430 时从我的一个旧示例中获取了这一点......

尝试将 while 循环替换为 __delay_cycles(1000000);

编译器可以优化空循环,即使循环变量标记为 volatile

#include  <msp430.h>
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  P1DIR |= 0x01;                            // Set P1.0 to output direction
  for (;;)
  {
    P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR
    __delay_cycles(1000000);
  }
}

复位后,所有端口引脚均为高阻抗,施密特触发器禁用其模块功能,以防止任何交叉电流。即使已完成所有必要的 GPIO 设置,也需要清除 PM5CTL 寄存器中的LOCKLPM5位(如复位后的 I/O 配置章节 TI 用户指南中所述)

PM5CTL0 &= ~LOCKLPM5;

在此之前,I/O在施密特触发器输入下保持其高阻抗状态禁用。

最新更新