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.

[参考译文] 编译器/TMS320F28075:字节外设访问和相关类型

Guru**** 2590250 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/666393/compiler-tms320f28075-byte-peripheral-accesses-and-associated-types

器件型号:TMS320F28075
Thread 中讨论的其他器件:controlSUITEC2000WARE

工具/软件:TI C/C++编译器

大家好、

我正在使用 F28075并尝试了解字节外设的工作原理。 我的目标是使 DCAN 外设正常工作。

我只有一个示例代码位于 controlSUITE/DEVICE_SUPP支 架/F2807x 目录中。 我在论坛上看到用户提到了 C2000Ware我应该使用以下哪些库作为起点、其中一个库的维护效果比另一个库更好?

我有 TMS320F2807x 技术参考手册 、它在21.3.1章节中只提供了以下信息:

注意:CAN 模块使用一个特殊的寻址方案来支持字节访问。 这与 USB 模块上使用的寻址相同。 为了便于使用、建议只对 CAN 寄存器进行32位访问。 但是、在更高的优化级别、编译器可能会将32位访问拆分为两个连续的16位访问、这将损坏寄存器值。 正在开发编译器修复程序。 同时、16位访问可被用作一个权变措施。 低16位应写入寄存器的地址、高16位应写入寄存器的地址加2。

我正在禁用所有优化、因此我认为我可以强制执行32位访问(MOVL 指令)、但我不介意在必要时使用16位访问权的权变措施。 但是、我想知道对调试器和表达式窗口的影响是什么。 调试器是否能够显示 DCAN 寄存器的正确值?

3.我还有《TMS320C28x 优化 C/C++编译器 v18.1.0.LTS 用户指南》、我正在尝试理解第6.14.6."使用字节外设类型属性"一章、但我无法理解。 是否有更详细的解释?

这句话的意思是: "字节外设桥通过将地址视为字节地址来转换 CPU 和字节外设之间的地址。"? 这是否意味着当您对字节外设中的地址进行16位写入时、该值在8位处被截断?

谢谢、

皮埃尔

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

    1. C2000Ware 是新软件包,请使用该软件包。 ~具体而言、请确保使用根目录下的库和示例
    2. driverlib 将使用__byte_peripheral_32内在函数来处理,这是访问此类外设的最佳方式。 是的、您应该在调试器窗口中看到正确的值。
    该指南中的信息最多。 内部基本阻止代码将32位转换为两个与字节桥混乱的16位访问。 CAN 使用字节寻址、因此两个地址访问将拆分数据、其中第二个访问将转到错误的地址。
    e2e.ti.com/.../1586639
    processors.wiki.ti.com/.../MCU_Compiler_v15

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

    Christopher、

    1.我想更好地了解字节桥的功能和工作原理,这种信息是否在某个地方提供?

    2.您写道:“可以使用字节寻址,因此两次地址访问将拆分数据,第二次访问将转到错误的地址。” 我不明白"两个地址访问将如何拆分数据、而第二个访问将转到错误的地址""可以使用字节寻址"的结果。  您能解释一下吗?

    谢谢、

    皮埃尔

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

    最重要的是、使这些字节寻址外设与 C28字寻址架构兼容。 我不知道我们对此有任何进一步的资料。
    当32位写入被拆分为两个16位写入时(在我提到的修复之前)、第一个16位字被写入地址0x0、比如从填充地址0x0和0x1的字节寻址视图中写入地址0x0。 然后、下一个高16位字被写入字节地址0x1 (而不是按预期填充0x2和0x3)、这会使数据混乱。 这些修复程序会调整字和字节地址之间的转换、以便将其写入各自的位置。

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

    Christopher、

    在对这一点进行了一些思考之后、我相信我已经开始更好地了解它的工作原理。 如果使用 MOV 指令在字节外设的奇数地址上执行16位写操作(例如、示例中的0x1)、数据是否以确定性的方式混乱或完全未定义的行为?

    CPU 是否支持使用 MOVB 指令写入字节外设? 首先、我认为__byte()内在函数会起作用、但参数类型不匹配;如果我尝试将带有 byte_peripheral 属性的类型转换为预期的 int *,编译器会发出警告"非法使用内在函数:__byte_peripheral_32"。

    谢谢、

    皮埃尔

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

    是的、它是确定性的。

    支持 byte 内在函数。 它在 CAN_writeDataReg 和 CAN_readDataReg 驱动程序 API 中使用(请参阅 CAN.h)。 我建议查看驱动程序源代码以了解如何使用这些内在函数。 HWREG_BP 使用 byte_peripheral_32内在函数、并且宏在 hw_types.h 中定义

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

    Christopher、

    HWREGB 宏既不依赖__byte_peripheral_32也不依赖 byte_peripheral  属性,因为它通过其原始地址访问寄存器。 现在 TI 已经解决了添加这些功能的难题、以便编译器能够将位字段映射到 CAN 寄存器。它感到很奇怪、执行某些操作的唯一方法是使用数百个预处理器宏将它们别名。

    无论如何、我不会使用宏、因为没有宏就可以正常工作-我非常感谢 C2000Ware 中的 CAN_loopback_bitfield 示例。

    此致、

    皮埃尔