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.
在 Linux 上、我安装了 UniFlash 和 ARM-none-eabi-gcc。 我一直在努力、但没有成功地提供一种使用 sci 在串行终端上提示输入的方法、这与 Launchpad Project_1示例的工作方式类似:
void sciDisplayText (sciBASE-t * sci、uint8 *文本、uint32长度);
请参阅 :/Launchpad/RM/RM46L8/Project_1中的 git.ti.com/.../master 我使用的是 ARM-none-eabi-gcc --version:
arm-none-eabi-gcc (用于 Arm 嵌入式处理器8-2019-Q3-update 的 GNU 工具) 8.3.1 20190703 (版本)[gcc-8分支版本273027]
(我在另一个方框上还有 arm-none-eabi-gcc (Arch Repository) 9.2.0 -相同的结果)
我正在使用以下源代码,并为...Init()函数构建所有必需的源代码:
#include
#include "Application_Types.h"
#include "sys_selftest.h"
#include "sci.h"
#include "Gio.h"
#include "rti.h"
#include "het.h"
#include "adc.h"
extern void sciDisplayText (sciBASE-t * sci、uint8 *文本、uint32长度);
Button User1 =无、User2 =无;
uint32 g_PotReading = 468750;
int main (void){
char *s ="Hello World!\r\n";
gioInit();
hetInit();
adcInit();
adcCalibration (adcREG1);
rtiInit();
sciInit();
mibspiInit();
mibspiREG3->PC0 &= 0xFFE;//CS0为 GIO
mibspiREG3->PC1 &= 0x6FE;//CS0为输入
mibspiREG3->PC8 |= 0x1; //上拉 CS0
sciDisplayText (scilinREG,(uint8*)s, 105);
sciDisplayText (scilinREG、(uint8*)"全部完成...\r\n"、105);
返回0;
}
(我一开始只使用 sciInit(),然后添加了额外的...Init()函数,以防包含必要的定义以阻止打印,而编译器或链接器不会标记这些定义)
我使用以下编译字符串:
arm-none-eabi-gcc -March =armv7-r --specs=nosys.specs --specs=nan.specs -o hello.out hello.c sci.c mibspi.c rti.c sys_vim.c ESM.c sys_phantome.c support_functions.c notification.c sys_dma.c gc.c gio -c gc.c rc.c rc.c rma.c rc.c
代码已成功编译为可执行文件:
$文件 hello.out
hello.out:ELF 32位 LSB 可执行文件、ARM、EABI 版本1 (SYSV)、静态链接、未剥离
闪存成功而不会出现问题:
$./dslite.sh -c ~/doc/arm/ti_rm46x/RM46L852.ccxml -e /home/david/dev/src-c/tmp/arm/prj01/hello.out
执行以下命令:
>/opt/ti/uniflash_5.1.0/deskdb/content/TICloudAgent/linux/ccs_base/DebugServer/bin/DSLite flash -c /home/david/doc/arm/ti_rm46x/RM46L852.ccxml -e /home/david/dev/src-c/tmp/arm/prj01/hello.out
有关更多详细信息和示例、请参阅《UniFlash 快速入门指南》。
DSLite 版本9.2.0.1723
正在配置调试器(首次启动可能需要几分钟时间)...
正在初始化寄存器数据库...
正在初始化:IcePick
执行启动脚本:IcePick
正在初始化:DAP
执行启动脚本:DAP
正在初始化:CortexR4
执行启动脚本:CortexR4
正在连接...
CortexR4:GEL 输出: 闪存的存储器映射设置@地址0x0Loading 程序:/home/david/dev/src-c/tmp/arm/prj01/hello.out
正在准备...
CortexR4:GEL 输出: 由于系统复位、闪存@地址0x0的存储器映射设置
.text:0x94处66556的0
正在擦除闪存
擦除组0、扇区0
擦除组0、扇区1:4%
擦除组0、扇区2:9%
擦除组0、扇区3:13%
擦除组0、扇区4:18%
擦除组0、扇区5:22%
擦除组0、扇区6:27%
擦除组0、扇区7:31%
擦除组0、扇区8:36%
擦除组0、扇区9:40%
擦除组0、扇区10:45%
擦除组0、扇区11:50%
擦除组0、扇区12:54%
擦除组0、扇区13:59%
擦除组0、扇区14:63%
擦除组0、扇区15:68%
擦除组7、扇区0:77%
擦除组7、扇区1:81%
擦除组7、扇区2:86%
擦除组7、扇区3:90%
.text:32748 of 66556 at 0x94:48%
.text:65500 of 66556 at 0x94:96%
.data:0 of 1052 at 0x20490:98%
完成:98%
CortexR4:GEL 输出: 由于系统复位、闪存@地址0x0的存储器映射设置
将 PC 设置为入口点:98%
正在运行...
成功
但是、当通过串行控制台(使用通信参数19200 N82连接到/dev/ttyACM0)连接时、不会产生输出。 刷写 project1_RM46x.out 可执行文件、立即恢复控制台输出)。 所以我被骗了。 我已经查看了源文件和头文件,以确保我的示例以相同的方式接近控制台输出-- 实际上、使用相同的代码、但我必须在编译或链接过程中缺少一些基本内容、这样生成的可执行文件不会提供与 Project_1示例相同的串行输出。
我愿意接受所有建议、但我看不到 CCS 将会执行什么操作、从而导致一个输出为 arm-none-eabi-gcc 和 ld 的正常 Project _1。 如果有任何帮助,将不胜感激。 我已在 TI.com 上浏览过示例和文档、但未找到缺失的部分。
您好!
从纯工具的角度来看、最好的技巧是仔细比较演示项目和新项目的编译器和链接器选项-可能有一个开关导致代码无法正确地从复位状态中退出、或者可能错过了代码。 此外、比较链接器脚本、尤其是阻止删除代码的中断服务例程上的 retain 修饰符。
这将是我的主要关注点、因为所有其他辅助组件(终端、调试探针、CCS)似乎都已正确配置、 否则问题将在您的设置中的其他位置发生。
很明显、从器件/串行端口配置来看、我需要比我在器件本身更有经验的其他人的帮助。 我会通知他们。
希望这对您有所帮助、
拉斐尔
P.S. 我无法从 Git 树下载演示代码-不知怎么说、tarball 永远不会生成-否则我会在这里进行比较。
David、
您是否有可连接到此设置并检查 MCU 程序计数器所在位置的仿真器? 什么是波特率设置? 我们建议您使用基于仿真器的方法来查看代码执行情况、而不是使用 uniflash。 由于编译器资质审核套件的可用性、我们通常使用这些器件支持 TI ARM 编译器、该套件使用户能够使用合格的编译器开发功能安全应用。我们的 Halcogen/CCS 工具除了支持 TI 工具之外、还支持 GCC 和 IAR 工具链。
我n`t 了您的构建、我没有看到任何引脚多路复用(IO 多路复用器设置)、PMM (电源域)、MPU 和系统启动 ASM 文件、这些文件配置 MCU 初始状态、包括引导/中断矢量、MPU 中的存储器区域、高速缓存配置 等 您能解释一下在何处执行此初始化吗? 我在 CCS 中随附了 Project 1编译器的完整日志、因此您可以了解编译中使用的所有文件。
e2e.ti.com/.../0121.project_5F00_1_5F00_build_5F00_log.txt
在开始创建基于 SCI 的串行工程之前、它可能有助于获取具有标准 IO printf 的基准 Hello World 工程、以确认内核设置正确、并且您能够按预期初始化器件。
请查看其他一些 E2E 文章、这些文章介绍了在 Hercules MCU 平台上使用 GCC 工具链的过程:
此致、
Rahul
Rahul、
感谢你的答复。 我需要注意的一点是、在 MCU 上、Project_1代码从0x0开始、当我使用 ARM-none-eabi-gcc 和 UniFlash 进行编译/加载时、代码从0x94开始。 我对独立式 ARM 器件的经验不是很丰富、但在 x86 (以及之前的8086)方面拥有30年的经验。 我认为您的钱是对的、因为有一个链接器/加载器选项在场景优化后的某个地方或某些地方被错过、删除了相关代码。 我确实在 Windows 上安装了 CCS、但我实际上从未使用 Windows (自 Mandrake 以来、SUSE 7.0以及过去十年的 Archlinux 和 openSUSE)。 我可以在那里工作、了解更多正在发生的情况。
为了实际学习电路板(而不是学习在电路板上运行的工具)、我尝试将调用串行 I/O 逐件所需的代码组合在一起、并将其归结为所需的最小值。 至少在我的工程师中、这似乎是让学习最快发生的原因(一个好例子、ABI 开启)
我将返回并进一步深入研究项目文件、链接器脚本和启动汇编文件、以查看错过的内容。 我的印象(也许是错误的)是,如果上面编译的代码没有错误,它将包含 MCU 所需的启动文件,或者我希望编译/链接失败。 我的项目目录中有系统启动 asm 文件文件、但我没有在编译字符串中明确包含这些文件。 让我启动窗口并打开 CCS,看看我是否能找到差异--我会报告。 再次感谢你能抽出时间。