单片机/MCU论坛
直播中

一曲作罢

10年用户 979经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术
私信 关注
[问答]

UART SCB2配置的设备配置器不工作是哪里的问题?

UART SCB2 配置的设备配置器 - 不工作,请请求您检查我的设备配置器,我正在使用内部时钟。
不幸的是,UART 不工作,我的代码在 cy_retarget_io_init() 调用处停止。
我连接了 2 个 LED,它们正在使用这个来调试问题。

回帖(1)

远不及你

2025-7-29 17:00:06

根据您的描述,UART SCB2 配置在 cy_retarget_io_init() 调用处停止,这通常由配置错误或硬件问题导致。以下是系统性排查步骤:


1. 检查硬件连接



  • 引脚分配:确认 SCB2 的 TX/RX 引脚在原理图中正确连接,且未与其他外设冲突。

  • 物理线路:使用万用表检查 TX/RX 到目标设备(如 USB-UART 转换器)的连通性和电压(通常 3.3V)。

  • 接地连接:确保开发板与目标设备共地。


2. 验证时钟配置



  • 时钟源:在设备配置器中检查 SCB2 的时钟源(例如 CLK_HF[0])。若使用内部时钟:
     Cy_SysClk_ClkHfSetSource(0, CY_SYSCLK_CLKHF_IN_CLKPATH0); // 示例代码

  • 波特率匹配:确认 cy_retarget_io_init() 的波特率与设备配置器中 SCB2 的波特率一致(如 115200)。


3. 审查设备配置器设置



  • SCB2 模式:设置为 UART 模式(不是 I²C/SPI)。

  • 引脚分配:在 "Pins" 选项卡中验证 TX/RX 引脚(如 P6.0/TX, P6.1/RX)是否正确映射。

  • 高级设置

    • Data Bits: 8

    • Stop Bits: 1

    • Parity: None

    • Oversample: 典型值 12(确保与时钟频率匹配)。



4. 调试 cy_retarget_io_init() 失败



  • 错误处理:捕获函数返回的错误码:
     cy_rslt_t result = cy_retarget_io_init(P6_0, P6_1, CY_RETARGET_IO_BAUDRATE);
    if (result != CY_RSLT_SUCCESS) {
         // 点亮 LED 或进入循环
         while(1) {
             Cy_GPIO_Inv(LEDR_PORT, LEDR_PIN);
             Cy_SysLib_Delay(500);
         }
    }

  • 常见错误原因

    • CY_RSLT_TYPE_ERROR:引脚配置错误或时钟未启动。

    • CY_UART_BAUD_INVALID:波特率超出范围(检查时钟频率)。



5. 验证时钟初始化


main()先初始化系统时钟,再初始化外设:


   #include "cycfg_clocks.h"
   int main(void) {
       Cy_SysClk_ClkHfSetDivider(0, CY_SYSCLK_CLKHF_NO_DIVIDE); // 设置 HFCLK 分频
       init_cycfg_clocks(); // 从 cycfg_clocks.c 初始化时钟
       // ... 其他初始化
   }

确保为 SCB2 提供时钟的路径已启用(如通过 Cy_SysClk_PeriphAssignDivider())。


6. 检查引脚配置冲突



  • 在代码中禁止其他驱动占用同一引脚:
     // 确保其他驱动未使用 SCB2 引脚
    cyhal_gpio_free(P6_0);
    cyhal_gpio_free(P6_1);

  • 在设备配置器的 "Pins" 页面,确认 SCB2 引脚未显示警告图标。


7. 固件更新与最小测试



  • 更新 BSP 和库:通过 ModusToolbox 库管理器更新固件包。

  • 最小测试代码
     #include "cyhal.h"
    #include "cy_retarget_io.h"
    int main(void) {
         cyhal_system_init();
         init_cycfg_clocks();
         cy_rslt_t result = cy_retarget_io_init(P6_0, P6_1, 115200);
         if (result != CY_RSLT_SUCCESS) while(1); // 阻塞
         printf("UART Working!n"); // 成功则输出
         while(1);
    }


8. 使用逻辑分析仪


在 SCB2 TX 引脚连接逻辑分析仪:



  • 若未检测到 起始位(低电平),表示 UART 未发送数据(配置错误)。

  • 若检测到乱码,检查波特率是否准确(计算实际波特率:SCB_CLOCK / ( Oversample * Baudrate ))。


9. 替代调试方法



  • 直接操作 SCB2 寄存器(跳过 retarget-io):
     Cy_SCB_UART_Init(SCB2, &uartConfig, NULL); // 手动初始化
    Cy_SCB_UART_Enable(SCB2);
    Cy_SCB_UART_PutString(SCB2, "Testn");


总结排查步骤:



  1. 确认物理接线与电压  

  2. 验证设备配置器的 SCB2/Pins/Clocks 设置  

  3. 在代码中捕获错误码并处理  

  4. 确保时钟初始化优先执行  

  5. 最小化测试代码排除干扰  


提供更多细节(如芯片型号、配置截图、错误码),可进一步分析具体问题!

举报

更多回帖

发帖
×
20
完善资料,
赚取积分