华大单片机HC32L130J6TA入坑全纪录(二)——关于SWD下载的问题

本文详细介绍了华大烧写程序中电路设计的关键部分,包括串口烧录的MODE选择电路和UART下载电路的预留设计。强调了SWD烧录加密后的局限性和UART下载程序的重要性,以及在休眠测试前加入延时的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

华大的烧写程序电路部分,这部分一定要预留两个电路:

1.串口烧录的MODE选择电路,PD3下拉10K和跳线帽连接3V3。

2.UART下载电路,预留排针焊口。

因为:

SWD烧录,如果需要加密的话,加密烧录之后,SWD就废了!废了!了!

然后就只能用UART下载程序了。

略坑。

 

进入休眠测试的时候,进入WFI模式之前,要加个延时,因为,进入休眠之后SWD就废了!废了!了!

 

<think>我们正在处理一个关于华大单片机串口移植的问题:从HC32L130迁移到HC32L170时出现串口发送乱码。 根据经验,串口乱码通常与时钟配置、波特率设置、数据格式(数据位、停止位、校验位)有关。特别是当我们更换了不同型号的单片机时,时钟树可能不同,导致波特率计算错误。 参考引用[1]中提到了硬件设计指南,虽然主要针对L130/L136/F030,但我们可以从中得到一些通用设计原则。同时,引用[3]和[4]提到了在HC32L130上移植FreeRTOS和遇到的困难,但我们的问题集中在串口乱码。 步骤分析: 1. 检查时钟源:HC32L130HC32L170的时钟树可能不同,特别是系统时钟源(如内部高速时钟HSI的默认频率)以及外设时钟分频设置。 - 例如,HC32L130的HSI默认是24MHz,而HC32L170的HSI可能是16MHz或其他?需要查阅HC32L170的用户手册。 2. 检查波特率计算:串口波特率发生器依赖于系统时钟(PCLK)和分频系数。如果系统时钟频率变了,而波特率设置函数没有相应调整,就会导致实际波特率与预期不符。 3. 检查串口外设的初始化代码:包括数据位、停止位、校验位等是否与接收端一致。 4. 检查硬件连接:虽然问题描述是移植,但也要确保硬件连接正确(如TX/RX交叉连接,共地等)。 5. 检查供电电压:不同的电压可能导致信号电平不稳定,但乱码更可能是波特率不匹配。 具体解决思路: 第一步:确认HC32L170的系统时钟配置。 - 在HC32L130的代码中,系统时钟初始化通常会在`SystemInit()`函数中,或者用户自己编写的时钟配置函数中。我们需要将同样的配置逻辑迁移到HC32L170时,根据HC32L170的时钟树进行调整。 - 注意:HC32L170可能支持不同的时钟源和分频系数,因此需要查看HC32L170的用户手册,确认系统时钟频率。 第步:调整串口波特率设置。 - 串口波特率计算公式:波特率 = PCLK / (16 * DIV) 或者使用其他模式(如分数分频),具体看手册。 - 假设我们使用的波特率是115200,那么需要根据实际的PCLK计算DIV的值。 第三步:检查串口初始化代码。 - 比较两个型号的串口外设寄存器是否存在差异。例如,控制寄存器(CTRL)、波特率寄存器(BAUD)等。 第四步:使用示波器或逻辑分析仪测量实际发送的波特率,以确定是否是波特率不匹配。 由于我们无法直接测量,因此建议先调整时钟配置。 参考代码(HC32L130的串口初始化)可能如下(以DDL库为例): ```c void Uart_Init(void) { stc_uart_init_t stcInit; MEM_ZERO_STRUCT(stcInit); stcInit.enClkMode = UartClkMode_PCLK; // 时钟源选择 stcInit.enClkDiv = UartClkDiv_1; // 分频 stcInit.enDataLength = UartDataBits8; // 数据位 stcInit.enStopBit = UartStopBits1; // 停止位 stcInit.enParity = UartParityNone; // 校验位 stcInit.enMode = UartMode_TxRx; // 模式 Uart_Init(M0P_UART1, &stcInit); // 初始化UART1 Uart_SetBaudrate(M0P_UART1, 115200, SystemCoreClock); // 设置波特率 } ``` 在HC32L170上,我们同样使用DDL库,但需要注意`SystemCoreClock`的值是否正确。在初始化时钟后,通常会更新`SystemCoreClock`全局变量。如果我们在设置串口波特率之前没有正确设置系统时钟,那么`SystemCoreClock`可能还是默认值,导致波特率计算错误。 因此,在HC32L170上,我们需要: 1. 正确配置系统时钟(例如,使用HSI作为时钟源,并设置分频,使系统时钟为16MHz或其他)。 2. 更新`SystemCoreClock`变量(如果使用DDL库,在系统时钟配置函数中会自动更新,否则需要手动更新)。 3. 在串口初始化函数中,使用更新后的`SystemCoreClock`来计算波特率。 如果仍然乱码,可以尝试降低波特率(如9600)测试,因为低波特率对时钟偏差的容忍度更高。 另外,引用[4]中提到在HC32L130上移植FreeRTOS时修改了systick的延时函数,说明时钟配置的重要性。虽然我们的问题不是关于FreeRTOS的,但时钟配置是共通的。 总结解决方法: 1. 确认HC32L170的系统时钟频率,并正确配置。 2. 在串口初始化时,使用正确的系统时钟频率计算波特率。 3. 检查串口外设的寄存器配置是否与HC32L130一致(数据位、停止位等)。 4. 如果使用外部晶振,确保晶振正常工作。 由于没有具体的代码,我们只能给出一般性建议。如果用户能提供更多的初始化代码,特别是时钟配置和串口初始化的部分,可以更精确地定位问题。 相关问题: 1. 如何配置华大单片机HC32L170的系统时钟? 2. 华大单片机串口通信中波特率计算的公式是什么? 3. 如何通过示波器测量串口波特率以验证其正确性? 4. 在移植华大单片机程序时,除了串口,还有哪些外设需要特别注意时钟配置? 5. HC32L130HC32L170在串口外设上有哪些寄存器差异?</think>### 华大单片机 HC32L130HC32L170 串口移植乱码问题解决方案 串口移植出现乱码通常由**时钟配置不匹配**或**波特率计算错误**导致。以下是系统性的解决步骤: --- ### 步骤1:检查时钟源配置 **核心问题**:HC32L130HC32L170 的默认时钟频率不同: - HC32L130 默认 HSI = 24MHz - HC32L170 默认 HSI = **16MHz**(需重点验证)[^1] **解决方法**: ```c // 在系统初始化中显式配置时钟频率 void SystemClock_Config(void) { stc_clk_sysclk_cfg_t stcSysClkCfg; CLK_GetClockFreq(&stcSysClkCfg); // 获取当前时钟配置 // 手动设置 HSI 频率(根据实际型号选择) stcSysClkCfg.enHclkSrc = ClkRchHSI; // 使用内部高速时钟 stcSysClkCfg.u32HclkFreq = 16000000; // HC32L170 设为 16MHz // stcSysClkCfg.u32HclkFreq = 24000000; // HC32L130 设为 24MHz CLK_SysClkConfig(&stcSysClkCfg); // 应用新配置 } ``` --- ### 步骤2:修正波特率计算 **关键公式**: 波特率分频值 = 系统时钟 / (16 × 波特率) 若系统时钟不同,需重新计算分频寄存器值: ```c // 以 115200 波特率为例: void UART_Baudrate_Config(M0P_UART_TypeDef* UARTx) { uint32_t u32BaudDiv = 0; // HC32L170:16MHz 时钟下的分频值 u32BaudDiv = 16000000 / (16 * 115200); // ≈8.68 → 取整为9 // 写波特率寄存器 UARTx->BAUDR_f.BAUD = u32BaudDiv; } ``` > **验证技巧**: > 用示波器测量 TX 引脚单个位的时长,理论值 = 1/波特率。例如 115200bps 时,单个位宽应为 8.68μs。 --- ### 步骤3:检查外设时钟门控 HC32L170 需额外开启串口模块时钟: ```c // 启用 UART1 时钟(以 UART1 为例) PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_UART1, ENABLE); ``` --- ### 步骤4:验证硬件连接 1. **电平匹配**: - 确认目标设备(如 PC 串口)电压与 HC32L170 的 I/O 电平(通常 3.3V)兼容 2. **信号完整性**: - TX/RX 线路长度 ≤ 30cm - 添加 100Ω 串联电阻抑制振铃 --- ### 步骤5:排查代码移植差异 1. **寄存器偏移对比**: 查阅两型号用户手册,确认: - UART 控制寄存器地址偏移是否一致 - 波特率寄存器位宽是否相同 2. **DDL 库版本**: 使用 HC32L170 专用 DDL 库(避免跨型号混用)[^2] --- ### 最终解决方案流程图 ```mermaid graph TD A[串口乱码] --> B{检查时钟配置} B -->|不匹配| C[修正系统时钟频率] B -->|匹配| D{检查波特率计算} D -->|错误| E[重算分频值] D -->|正确| F{检查外设时钟} F -->|未开启| G[使能UART时钟] F -->|已开启| H{验证硬件} H -->|异常| I[优化电路设计] H -->|正常| J[排查寄存器差异] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值