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:编译器警告将 UART 寄存器分配给 DMA 寄存器(CCS12在 MSP430FR59xx 上与 v21.6.0.0搭配使用)

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1136191/msp430fr5994-compiler-warning-assigning-uart-register-to-dma-register-ccs12-with-to-v21-6-0-on-msp430fr59xx

器件型号:MSP430FR5994

尊敬的所有人:

我认为这是一个简单的问题、并给出了快速的答案... 但我已经搜索了相当长的一段时间、没有任何更改。 因此、我希望有人能帮助我。

我想要的:

将寄存器的地址设置为其他寄存器的值。 为了更加精确、例如将 DMA 的目的寄存器设置为 UART 输出缓冲寄存器。 “应该”如下所示:

DMA0DA = &UCA1TXBUF;

我得到的结果:

编译器警告,这很可能是真正的错误,例如“无法将类型 xxxx 的值分配给类型为“__SFR_FARPRT”的实体。

我已经尝试过的:

我得到这可能是因为我尝试将一个16位地址(UART 缓冲地址)写入32位(实际20位)寄存器… 因此、我尝试了各种不同的类型、例如:

DMA0DA = (uintptr_t *) &UCA1TXBUF;

此外、编译器指南还建议"ptrdiff_t"或"数据指针"、这两个都是编译器未知的...

我希望有人能帮助我解决我的误解。

祝你一切顺利、

托比亚斯

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

    编译器在分配该任务时遇到问题。 它将一个32位值作为两个16位写入写入写入存储器、这会管理 DMA 地址。两个选项:

    提供了帮助程序函数来编写长地址:__data20_write_long

    使用16位版本的寄存器:DMA0DA_L

    UART 寄存器对此没有问题、因为其高位为零。

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

    尊敬的 David:

    非常感谢您的回复! 遗憾的是它没有帮助... 我尝试提供更多的代码和确切的警告-可能会有所帮助。


    volatile unsigned char uart_tx_buffer[20]="Test";
    
    DMA0DAL = &UCA1TXBUF;     //DMA channel 0 destination address is TX-Output-Buffer   - write 16bit address into low 16 bits of 32bit address
    DMA0SA =  (uart_tx_buffer + 1);     //DMA channel 0 source address is address of second element and up (buffer[1])

    所有代码中的第一个代码运行正常、但我担心警告并希望正确编码。 我有一个全局字符数组、这些字符可能会被中断更改、所以这个数组应该是易失的、对吧?

    我已尝试在 DMA0DA 寄存器的低两个字节中写入建议、并收到警告:无法将"volatile unsigned int *"类型的值分配给"unsigned int"类型的实体

    我认为问题可能是 UCA1TXBUF 使用默认的#define "SFR_16BIT (address)"。。 还有其他建议吗?

    在第三行中、我收到类似的警告:无法将"volatile unsigned char *"类型的值分配给类型为"_SFR_FARPTR"的实体

    在这里、我无法使用您的建议仅写入低16位。 我是否可以假设这是建议的代码:

    __data20_write_long(DMA0SA, uart_tx_buffer + 1);

    因此、我现在还会收到警告:类型"_SFR_FARPTR"的参数与类型为"unsigned long"的参数不兼容。

    感谢您的帮助!

    祝托比亚斯一切顺利

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

    DMA 地址寄存器是一个奇数鸭子、因为如果你不使用 MOVA (或 MOV.A)指令、DMA 地址的高16位将被设置为零。 这会在编译器使用两个16位写入时引起问题、就像对任何32位写入一样。 函数(data20*)是唯一实现此目的的方法,但它们是不一致的。 (查看生成的代码。) 如果您想消除警告、则必须四处寻找使编译器满意的内容。 转换为任何类型都会将其关闭。

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

    以下是示例 msp430fr599x_dma_01.c 实现该功能的方式:

    >__data20_write_long ((uintptr_t)&DMA0SA、(uintptr_t) 0x1C20);

    我不知道为什么作者觉得需要"魔术常数"--没有理由不能是"(uintptr_t)(UART_TX_buffer+1)"。

    https://dev.ti.com/tirex/explore/node?node=ACXdYpuLv5865Z2qDAo.Dw__IOGqZri__LATEST

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

    尊敬的 David:

    感谢您的澄清。

    "任何类型的转换都会将其关闭。"

    UFF 有点令人不安或不满足... 但这似乎是一个解决方案->无论如何都要感谢。

    祝你一切顺利

    托比亚斯

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

    尊敬的 Bruce:

    感谢您提供所附的链接。 它确实很有帮助、现在编译器很高兴...

    关于 David 的"clunky"部分:我想我不应该过于频繁地使用__data20函数。 但是、如果地址可以是20位、没有更好的方法、或者?

    使用此函数有多糟糕-因为我的汇编器技能几乎不存在? 有趣的是、当我使用32位时、编译器也不高兴... 将为寄存器分配一个20位地址、该地址最高可达32位、甚至可以正常工作、还是我正确地理解了 David、它将被混合和截断?

    感谢您的帮助和至少一个"编译器满意"解决方案!

    祝你一切顺利

    托比亚斯