主题:C2000WARE 中讨论的其他器件
工具/软件:
您好:
我在 DriverLib 模式下编写了2行代码、如下所示:
GPIO_setPinConfig (GPIO_4_GPIO4);
GPIO_writePin (4、0);
如果它们在 位字段/寄存器级模式中被重新写入、那么它们会是什么?
谢谢!
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.
工具/软件:
您好:
我在 DriverLib 模式下编写了2行代码、如下所示:
GPIO_setPinConfig (GPIO_4_GPIO4);
GPIO_writePin (4、0);
如果它们在 位字段/寄存器级模式中被重新写入、那么它们会是什么?
谢谢!
以下行在 DriverLib 模式下写入:
GPIO_setPinConfig (GPIO_4_GPIO4);
GPIO_setPinConfig (GPIO_5_GPIO5);
GPIO_setPinConfig (GPIO_6_GPIO6);
GPIO_setPinConfig (GPIO_7_GPIO7);
GPIO_writePin (4、0);
GPIO_writePin (5、0);
GPIO_writePin (6、0);
GPIO_writePin (7、0);
我 使用 HWREGH 宏将上述行转换为寄存器模式、但在上述行中的工作方式不同:
EALLOW;
//将 GPIO4–GPIO7配置为 GPIO (清除 GPAMUX1中的相应位)
HWREGH (0x00007C42)&=~μ H (0xFF << 8);//清除位15-8 (GPIO4–GPIO7)
//将 GPIO4–GPIO7设置为输出(设置 GPADIR 中的位4–7)
HWREGH (0x00007C4A)|=(0xF << 4);//设置位4–7
EDIS;
//将 GPIO4–GPIO7输出设置为低电平(清除 GPACLEAR 中的位4–7)
HWREGH (0x00007C2A)=(0xF << 4);
请建议等效 位字段/寄存器级模式代码是什么。 谢谢!
您好:
以下是我建议如何在特定 GPIO 上进行写入:
//
//在 GPIO6上启用 GPIO 输出、将其设置为高电平
//
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;//启用 GPIO6上的上拉电阻
GpioDataRegs.GPASSET.bit.GPIO6 = 1;//负载输出锁存
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;// GPIO6 = GPIO6
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;// GPIO6 =输出
您可以参阅 C2000ware for C2000Warexx\device_support\f28002x\examples\GPIO 以查找一些示例。
此致、
Masoud
谢谢。 请参阅以下内容:
GPIO_setPinConfig (GPIO_4_GPIO4);
GPIO_setPinConfig (GPIO_5_GPIO5);
GPIO_setPinConfig (GPIO_6_GPIO6);
GPIO_setPinConfig (GPIO_7_GPIO7);
GPIO_writePin (4、0);
GPIO_writePin (5、0);
GPIO_writePin (6、0);
GPIO_writePin (7、0);
您好 Quentin、
要回答您的第一个问题、很遗憾、我们没有任何涵盖 DriverLib 到位域代码转换的应用手册或文章。 但是、您可以在同一文件中包含并使用 DriverLib 和 BIT 字段代码以充分利用这两个 API。 有关设置此方法的详细信息、请参阅位于 C:/ti/c2000/C2000Ware_的文件中的第2.3节 /device_support/f28002x/docs/F28002x_FRM_EX_UG.pdf
为了将 DriverLib 代码转换为您正在请求的位域代码、我建议使用该GpioCtrlRegs.GPAxxx.all
方法。 请参阅以下代码:
// Enable pullup on GPIO 4-7 GpioCtrlRegs.GPAPUD.all &= ~((1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)); // Clear Data Regs for GPIO 4-7 GpioDataRegs.GPACLEAR.all |= (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7); // Set up mux for GPIO 4-7 and set GPIO 4-7 to output GpioCtrlRegs.GPAMUX1.all |= (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7); GpioCtrlRegs.GPADIR.all |= (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7);
此致、
Ryan
我已经按照 位于 C:/ti/c2000/C2000Ware_文件的第2.3节中的说明进行了操作 /device_support/f28002x/docs/F28002x_FRM_EX_UG.pdf、如下所示:
=====================
添加 Bitfield 支持
1.将以下 include 目录路径添加到项目中:
device_supportnf28002xnheadersninclude
2.在工程主源文件中包含以下头文件:
device_supportnf28002xnheadersnincludenf28002x_device.h
3.将 f28002x_globalvariabledefs.c 文件添加或链接到工程。 文件位置:
device_supportnf28002xnheadersnsource
4.将 f28002x_headers_nonbios.cmd 文件添加或链接到工程。 文件位置:
device_supportnf28002xnheadersncmd
======================
但它在编译时仍然失败、并显示以下错误:
错误#20:标识符"GpioCtrlRegs"未定义
错误#20:标识符"GpioDataRegs"未定义
尊敬的 Quentin:
只是为了进行确认、在代码顶部、main.c 文件中应该有一行代码、读取结果为
#include "f28002x_device.h"
这将需要包含"C:/ti/c2000/C2000Ware_" /device_support/f28002x/f28002x"/headers/include、在工程的编译器包含选项(在工程属性中设置)。
此外、请确认"f28002x_globalvariablesdefs.c"位于工程文件夹中并包含在构建中。 我要求进行这些检查、因为这两种方法目前是我重新创建编译错误的唯一方法。
此致、
Ryan
您好、Ryan、
感谢您的更新。 我按照您的说明进行了 操作、并确保在我的.c 主文件中添加了"#include "f28002x_device.h"、在我的工程文件夹中添加了"f28002x_globalvariablesdefs.c"。 请查看下面的 CCS 屏幕截图:
但编译仍然失败、并出现以下错误:
===========
>>编译失败
subdir_rules.mk:9:目标'epwm.obj '的配方失败
"../epwm.c"、第2146行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2177行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2199行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2224行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2547行:错误#20:标识符"GpioCtrlRegs"未定义
"../epwm.c"、第2550行:错误#20:标识符"GpioDataRegs"未定义
在编译"../epwm.c"时检测到2个错误。
>>编译失败
subdir_rules.mk:9:目标'QT2_AC_SIDE.obj'的配方失败
"C:/ti/c2000/C2000Ware_3_01_00_00/device_support/f28002x/headers/include/f28002x_lin.h "、第236行:错误#41:需要一个标识符
"C:/ti/c2000/C2000Ware_3_01_00_00/device_support/f28002x/headers/include/f28002x_lin.h、第236行:错误#80:需要一个类型说明符
"C:/ti/c2000/C2000Ware_3_01_00_00/device_support/f28002x/headers/include/f28002x_lin.h "、第236行:错误#170:此处不允许函数类型
"C:/ti/c2000/C2000Ware_3_01_00_00/device_support/f28002x/headers/include/f28002x_lin.h "、第236行:警告#109-D:长度为1的有符号位字段
在编译"../QT2_AC_SIDE.c"时检测到3个错误。
==========
您好、Ryan、
按照您的说明、 从工程文件夹中删除了 f28002x_device.h。 请查看下面的屏幕截图:
但仍然存在如下所示的相同编译错误:
===========================
>>编译失败
subdir_rules.mk:9:目标'epwm.obj '的配方失败
"../epwm.c"、第2146行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2177行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2199行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2224行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2547行:错误#20:标识符"GpioCtrlRegs"未定义
"../epwm.c"、第2550行:错误#20:标识符"GpioDataRegs"未定义
在编译"../epwm.c"时检测到2个错误。
>>编译失败
subdir_rules.mk:9:目标'QT2_AC_SIDE.obj'的配方失败
"C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:错误#41:需要一个标识符
"C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:错误#80:需要一个类型说明符
"C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:错误#170:此处不允许使用函数类型
"C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:警告#109-D:长度为1的有符号位字段
在编译"../QT2_AC_SIDE.c"时检测到3个错误。
===========================
尊敬的 Quentin:
您是否尝试过将代码移至新的位域工程? 我想象一下、您的项目设置中有一个小设置未正确设置、将您的现有代码移植到已知良好的位字段项目可能会更有用。
尝试导入一个新的位字段工程、如 GPIO 或 led 示例(从 "C:/ti/c2000/C2000Ware_ /device_support/f28002x/examples/")复制到您的 CCS 工作区、并将现有代码从 QT2_AC_SIDE 工程复制到这个新工程中。 确保 从编译中排除或完全删除包含 main 函数的原始示例工程源文件(例如 gpio_ex1_setup.c 或 led_ex1_blinky.c)、以防止函数名称发生冲突。
您好、Ryan、
我 从 C:\ti\c2000\C2000Ware_3_01_00_00\device_support\f28002x\examples\gpio 导入了一个示例工程 gpio_ex1_setup、但由于下面的编译错误、失败:
>>编译失败
subdir_rules.mk:16:目标"gpio_ex1_setup.obj"的配置失败
"../gpio_ex1_setup.c"、第55行:致命错误#1965:无法打开源文件"f28x_project.h"
1在编译"../gpio_ex1_setup.c"时检测到灾难性错误。
编译已终止。
gmake:***[gpio_ex1_setup.obj] Error 1
如何解决此问题? 还是有更好的示例工程我应该导入?
谢谢、
Quentin
Quentin、
我刚从 C2000Ware 3.01.00.00中从头开始、遇到了相同的问题。 所有 f28x_project.h 执行的操作包括:
#include "f28002x_device.h" // f28002x Headerfile Include File #include "f28002x_examples.h" // f28002x Examples Include File
这似乎是由 f28002x/common/include 文件夹周围的更大基础问题未正确包含所导致的。 请转到工程属性并选择"CCS Build"。 在"环境"选项卡下、使用添加... 配置。 名称应为 COM_TI_C2000WARE_INSTALL_DIR、值为 ${COM_TI_C2000WARE_software_package_install_DIR}(如果复制粘贴失败、您可以使用 Variables 按钮进行选择)。 选中"Add to all configurations"以应用于所有构建配置。 按"OK"之前、您的输入/窗口应该如下图所示。
这可能是由使用 C2000Ware 版本3.01.00.00 (2020年发布的较旧版本和第一个3.x 版本)引起的。 作为参考、我没有注意到版本5.04.00.00 (最新版本)的相同问题、这是我使用最初提供的位域代码测试编译时使用的问题。
可以通过更新到 C2000Ware 5.04来修复此包含问题。 尽管这会导致当前代码的兼容性问题、但更新到3.04可以解决问题、而不会导致兼容性问题。
此致、
Ryan
您好、Ryan、
非常感谢您的指示! 我向示例工程 gpioCtrlRegs code 添加了"gpioCtrlRegs code" 、可以正常编译。 但是、这是在与"QT2_AC_SIDE"工程不同的 CCS 会话中完成的、因为 "QT2_AC_SIDE"工程的 CCS 与 GIT 绑定、我需要非常小心、以免被破坏。
因此、 "QT2_AC_SIDE"工程的 CCS 中似乎存在一些设置问题。 如何找到两个 CCS 之间的 CCS 设置差异?
Quentin
尊敬的 Quentin:
根据我的理解、如果不使用两个 CCS 实例比较窗口中的设置、人类无法用一种非常容易理解的方法来直接比较设置。 您可以尝试与.settings 文件夹中的文件进行基于文本的比较、但这不是一种人类可读的方法。
要尝试应用到目前为止我们发现的内容,假设我们在位域示例中发现的问题在 Git 工程中是相同的,那么请尝试应用相同的修复。 正如您提到的、您担心现有工程设置的问题、可以将鼠标悬停在工程的 Properties>CCS Build>C2000 Compiler>Include Options 中每个 Include dir 旁边的三个点上、检查 include 设置中是否发生了相同的问题。
如果 C2000WARE_COMMON_include 在弹出窗口("C:/ti/c2000/C2000Ware_3_01_00_00/...")中没有列出完整的目录、我们在位字段示例中之前使用的修复 可能会解决该问题。 请参见下面的图片作为修复后的错误目录列表(第一个图像)和良好的目录列表(第二个图像)的示例:
此致、
Ryan
您好、Ryan、
非常感谢您如此清晰和详细的阐述! 请参阅 下面的"包含选项"和"选择变量"、我只有 COM_TI_C2000WARE_software_package_install_DIR 指向 C:\ti\c2000\C2000Ware_4_01_00_00、而不是 C:\ti\c2000\C2000Ware_3_01_00_00。 您的变量为 COM_TI_C2000WARE_software_package_include_path、它与我的变量不同。
尊敬的 Quentin:
无需担心我会收到电子邮件通知。 我还在让他们站在我身边。
若要直接回答您的问题:
#include "f28x_project.h"中添加一个 include 目录、尤其是在代码中时。 您可以在 Properties>CCSBuild>C2000 Compiler>Include Options 的 Include Options 页面中直接添加带有绿色加号的小页面的 Include dir
此致、
Ryan
您好、Ryan、
非常感谢您的建议! 我按照这两个指示进行了以下操作:
请查看以下屏幕截图:
但仍然存在如下编译错误:
>>编译失败
subdir_rules.mk:9:目标'isr.obj'的配方失败
"C:/Users/Xiaoquan/Documents/JX_CCS_git/JX_DS3_280025gitRepository/QT2_AC_side/device/driverlib.h "、第63行:致命错误#1965:无法打开源文件"ERAD .h"
1在编译"../isr.c"时检测到灾难性错误。
编译已终止。
尊敬的 Quentin:
如果其他编译问题已消除、我们有望最后完全解决这个问题!
似乎只有在版本 C2000Ware v4.x 之后、erad.h 才会包含在 C2000Ware 中 因此、要解决该问题、请转换所有对"C:/ti/c2000/C2000Ware_3_01_00_00/..."的引用 并将 dirs 添加到"C:/ti/c2000/C2000Ware_4_01_00_00/..."。
根据我能说的、这需要将 COM_TI_C2000WARE_software_package_install_DIR 更改回原始地址("C:/ti/c2000/C2000Ware_4_01_00_00)、并将新添加的"C:/ti/c2000/C2000Ware_3_01_00_00/device_support/f28002x/common/include "更改为"C:/ti/c2000/C2000Ware_4_01_00_00/device_support/f28002x/common/include "。
此致、
Ryan
您好、Ryan、
感谢您的建议。 我跟踪了它们、但仍然出现了一些编译错误。
请在下面查看我的设置:
但仍存在如下所示的编译错误:
=============
>>编译失败
subdir_rules.mk:9:目标'f28002x_globalvariabledefs.obj'的配方失败
"../f28002x_globalvariabledefs.c"、第256行:错误#237:变量"DcsmCommon2Regs"是以从未完成的类型声明的
1在编译"../f28002x_globalvariabledefs.c"时检测到错误。
gmake:***[f28002x_globalvariabledefs.obj]错误1
>>编译失败
subdir_rules.mk:9:目标'epwm.obj '的配方失败
"../epwm.c"、第2146行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2177行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2199行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2224行:警告#190-D:枚举类型与另一种类型混合
"../epwm.c"、第2547行:错误#20:标识符"GpioCtrlRegs"未定义
"../epwm.c"、第2550行:错误#20:标识符"GpioDataRegs"未定义
在编译"../epwm.c"时检测到2个错误。
>>编译失败
subdir_rules.mk:9:目标'QT2_AC_SIDE.obj'的配方失败
"C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:错误#41:需要一个标识符
"C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:错误#80:需要一个类型说明符
"C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:错误#170:此处不允许使用函数类型
"C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f28002x\headers\include\f28002x_lin.h"、第236行:警告#109-D:长度为1的有符号位字段
在编译"../QT2_AC_SIDE.c"时检测到3个错误。
gmake:***[QT2_AC_SIDE.OBJ]错误1
gmake:由于错误、目标"全部"未重制。
****构建完成****
=============
您好 Quentin、
鉴于尝试组合位域和 DriverLib 时仍然存在问题、我认为最好恢复到我们知道的之前版本。 我在 HWREGH 宏早期回顾了您的代码、似乎有一些小错误导致代码无法正常工作、并引导我们一开始仅使用 DriverLib。
我相信您提到该项目保存在版本控制软件下。 如果是、请恢复到已知最早的良好编译版本、并使用以下代码替换您之前拥有的 HWREGH 代码:
EALLOW; // Configure GPIO4–GPIO7 as GPIOs (Clear corresponding bits in GPAMUX1) HWREGH(GPIOCTRL_BASE + 0x6) &= ~(0xFF << 8); // Clear bits 15-8 (GPIO4–GPIO7) // Set GPIO4–GPIO7 as outputs (Set bits 4–7 in GPADIR) HWREGH(GPIOCTRL_BASE + 0xA) |= (0xF << 4); // Set bits 4–7 EDIS; // Set GPIO4–GPIO7 output to LOW (Clear bits 4–7 in GPACLEAR) HWREGH(GPIODATA_BASE + 0x4) |= (0xF << 4);
现在、仅使用 DriverLib 时应该可以正常工作、并避免了我们在尝试包含位字段时遇到的冲突问题。
此致、
Ryan
您好、Ryan、
感谢您的建议! 但是、我有以下两个问题:
1.我回到已知最早的良好编译版本,使用以下代码:
EALLOW;
//将 GPIO4–GPIO7配置为 GPIO (清除 GPAMUX1中的位8–16)
HWREG (GPIOCTRL_BASE + 0x06)且= 0xFFFF00FF;
//将 GPIO4–GPIO7配置为输出(设置 GPADIR 中的位4–7)
HWREG (GPIOCTRL_BASE + 0x0A)|= 0xF0;
//将 GPIO4–GPIO7输出设置为低电平(将 GPACLEAR 中的位4–7设置)
HWREG (GPIODATA_BASE + 0x04)|= 0xF0;
EDIS;
并将上面的代码替换为下面建议的代码:
EALLOW;
//将 GPIO4–GPIO7配置为 GPIO (清除 GPAMUX1中的相应位)
HWREGH (GPIOCTRL_BASE + 0x6)&=~μ H (0xFF << 8);//清除位15-8 (GPIO4–GPIO7)
//将 GPIO4–GPIO7设置为输出(设置 GPADIR 中的位4–7)
HWREGH (GPIOCTRL_BASE + 0xA)|=(0xF << 4);//设置位4–7
EDIS;
//将 GPIO4–GPIO7输出设置为低电平(清除 GPACLEAR 中的位4–7)
HWREGH (GPIODATA_BASE + 0x4)|=(0xF << 4);
它确实可以正常编译。 然而、这似乎是有问题的。 例如、要将 GPIO4–GPIO7配置为 GPIO (清除 GPAMUX1中的相应位)、我应该执行"HWREG (GPIOCTRL_BASE + 0x06)&= 0xFFFF00FF "(根据图8-7)。 GPAMUX1寄存器:
但是、您建议的代码"HWREGH (GPIOCTRL_BASE + 0x6)&=~(0xFF << 8)"等效于" HWREGH (GPIOCTRL_BASE + 0x6)&= 0x000000FF "、这似乎不正确。
2.最重要的是,我的目标是用位域/寄存器级模式代码替换 HWREGH 代码,如您建议的 GpioDataRegs.GPACLEAR.all 等 我该怎么做?
根据我们的测试、以下代码正确并满足了我们的需求:
EALLOW;
//将 GPIO4–GPIO7配置为 GPIO (清除 GPAMUX1中的位8–16)
HWREG (GPIOCTRL_BASE + 0x06)且= 0xFFFF00FF;
//将 GPIO4–GPIO7配置为输出(设置 GPADIR 中的位4–7)
HWREG (GPIOCTRL_BASE + 0x0A)|= 0xF0;
//将 GPIO4–GPIO7输出设置为低电平(将 GPACLEAR 中的位4–7设置)
HWREG (GPIODATA_BASE + 0x04)|= 0xF0;
EDIS;
上述代码等效于以下代码:
GPIO_setPinConfig (GPIO_4_GPIO4);
GPIO_setPinConfig (GPIO_5_GPIO5);
GPIO_setPinConfig (GPIO_6_GPIO6);
GPIO_setPinConfig (GPIO_7_GPIO7);
GPIO_writePin (4、0);
GPIO_writePin (5、0);
GPIO_writePin (6、0);
GPIO_writePin (7、0);
但我们的 目标是将 HWREGH 代码替换为位字段/寄存器级模式代码、如您建议的 GpioDataRegs.GPACLEAR.ALL 等 我们如何做到这一点?