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.

[参考译文] MSP432P401R:使用相同的代码、但无法在 MSP432红色版本 Launchpad 上运行

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/676968/msp432p401r-with-the-same-code-but-it-cannot-run-on-msp432-red-version-launchpad

器件型号:MSP432P401R

大家好、

我已经从 TI 购买了新的 MSP432 Red 版本 Launchpad。 目前、我有2个 MSP432 LaunchPad、一个是黑色版本(旧版本)、另一个是新版本。 使用相同的代码时、背面版本工作良好、但红色版本不工作。

在红色版本的用户指南中、它说功能没有变化。 更改仅是 LaunchPad 的硬件(更改按钮位置、JTAG)。 因此、我的代码应该在 Red 版本上正常工作、但它不能正常工作。

这里是否有任何一个问题相同? 如果是、您能否与我分享这种情况的解决方案?

提前感谢大家。

侯乐

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否向我们提供更多详细信息、或分享显示问题的简短测试案例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keith、

    在我的项目中、我使用 ADC14与 DMA 相结合、使用 TI BOOSTXL-AUDIO Booster Pack 上的麦克风来采样音频信号。 采样数据将保存到2个缓冲器中(我对 DMA 使用乒乓模式)。 该采样数据将通过 SPI 总线简单地输出到 BOOSTXL-AUDIO 上的 DAC。 以20kHz 的采样率对音频信号进行采样/回放。

    我使用无穷大环路将采样数据写入 DAC。

    我将代码刷写到 MSP432黑色版本 Launchpad 中、代码运行良好、我可以在这里看到从麦克风采样的重复音频。 但使用相同的代码、MSP432红色版本 LaunchPad 无法正常工作。 我进行了一些测试、发现无穷大环路仅为我提供64个环路、因此我的数据永远不会输出到 DAC。

    此外、我可以通过 CCS 中的 Graph 来观察采样数据。 音频采样端(ADC、DMA)在两个 LaunchPad 上都能正常工作。 在红色版本的 LaunchPad 上、输出数据永远不会改变(保持零)。

    使用另一个代码、我使用 TI 的 Kentec 触摸显示屏。 它还使用 SPI 作为通信通道。 再说一次、黑色版本的 Launchpad 工作正常、每个人都认为可以、但对于红色版本、显示屏没有显示任何内容、完全是黑色。

    因此、我认为问题可能来自 SPI 模块、但我不确定。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "如果是、您能否与我分享这种情况的解决方案?"

    您希望其他人帮助您调试他们没有的一段代码。 这怎么可能?

    您有代码、您可以单步查看代码的挂起位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hau、

    黑色 Launchpad 具有较旧的 MSP432P401R 器件预量产版本。 红色 LaunchPad 使用最新的生产版本。 此外、随着我们移动器件版本、API 发生了变化、这是 SimpleLink SDK 的一部分。

    我强烈建议将您的应用程序移至 SDK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Atmit、

    非常感谢您提供的信息。 显然、我正在为项目使用最新版本的 MSP432 SDK、在函数调用中使用 MAP 前缀。 I'v 尝试在出厂时重置 launchpad、但代码仍然无法正常工作。

    此外、我将使用最新的 CCSv8。

    你有其他建议吗?

    此致、

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

    我很抱歉。 我之所以没有在这里发布代码、是因为它非常复杂、可能需要很长时间才能理解。 它已被分成多个文件和文件夹、分别对应于每个函数模块。 快速理解它的简单方法是将整个项目导入 CCS、然后您将轻松了解我的项目的结构及其工作原理。

    我正在尝试解决这个问题。 不管怎样、谢谢您。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    我在其他简单项目中做了一些测试,发现放入 main()内 while (1)循环的所有代码和平都不会运行。
    我已将代码移动到中断处理程序中、然后它正确运行。 黑色电路板上不会出现这种情况。

    TI 是否更改了使 while (1)循环内的代码无法运行的内容?

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

    代码可能总是很复杂。 仅仅通过指出它适用于较旧的 LP、而不适用于较新的 LP、我们就无法提供太多的支持来帮助您找出问题的根本原因。 您将需要调试代码、查看引脚上的输出(检查源同步接口上的数据和时钟频率、波特率)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hau、

    由于我们只使用红色 LP、因此您可以将"simple"示例以 CCS 工程的形式发送给我、我可以使用最新的 SDK 运行该工程。 请确保我不需要外部设备来与通信、因为我可能没有可供使用的确切设备。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下面是芯片中的变化:
    www.ti.com/.../slaz610o.pdf

    尽管您可能需要将"MSP432P401R 勘误表"谷歌搜索以查找修订版 B (如果您的电路板上有)。

    看看这些问题中是否有一个可能是您的问题。 我会特别检查睡眠问题。 您不会给我们太多的机会。

    我可以向您保证 while (1)仍然是一个无限循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好!

    这是简单的测试代码。 红色 LED 和 RGB 蓝色 LED 将使用计时器中断进行定期切换。 我使用最新的 SimpleLink MSP432 SDK、无需外部器件。

    #include 
    #include 
    #include 
    
    void Clock_Init (void);
    void GPIO_Init (void);
    
    static uint8_t count = 0;
    static bool select;
    
    uint16_t iii = 0;
    
    //
    * main 函数
    *
    int main (void)
    {
    /*停止看门狗计时器*/
    MAP_WDT_A_HOLDTimer();
    
    /*禁用主中断*/
    MAP_Interrupt_disableMaster();
    
    /*启用 FPU,启用怠惰堆栈,以在 ISR 中执行浮点运算*/
    map_fpu_enableModule();
    MAP_FPU_enableLazyStacking();
    
    /*初始化系统时钟和 GPIO 引脚*/
    Clock_Init();
    GPIO_Init();
    
    /*启用在 ISR 退出时睡眠并启用主中断*/
    MAP_Interrupt_enableSlepOnIsrExit();
    MAP_Interrupt_enableMaster();
    
    /*红色 LED */
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
    
    /* RGB 蓝色 LED */
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN2);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN2);
    
    CONST Timer_A_UpModeConfig upModeConfig_A3 =
    {
    Timer_A_CLOCKSOURCE_ACLK、
    Timer_A_CLOCKSOURCE_divider _1、
    0x07FF、
    Timer_A_TAIE_INTERRUPT_DISABLE、
    Timer_A_CCIE_CCR0_INTERRUPT_ENABLE、
    Timer_A_do 清除
    };
    
    /*将计时器 A3配置为向上计数模式*/
    MAP_Timer_A_configureUpMode (TIMER_A3_base、&upModeConfig_A3);
    MAP_Interrupt_enableInterrupt (INT_TA3_0);
    MAP_Timer_A_clearTimer (TIMER_A3_base);
    MAP_Timer_A_startCounter (TIMER_A3_base、TIMER_A_UP_MODE);
    
    while (1)
    {
    /*如果我把它放在这里,代码的这种平静就无法运行*/
    如果(选择)
    {
    MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN2);
    }
    其他
    {
    MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P2、GPIO_PIN2);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    MAP_PCM_gotoLPM0 ();
    }
    }
    
    void TA3_0_IRQHandler (void)
    {
    /*清除计时器 A3捕获比较中断标志*/
    MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A3_base、TIMER_A_CAPTURECOMPARE 寄存器_0);
    
    如果(count++=8)
    {
    select =!select;
    计数= 0;
    }
    
    /*如果我取消注释、代码的这种和平可以正常运行*//
    if (选择)
    //{
    // MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    // MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN2);
    //}
    // else
    //{
    // MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P2、GPIO_PIN2);
    // MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
    //}
    
    
    //
    *初始化时钟信号
    */
    void Clock_Init (void)
    {
    /*将工作电压设置为 Vcore1并使用直流/直流转换器*/
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_PCM_setPowerState (PCM_AM_DCDC_VCORE1);
    
    /*设置等待状态*/
    MAP_FlashCtl_setWaitState (FLASH_BANK0、2);
    MAP_FlashCtl_setWaitState (FLASH_BANK1、2);
    
    /*将 DCO 中心频率设置为48MHz */
    MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);
    
    /*初始化时钟信号*/
    MAP_CS_initClockSignal (CS_MCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1);
    MAP_CS_initClockSignal (CS_HSMCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1);
    MAP_CS_initClockSignal (CS_ACLK、CS_REFOCLK_SELECT、CS_CLOCK_DIVIDER_1);
    }
    
    //
    *初始化 GPIO
    */
    void GPIO_Init (void)
    {
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P3、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P3、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P4、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P4、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P5、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P5、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P6、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P6、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P7、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P7、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P8、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P8、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P9、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P9、PIN_ALL16);
    
    MAP_GPIO_setAsOutputPin (GPIO_PORT_P10、PIN_ALL16);
    MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P10、PIN_ALL16);
    }
    

    非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    简单:单步执行新芯片上的代码、查看其挂起位置。

    或者将其简化为极简的部分、并让其他人帮助您进行调试。

    没有其他解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在中断处理程序(如 SELECT)中修改的任何变量都需要是易失性的。 while 循环运行时可能永远不会更改 select 的值、因为它表示它永远不会更改。 真正智能的优化器甚至可能只是优化 IF。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keith、

    非常感谢您提供的信息。 我将对此进行调查。

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

    您好、Keith、

    感谢您的信息。 我已将 var "collect"更改为"volatile"、但没有任何变化。 但我发现了问题的原因。 如前所述、问题可能来自睡眠。 我已从中修改代码

    MAP_Interrupt_enableSlepOnIsrExit(); 

    更改为

    MAP_Interrupt_disableSlepOnIsrExit(); 

    代码现在已正确运行。 非常感谢您的支持。

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

    "代码现在已正确运行。"

    这是一个有趣的修复。

    因此、您必须启用退出时睡眠才能在旧芯片上运行、并且必须禁用它才能在新芯片上运行?  

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

    完全正确! 我已经尝试对其进行调试、并看到我的所有中断子例程都可以正确执行。 唯一无法执行的逻辑是在 while (1)循环内。 每当 ISR 退出时、CPU 进入等待中断的循环(在调试时在汇编代码中找到它)、不会返回 while (1)循环。 这导致 while (1)循环仅从开始运行到第一个中断事件。

    我尚未在旧芯片上测试在 ISR 退出时禁用睡眠的情况、因为我只安装了最新版本的 CCS CCSv8。 此版本不允许我刷写旧的 Launchpad。 但我可以肯定的是、我的所有项目都在 ISR 退出时启用睡眠、如果我禁用它、我的所有项目都可以在新芯片上正确运行。 可能是我将在将来禁用 ISR 退出时睡眠的情况下测试旧芯片。

    非常感谢大家的帮助。