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.

[参考译文] MSP430FR5994:CCS GNU 编译器似乎在此 MPU 中损坏

Guru**** 2390735 points
Other Parts Discussed in Thread: MSP430FR5994, MSP430-GCC-OPENSOURCE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1057671/msp430fr5994-ccs-gnu-compiler-seems-to-be-broken-for-this-mpu

器件型号:MSP430FR5994

大家好、

美好的一天! 您能否帮助解决并重现我们客户的问题、如下所示。

我正在尝试使用 CSS 并借助 MSP430FR5994 Launchpad 启动和运行一些软件。 我不确定是否为此支持请求选择了正确的器件型号、但它是80引脚"PN" MCU。

我附加了一个基本草图。 复制我之前在下面所做的工作所需的一切。

1. 立即购买库存标准 MSP430FR5994 Launchpad

2. 启动 CCS

使用"MSP430FR5994"并借助 GNU 工具链创建新项目、然后将代码粘贴到 main.c 中

4. 使用"MSP430FR5994"并借助 TI 工具链创建另一个新项目,然后将完全相同的代码粘贴到 main.c 中

5.ru、然后每个人都看到 GNU One 进入 lala land、TI One 作为 Larry 快乐运行、即:以1Hz 的频率稳定闪烁。

然后尝试在调试中逐步完成其中的每  一项、您将看到 GNU 项目可能锁定在 ISR 中的"TA0CCR0 += 10000"行(但可以转到任何地方)、而 TI 项目也会像 Larry 一样逐步完成 Happy、 在单步执行端口切换时闪烁或熄灭。

好的、我希望这是足够的信息。 如果两者都适合您、我的 CCS 配置可能有问题-如果是、请告诉我可以做些什么来为您提供更多信息。 实际上、我投入了这么多钱、我想我会继续修整 GNU 项目、看看我是否能在某个地方找到错误的设置。

此致、Tristen

PS:请注意、我添加/注释了一些内容、试图尝试并理解错误的地方。 此代码示例的现有代码在活动模式下运行、无需修改即可证明问题。

#include 

int g_counter = 0

int main (void)

WDTCTL = WDTPW | WDTHOLD//停止 WDT 

// 
//端口初始化 
// 
P1OUT = 0
P1DIR = 0xFF

P2OUT = 0
P2DIR = 0xFF

P3OUT = 0
P3DIR = 0xFF

P4OUT = 0
P4DIR = 0xFF

P5OUT = 0
P5DIR = 0xFF

P6OUT = 0
P6DIR = 0xFF

P7OUT = 0
P7DIR = 0xFF

P8DIR = 0xFF
P8OUT = 0

PJOUT = 0
PJDIR = 0xFFFF

//禁用 GPIO 上电默认高阻抗模式以激活 
//先前配置的端口设置 
PM5CTL0 &=~LOCKLPM5

//配置 GPIO 
P1DIR |= BIT0
P1OUT |= BIT0

CSCTL0_H = CSKKEY_H//解锁 CS 寄存器 
CSCTL1 = DCOFSEL_6//设置 DCO = 8MHz 
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK//设置 ACLK = VLO、MCLK = DCO 
CSCTL3 = DIVA__1 | DIV__8 | DIVM__8//设置所有分频器 
CSCTL0_H = 0

_DELAY_CYCLES (1000)

// for (int i = 0;i <= 10;i++)
//{
// P1OUT ^= BIT0;
//
// _DELAY_CYCLES (32000000);
//
// P1OUT ^= BIT0;
//
// __delay_cycles (8000000);
//
// P1OUT ^= BIT0;
//} 

TA0CCTL0 = CCIE//启用 TACCR0中断 
TA0CCR0 = 10000
TA0CTL = tassel_ACLK | MC__Continous// SMCLK、连续模式 

_enable_interrupt ()

while (1) 

// LPM3; 

__no_operation()//对于调试器

// P1OUT ^= BIT0;

//_ bis_SR_register (LPM0_bits | GIE); //输入带中断的 LPM0
 //_ no_operation (); //对于调试
器}

// Timer0_A0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_A0_Vector
__interrupt void Timer0_A0_ISR (void)
#elif define (__GNU__)#pragma COMPLETE_A0
 (void)(void TI_0_A0)(void TI_0_ISR (void)(void)#interrupt TI_0_0_ISR (void

)#elt)(void TI_0_ISR (void) 
#endif

TA0CCR0 += 10000//将偏移添加到 TA0CCR0

 //__NO_OPERATION (); //用于调试器 

P1OUT ^= BIT0

g_counter++

//_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);

下面是标志集的"GNU 编译器"摘要:-mmcu=msp430fr5994 -mhwmult=f5series -i"C:/ti/ccs1040/ccs/ccs_base/msp430/include_gcc -i"C:/Users/pc-user/workspace_v10/board -i"C:/ti/ccs1040/ccs/tools/compiler/msp430-gcc-9.3.1.11_win64/msp430-elf/include -og-g -gdwarf-3 -ghwmlarge-mcode-region=none -mlower data-lower

这是标志集的"GNU 连接器"摘要:-mhwmmmmmmmmult=f5series -og -g -gdwarf-3 -gstrict-dwarf -Wall -mcode-region=none -mlarge -994 cu、-Map、"board.map"-wl、-gC-SECTIONS -l"c:/ti/ccs1040/ccs/ccs_base/msp430/include_gcc -mmsp430fr5wl

感谢您的支持。

此致、  

Jonathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="470463" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1057671/msp430fr5994-ccs-gnu-compiler-seems-to-be-broken-for-this-mpu "-然后尝试在调试中单步执行其中的每一项操作、您将看到 GNU 项目可能会锁定  在 ISR (但可以转到任何地方)和 TI 项目中的"TA0CCR0 += 10000"行、同样、也可以单步执行"Larry、 在单步执行端口切换时闪烁或熄灭。

    我可以使用 MSP430-gcc-9.3.1.11和 CCS 使用发布的代码重复该故障  10.4.0.00006。

    链接器映射文件显示 Timer0_A0_ISR 函数已放置在.lowtext 段中、RAM 中已为该段提供运行地址(0x1c00)和 FRAM 中的加载地址(0x4000):

    .lowtext        0x0000000000001c00       0x10 load address 0x0000000000004000
     .lowtext       0x0000000000001c00       0x10 ./main.o
                    0x0000000000001c00                Timer0_A0_ISR

    发生崩溃的原因是启动代码未将.lowtext 段从其加载地址复制到运行地址、并且  Timer0_A0_ISR 函数在 RAM 中的运行地址中未定义指令。

    从快速搜索中、这与 MSP430-GCC-opensource 中最初报告的问题相同 :GCC 9.2.0.50 msp430fr5994.ld .lowtext bugfix、以及 MSP430-GCC-opensource 中报告的问题相同 :GCC 9.3.0.31 .lowtext 规则缺失链接器脚本 中的错误未在编译器的更高版本中修复。

    如第一个参考线程中所建议的那样、将 msp430fr5994.ld 从

      .lower.text :
      {
        . = ALIGN(2);
        *(.lower.text.* .lower.text)
      } > FRAM

    至:

      .lower.text :
      {
        . = ALIGN(2);
        /* Apply fix as per e2e.ti.com/.../msp430-gcc-opensource-gcc-9-2-0-50-msp430fr5994-ld-lowtext-bugfix
        *(.lower.text.* .lower.text)
        */
        KEEP (*(.lowtext))
      } > FRAM
    然后允许该示例运行。

    随附了修改后的示例。

    e2e.ti.com/.../MSP430FR5994_5F00_GNU_5F00_ISR.zip