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.

[参考译文] MSP430FR5969:将0x10000以上的 FRAM 与 MSPGCC 4.6.3配合使用

Guru**** 2560390 points
Other Parts Discussed in Thread: MSP430FR5969, ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/695611/msp430fr5969-using-fram-above-0x10000-with-mspgcc-4-6-3

器件型号:MSP430FR5969
主题中讨论的其他器件: Energia

如果对使用 Energia/MSPGCC 4.6.3和 MSP430FR5969的任何其他人都有帮助、我们使用以下例程将存储器块复制到0x10000以上的 FRAM 中或从 FRAM 中复制存储器块。  出于某种原因、如果在传输过程中未禁用看门狗计时器、则会出现错误。  如果有人能解释原因、那么了解这一点会很有用。

void HIGHMEM_read (uint32_t srcaddr、void *dstaddr、uint16_t len){

disableWatchdog();//确保 DMA 期间没有看门狗中断

DMA2CTL &=~(DMAEN | DMAIFG);
DMACTL1 =(DMACTL1和0xFF00)| DMA2TSEL_0;
DMA2SZ = len;

asm volatile (
"rlam.a #4、%B[srcaddr]\n\t"//高16位需要移位
"rlam.a #4、%B[srcaddr]\n\t"//高16位需要移位
"rlam.a #4、%B[srcaddr]\n\t"//高16位需要移位
"rlam.a #4、%B[srcaddr]\n\t"//高16位需要移位

"Adda %B[srcaddr]、%a[srcaddr]\n\t\t"/>与低16位相结合
"\n\t"
"movx.a %a[srcaddr]、&_DMA2SA \n\t"
"movx.a %[dstaddr]、&_DMA2DA \n\t"
:[srcaddr]"+r"(srcaddr)
:[dstaddr]"r"(dstaddr)
:);


DMA2CTL = DMAEN | DMADD_1 | DMASRCINCR_3 | DMADSTINCR_3 | DMASBDB;
DMACTL4 = DMARMWDIS;
DMA2CTL |= DMAREQ;
while (!(DMA2CTL 和 DMAIFG))


//完成
DMA2CTL &=~DMAIFG;

//interrupts ();
enableWatchDog ();


void HIGHMEM_write (uint32_t dstaddr、void *srcadr、uint16_t len){
//复制 每个从 srcaddr[]到 dstaddr[]的传输以1字节为单位的字节
如果 (!len)返回;

disableWatchdog();//确保 DMA 期间没有看门狗中断


DMA2CTL &=~(DMAEN | DMAIFG);
DMACTL1 =(DMACTL1和0xFF00)| DMA2TSEL_0;
DMA2SZ = len;
asm volatile (
"rlam.a #4、%B[dstaddr]\n\t"//高16位需要移位
"rlam.a #4、%B[dstaddr]\n\t"//高16位需要移位
"rlam.a #4、%B[dstaddr]\n\t"//高16位需要移位
"rlam.a #4、%B[dstaddr]\n\t"//高16位需要移位
"Adda %B[dstaddr]、%a[dstaddr]\n\t"//与低16位组合
"\n\t"
"movx.a %[srcaddr]、&_DMA2SA \n\t"
"movx.a %a[dstaddr]、&_DMA2DA \n\t"
:[dstaddr]"+r"(dstaddr)
:[srcaddr]"r"(srcaddr)
:);
DMA2CTL = DMAEN | DMADD_1 | DMASRCINCR_3 | DMADSTINCR_3 | DMASBDB
| DMALEVEL_L;
DMA2CTL |= DMAREQ;
while (!(DMA2CTL 和 DMAIFG))

//完成
DMA2CTL &=~DMAIFG;
enableWatchDog ();

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

    快速查看您的代码后、我发现您不使用 WDT。
    当然、我的声明与上述代码相关、而不是与您的整个项目相关。

    经验法则:如果您不使用它、请禁用它。

    关于 WDT:
    看门狗定时器(WDT_A)模块的主要功能是在之后执行受控的系统重启
    出现软件问题。 如果选定的时间间隔到期、则会生成系统复位。 看门狗功能
    在应用中不需要时、该模块可配置为间隔计时器并可生成中断
    所选时间间隔。

    关于 DMA:
    在一个块传输期间、CPU 被暂停、直到整个块被传输。 块传输需要的时间
    (2×MCLK×DMAxSZ)到完成的时钟周期。 CPU 执行在块之后以其之前的状态恢复
    传输完成。

    我还记得、DMA 块传输也会被 WDT 中断。
    您可以检查并回复吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Tomasz。

    据我所知、Energia 始终使用看门狗计时器作为间隔计时器来计数毫秒。 我认为、即使看门狗计时器配置为间隔计时器、也必须正确看门狗计时器会中断 DMA 传输、但我不确定文档中的内容是什么。 我的代码的一个副作用是它会对由 millis()返回的 Energia 毫秒计数引入一些不精确的情况。

    此致

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

    说:我还记得、DMA 块传输也会被 WDT 中断、
    我想 WDT 用作看门狗、而不是计时器。
    当发生定时器功能时、WDT 作为看门狗运行会产生系统中断。
    很抱歉、有误导性的说法。

    我不知道 Energia。 Energia 不是 TI 产品、在该门户上、有时很难快速找到答案。
    正如我所记得的、Energia 支持的最佳地点是 www.43oh.com 上的论坛

    此 pdf 涵盖了您可能需要的所有详细信息:WDT、DMA、中断。
    www.ti.com/.../slau367o.pdf