主题中讨论的其他器件: 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 ();
}