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.

[参考译文] MSP430FR5849:为端口2引脚0 &1配置 UART 功能擦除主存储器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/894649/msp430fr5849-configure-port-2-pins-0-1-for-uart-function-erases-main-memory

器件型号:MSP430FR5849

我正在使用 MSP430FR5849器件并尝试实现文档 SLAA721C 中所述的主存储器引导加载程序。

当我尝试为 eUSCI_A 模式配置 RXD 和 TXD 线路(为端口2的位0和位1选择了辅助功能)时、它会导致该部件擦除所有主存储器 FRAM、使其返回到所有0xFF 字节。

我将时钟系统设置为在24MHz 时使用 DCO、SMCLK 和 MCLK 都设置为3MHz (DCO/8)、以防这种情况发生。

下面是我遇到问题的代码:

// eUSCI_A0保持在复位状态并使用 SMCLK
UCA0CTLW0 = UCSWRST | UCSSEL_2;

//在端口2引脚0和1上选择辅助(UART)功能
P2SEL0 &=~(BIT0 | BIT1);
P2SEL1 |=(BIT0 | BIT1);

//根据条件编译的波特率设置设置波特率
UCA0BR0 =(UCBRx_VAL 和0xFF);//设置低波特率字节
UCA0BR1 =(UCBRx_VAL >> 8);//设置高波特率字节
UCA0MCTLW = UCOS16_VAL |//设置调制值
(UCBRSx_VAL << 1)|
(UCBRFx_VAL << 4);

当我在 BIT0和 BIT1中执行到 P2SEL1的分配、该部件擦除所有 FRAM 存储器。  我出了什么问题?

谢谢、

肯特

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

    肯特

    通常、这些指令不能擦除主存储器。 如果您从主存储器而不是从 BSL 区域执行、则此代码和 UART 是否正常工作?

    您能否提供此代码的反汇编视图?

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

    Dietmar、

    代码从主存储器运行-它是文档 SLAA721C 中描述的主存储器引导加载程序代码。

    以下是反汇编:

    00fd34:40B2 0081 05C0 MOV.W #0x0081、USCI_A0_UART_Mode_UCA0CTLW0
    81 P2SEL0 &=~(BIT0 | BIT1);
    00fd3a:F0F2 00FC 020B 和.B #0x00fc、&Port_1_2_P2SEL0
    82 P2SEL1 |=(BIT0 | BIT1);
    00fd40:D0F2 0003 020D BIS.B #0x0003、&Port_1_2_P2SEL1
    85 UCA0BR0 =(UCBRx_VAL 和0xFF);//设置低波特率字节
    00fd46:43D2 05C6 MOV.B #1、USCI_A0__UART_Mode_UCA0BRW
    86 UCA0BR1 =(UCBRx_VAL >> 8);//设置高波特率字节
    00fd4a:43C2 05C7 CLR.B &USCI_A0__UART_Mode_UCA0BR1
    87 UCA0MCTLW = UCOS16_VAL |//设置调制值
    00fd4e:40B2 00A1 05C8 MOV.W #0x00a1、USCI_A0_UART_Mode_UCA0MCTLW

    当我在地址 fd40执行指令时、所有主存储器 FRAM (即所有主存储器引导加载程序)被擦除至所有0xFF 字节、即使 MPU 已被设置为阻止写入该空间(0xF800 - 0xFFFF)。

    肯特

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

    肯特

    反汇编对我来说很好、但这些指令永远无法擦除它。 那么、这是否意味着您需要重新编程它、而不是在复位后代码仍然存在?

    是否确定 MCLK 的运行频率低于8MHz、否则需要实现等待状态?

    您如何识别代码已被擦除? 通过调试器、您可能会失去连接、并且只会认为由于您超频 CPU 而被擦除吗?

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

    我认为代码被擦除、因为当我在调试器中单步执行时、在执行写入 P2SEL1寄存器的指令时、所有字节都会立即转到调试器的"Memory Browser"面板中的0xFF。  调试器似乎仍然具有连接、因为我可以在存储器浏览器中更改地址并查看不同的地址范围。  从0xF800到0xFFFF、所有字节现在似乎都是0xFF、这是主存储器引导加载程序代码所在的位置、并且存储器地址值不会显示为问号。

    在执行写入 P2SEL1的指令之前、我立即验证了时钟系统被设置为24MHz 的 DCO 时钟、MCLK 和 SMCLK 由 DCO 供源、并且 MCLK 和 SMCLK 都将 DCO 除以8 (CSCTL1 = 0x004C、CSCTL2 = 0x0133、CSCTL3 = 0x0033)。  我确实注意到、在我执行写入 P2SEL1的指令后、这些寄存器被复位为0xFFFF、以及 FRAM。

    我刚刚注意到、如果我在这个指令之后再执行一个步骤、它看起来会经历一个复位、代码会返回、程序计数器位于复位矢量、并且时钟系统恢复到我上面描述的设置。  我想它实际上不会擦除 FRAM 或寄存器、而是在该指令处进行某种程度的复位。  有什么想法为什么会这样呢?

    谢谢、

    肯特

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

    肯特、您好!

    好的、您会得到复位也许更有意义、但擦除真的很奇怪。

    您是否有任何连接到这些引脚的东西会导致短路或电源硬下拉?
    此外、您还可以在复位后通过检查 SYSRSTIV 寄存器来检查出现的复位。

    但请在执行此操作之前将其设置为0x0000、以确保已擦除所有以前的复位源。 一旦您了解了源、我们就可以为您提供进一步支持。

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

    在我开始尝试使用主存储器 BSL 之前、我已经按照与我的应用程序中配置的相同方式配置了主存储器 BSL 中的所有 IO 端口、并且应用程序当时运行良好。  因此、我认为这不会是由连接到引脚的元件引起的问题。

    我检查了 SYSRSTIV 寄存器-它的值为0x0004。

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

    我认为这已经指向了这个问题。  我在电路板上有另一个处理器、可生成一个到 MSP 的 NMI 中断、我认为当它加电时、它正在执行此操作、并且主存储器 BSL 尚未配置 NMI 引脚以实现 NMI 功能。  这似乎是导致复位的原因。  感谢您帮助我对此进行跟踪。

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

    肯特、您好!

    完美您对了、0x04通过 RST 引脚指示 BOR、现在您可以查找什么。

    顺便说一句、一般的好做法是在每次复位时分析 SYSRSTIV 寄存器、以获取启动复位源的信息。 即使在应用程序中、如果将来可能出现任何类型的退货、也会非常有帮助。 那么、假设线程可以闭合吗?

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

    嗯、我想我说得太快了。  我在主存储器 BSL 中添加了配置、以设置 RSTn/NMI 引脚以实现 NMI 功能、并禁用 NMI 中断。  在我们的设计中、MSP 控制我提到的生成 NMI 中断脉冲的另一个处理器的电源。  我看到这个复位发生在写入 P2SEL1端口时、在另一个处理器上电之前。  因此、它不能是它产生的 NMI 中断脉冲、这会导致这种情况。

    我仍在 SYSRSTIV 中看到0x0004。  SFRRPCR 被配置为启用内部上拉-还有一个47k 外部上拉。  我已经在启用和禁用内部上拉的情况下尝试了这两种方法。

    还有其他想法吗?

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

    肯特

    在单步执行指令之前、您是否已将 SYSRSTIV 清零为0x0000。 确保删除寄存器中先前存储的所有事件。

    当您对 SFRRPCR 进行修改时、您是否检查了是否正确考虑了 PORT28勘误表。
    另外有趣的是、您配置驱动器的引脚是否可能是大于端口规格的灌电流?

    那么、如果您将另一个 IC 从游戏中取出、您还在体验它吗? 请务必不要为任何电压高于 DVCC 的 GPIO 引脚供电、以使电流通过 ESD 二极管流向电源。

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

    很显然、我的硬件损坏了。  eUSCI_A TXD 线可能短路、因此当我尝试在该引脚上启用此功能时、会导致复位。  切换到另一个硬件板后、我没有这个问题。  感谢您的帮助!