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.

[参考译文] CCS/CC1312R:在调试时 UART 打印功能正常、但在刷写电路板时不能正常工作

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/811817/ccs-cc1312r-uart-print-works-fine-when-debugging-but-not-when-board-is-flashed

器件型号:CC1312R
主题中讨论的其他器件: UNIFLASH

工具/软件:Code Composer Studio

我在定制板上使用 CC1312R 芯片、并在刷写时使电路板正常工作存在问题。 我使用 的是 simplelink cc13x2_26x2_SDK 版本3.10.01.11。

当我使用 CCS 中的调试功能和 XDS110调试探针时、芯片会像应该那样通过 UART 发送数据。 但是、当我将.bin 刷写到芯片中时、我无法通过 UART 打印任何内容(这是查看电路板是否正在运行的唯一方法)。

我在从调试探针刷写和断开连接一次之后、已通过 UART 进行打印、但此后无法打印。

我将在 post-build 步骤中使用"${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin.bat ""${BuildArtiftFileName}"${BuildArtifactFileBaseName}_X_xx.bin""${CG_TOOL_ROOT}/bin/ofd470.exe ""${CG_TOOL_ROOT}/bin/hex470.exe ""${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin.exe 生成.bin。

另一个可能相关的问题是,当调试少数特定的 System_printf()调用时,有时我会通过 UART 获取垃圾值(只是一个简单的“从这里获取”字符串)。 问题似乎间歇性地发生。  

我的代码如下:  

/*!
*@简介 主任务函数
*
*@param A0 -
*@param A1 -
*/
void
appTaskFxn (UARg a0、UARg A1)
{
int32_t retval = 0;


#ifndef power_MEAS
#if defined (Board_display_use_UART)
//初始化 UART0以进行制造商配置并测试
UART_init ();//调用 simplelink SDK

/*启用 System_printf (..) UART 输出*/
UART_PARAMS_INIT (&uartParams);

uartParams.波特 率= 9600;
//将 UART 设置为读取超时。 readTimeout 单元是系统时钟节拍。
// clock_tick_period 以微秒为单位。
uartParams.readTimeout
= UART_READ_TIMEOUT_seconds
*(microseconds_per_second / clock_tick_period);
uartParams.writeDataMode = UART_DATA_binary;
uartParams.readDataMode = UART_DATA_binary;

// Echo 会导致外部自动测试设备出现故障。
uartParams.readEcho = UART_ECHO_OFF;
uartCfg = UART_OPEN (Board_UART0、&uartParams);
//如果 UART_OPEN 失败
(uartCfg = NULL)
则停止{
while (1)
{
;
}
}
UartPrintf_init (uartCfg);
#endif // Board_display_use_UART */
#endif // power_MEAS *


///??? BIOS_start 似乎清除了 RTC,所以初始化需要
//延迟
//??? 需要连接主机计算机时间(&secs_1970);
//??? HWREG (AON_RTC_BASE + AON_RTC_O_SEC)= secs_1970;

#ifdef TIMAC_AGAMA_FPGA
/* FPGA Build 禁用功率限制*/
power_setConstraint (PowerCC26XX_IDLE_PD_Disallow);
power_setConstraint (PowerCC26XX_SB_disallow);

IOCPortConfigureSet (IOID_20、IOC_PORT_RFC_GPO0、IOC_STD_OUTPUT);
IOCPortConfigureSet (IOID_18、IOC_PORT_RFC_GPI0、IOC_STD_INPUT);
//配置射频内核 SMI 命令链路
IOCPortConfigureSet (IOID_22、IOC_IOCFG0_PORT_ID_RFC_SMI_CL_OUT、IOC_STD_OUTPUT);
IOCPortConfigureSet (IOID_21、IOC_IOCFG0_PORT_ID_RFC_SMI_CL_IN、IOC_STD_INPUT);

#endif

#ifndef OSAL_PORT2TIRTOS
/*初始化 iCall 模块*/
iCall_init();
#endif
////*从 CCFG 区域复制扩展地址*//
memcpy (ApiMac_extAddr、(uint8_t *)&(__ccfg.CCFG_IEEE_MAC_0),
// (APIMAC_SADDR_EXT_LEN / 2));
// memcpy (ApiMac_extAddr +(APIMAC_SADDR_EXT_LEN / 2)、(uint8_t *)&(_ccfg.CCFG_IEEE_MAC_1)、
// (APIMAC_SADDR_EXT_LEN / 2));

/*检查 CCFG IEEE 是否有效*//
只需使用硬件地址。 忽略 ccfg 文件中的内容。
// if (memcmp (apiMac_extAddr、dummyExtAddr、APIMAC_SADDR_EXT_LEN)=0)
{
/*否,它无效。 获取主要 IEEE 地址*/
memcpy (ApiMac_extAddr、(uint8_t *)(FCFG1_base + EXTADDR_OFFSET)、
(APIMAC_SADDR_EXT_LEN);
}

Task_sleep (300000);//睡眠3秒以使时钟保持稳定? 建议在线
System_printf ("在 appTaskFxn\r\n"中);
retval = SysCtrlResetSourceGet ();
System_printf ("复位源=%d\r\n"、retval);
Task_sleep (0x2000);


//初始化应用程序*/
#ifdef OSAL_PORT2tinit*





;#taskId_turateId*;#init*任务#t_turt_t_taskId*


/*启动应用程序-永久循环*/
while (1)
{
System_printf ("在循环中...");
//等待1秒
Task_sleep (100000);
}
}


int main (void)
{
Task_Params taskParams;
int32_t retval = 0;
#ifndef USE_DEFAULT_USER_CFG
macUser0Cfg[0].pAssertFP = macHalAssertHandler;
#endif

/*
LED 等与电路板相关的东西进行初始化
遵循 TI-RTOS 惯例
*
PIN_init (BoardGpioInitTable);

#if 已定义(POWER_MEAS)
/*禁用外部闪存以进行功率测量*/
Board_shutdownExtFlash();
#endif

//??? 即使不是 OAD、我们也会使用 SPI
//#if defined (feature_BLE_OAD)|| defined (feature_native_OAD)
spi_init();
//#endif

i2cSetup ();

//init_config_phy_id ();// macTaskInit 需要此信息。
//针对 SafeSense 集成删除


#ifdef OSAL_PORT2TIRTOS
_macTaskId = macTaskInit (macUser0Cfg);
#endif

/*配置任务。 *
Task_Params_init (&taskParams);
taskParams.stack = appTaskStack;
taskParams.STACKSIZE = APP_TASK_STACK_SIZE;
taskParams.priority = app_task_priority;
Task_construct (&appTask、appTaskFxn、&taskParams、NULL);

#ifdef DEBUG_SW_TRACE
IOCPortConfigureSet (IOID_8、IOC_PORT_RFC_TRC、IOC_STD_OUTPUT
| IOC_CURRENT_4mA | IOC_SLEW_ENABLE);
#endif /* debug_sw_trace *

BIOS_start();//启用中断并启动 SYS/BIOS */

返回(0);
} 

如果您需要任何其他信息、请告诉我。 感谢您对此提供的任何帮助。

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

    您好!

    您能否在 SDK 中重现 UART 驱动程序示例的相同问题? 只是想看看它们是否也有相同的问题。

    谢谢、

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

    您好、Ryan、

    除了 Fi 问题之外、在尝试将 System_printf()链接到 UART 时、您还采取了哪些其他步骤 System_printf()在默认情况下不指向 UART、但还要求您向 TI-RTOS 内核配置添加一些设置。

    我建议您只需尝试在器件上运行"uartecho"示例并执行相同的二进制导出步骤即可查看结果。

     

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

    您好、Ryan、

    您对我们的问题是否有任何更新?

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

    您好、Ryan、

    由于不活动、我将关闭此线程。 如果您仍然看到问题、请随时在此处继续发帖或使用"提出相关问题"打开新主题。

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

    很抱歉,我的答复很晚,出现了一些事情,这个项目不得不搁置几个星期。

    我发现当我在 uniflash 中单击"Verify Image"时、我收到错误" [ERROR] Cortex_M4_0:文件加载器:验证失败:地址0x00014CF0处的值不匹配请验证目标存储器和存储器映射"。

    此错误是否是我的程序在调试中工作正常的原因(它实际上不会刷写器件)、但在刷写时不会这么做? 当我实际刷写固件时、我没有收到此错误、但它看起来甚至没有运行。

    我尝试刷写示例 UART echo 项目、但它在验证映像时抱怨了类似的错误。 我可以在定制板上而不是 LaunchPad 上使用这些示例吗?

    我再次对答复缓慢表示歉意。 感谢你的帮助。

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

    您好、Ryan、

    只要您确保引脚按照预期的方式设置、您就应该可以很好地刷写示例代码。 很难说出您为什么会遇到此错误、您是否有其他知道可以正常工作并可以测试相同图像的器件(如 LaunchPad)?

    也许您可以与我分享您尝试刷写的图像、我也可以测试它们。

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

    我已经解决了这个问题。

    我切换到了隔离式 USB 转 UART 适配器(Microchip MCP2200)、而不是我以前使用的适配器、这解决了问题。

    感谢你的帮助。