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:如何使用 GCC 将20位地址写入外设寄存器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1189770/msp430fr5994-how-to-write-20-bit-address-into-peripheral-register-with-gcc

器件型号:MSP430FR5994

我使用的是 gcc 版本9.3.1 (Mitto Systems Limited - MSP430-gcc 9.3.1.11)。 我有一个20位地址、例如0x1ABCD、我想将其写入 DMA1DA。 例如、我要执行如下操作:

long unsigned int addr = 0x1ABCDUL;
DMA1DA = addr;

但是、很显然、地址不会将其放入 DMA 寄存器中。 对于16位地址、这起作用:

DMA1DA = 0xABCD;
if (DMA1DA == 0xADCD)
  printf("OK");

它打印"确定"。 但具有20位地址

DMA1DA = 0x1ABCDUL;
if (DMA1DA == 0x1ADCDUL)
  printf("OK");

不奏效。

我尝试将地址转换为类型,但没有任何作用。

如何获得一个存储在变量(例如无符号长整型)中的20位地址到像带有 GCC 的 DMA1DA 这样的寄存器中?

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

    与任何其他32位变量一样、编译器将生成两个16位写入以将32位值放入存储器。 要使其使用所需的 MOVA 或 MOVx.a 指令(16位写入始终清除 DA 或 SA 寄存器的高字)、需要使用内在函数 void __data20_write_long (unsigned long addr、unsigned long src);手册中提到:slau646。

    生成的汇编代码并不是很好。 或快速。