【沁恒CH573】初体验:硬件、环境、烧写、点灯

硬件

资料下载

先到沁恒官网搞下资料
乱下一通
在这里插入图片描述
核心电路并不复杂;
在这里插入图片描述

天线

参照《CH573评估版说明书.pdf》看一哈天线说明
在这里插入图片描述
在这里插入图片描述

下载口

ISP下载方式包括USB下载和串口下载

  • 默认下载boot脚:PB22
    USB下载通道:USB口 (PB10/UD-;PB11/UD+)

  • 串口下载通道:串口1(PA8;PA9) 支持免按键下载;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我使用的是USB下载,第一次打的板子忘记引出boot脚(PB22),大写的尴尬,飞线出来好麻烦;所以如果您也使用usb烧写,一定别忘了给boot脚一个合理的安排(正常人谁会忘←_←);

后来终于想起留下烧写口(DL就是boot);

时钟源

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
我的电路中只在18、19脚上接了一颗32MHz晶体;

环境

MountRiver Studio 安装就能用,没什么多余的配置;都默认就好;和keil啥的长得很像
在这里插入图片描述

点灯仪式

建了个工程
在这里插入图片描述
选择使用的芯片型号 CH573
在这里插入图片描述
在这里插入图片描述
打开main.c,还带有大把的注释,在这里插入图片描述
打开一句操作GPIO的语句,goto看一下
在这里插入图片描述
大把注释;在这里插入图片描述
在这里插入图片描述
看到这就清晰了

只要GPIOA_ModeCfg 或 GPIOB_ModeCfg 形参中填入引脚号GPIO_Pin_X,和根据硬件选择模式中的一种,就完成了GPIO的配置,

根据硬件通过
GPIOA_SetBits(GPIO_Pin_X) 或 GPIOB_SetBits(GPIO_Pin_X)
GPIOA_ResetBits(GPIO_Pin_X) 或 GPIOB_ResetBits(GPIO_Pin_X)
就可以完成点灯关灯;

烧写

硬件下载口部分有操作截图;

<think>好的,我现在要解决用户提到的关于CH32V307VCT6芯片下载代码后不执行的问题。首先,我需要回忆一下这个芯片的基本情况。CH32V307VCT6是沁恒微电子的一款基于RISC-V内核的微控制器,主要应用在嵌入式系统中。用户的问题是代码可以下载进去,但没有任何执行迹象,比如LED不亮、串口无输出等。 首先,我应该从常见的可能性入手。可能的原因包括时钟配置错误、启动文件问题、复位电路异常、代码未正确指向主函数、外设初始化不正确,或者下载选项配置有误。 1. **时钟配置检查**:RISC-V芯片通常需要正确配置时钟源,比如内部高速时钟(HSI)或外部晶振(HSE)。如果代码里时钟初始化不正确,可能导致系统时钟不工作,所有外设都无法运行。用户可能在代码中使用了外部晶振,但硬件上没有焊接晶振,或者相关电容没接好,导致时钟初始化失败。这时候系统可能无法启动,代码也就不会执行。 2. **启动文件分析**:启动文件负责初始化堆栈指针、向量表等。如果启动文件中的复位处理函数没有正确跳转到main函数,或者向量表中的复位向量地址错误,程序可能无法进入主函数。需要检查启动文件中的汇编代码,尤其是Reset_Handler部分是否正确指向main。 3. **复位电路问题**:硬件上的复位引脚如果一直处于复位状态(比如复位按键卡住、电容损坏导致电压不稳),芯片会持续复位,无法执行代码。需要用万用表测量NRST引脚的电压,确认在正常工作电压范围内,没有意外的低电平。 4. **主函数未执行**:有时候代码虽然下载成功,但可能因为某些条件判断(比如变量未初始化导致的条件不满足)而无法进入主循环,或者主函数中有死循环退出导致程序跑飞。可能需要检查main函数的结构,是否有while(1)循环,或者是否有提前return的情况。 5. **外设初始化错误**:比如GPIO配置不正确,虽然程序在运行,但LED对应的引脚模式没有设置为输出,或者引脚映射错误,导致看不到现象。需要检查外设的初始化代码,确认引脚配置正确,并且外设时钟已使能。 6. **下载配置选项**:下载工具(如WCH-Link)的配置是否正确,比如是否选择了正确的芯片型号,下载后是否执行了复位操作。有些下载器需要勾选“Reset after download”选项,否则程序可能不会自动开始执行。 接下来,我需要考虑如何一步步排查这些问题。首先,检查最简单的点,比如是否有硬件上的复位问题,或者下载配置是否正确。然后,使用调试器单步执行代码,查看程序是否进入main函数,以及执行到哪一步出现问题。如果没有调试器,可以通过在代码中插入点灯或者串口输出的指令来测试程序是否运行到某个阶段。 例如,在main函数的开始处,先初始化一个GPIO,控制LED闪烁,如果LED没有反应,可能程序根本没有运行到这里,可能是时钟或启动文件的问题。如果LED能闪烁,但后续代码不执行,可能是其他外设初始化的问题。 此外,查看编译后的map文件,确认向量表中的复位处理函数地址正确,确保程序入口正确。同时,检查链接脚本是否正确指定了Flash和RAM的地址,避免程序被错误地到错误的位置。 还有可能,堆栈大小设置不足,导致程序启动时栈溢出,造成硬件错误,进而进入异常处理,看起来像没有执行。需要检查启动文件中的堆栈配置是否合理。 总结一下,可能的解决步骤包括: - 确认硬件复位电路正常。 - 检查下载配置,确保下载后复位运行。 - 简化代码,仅保留最基本的功能(如点灯),测试是否能运行。 - 使用调试器跟踪程序执行流程。 - 确认时钟配置正确,尤其是外部晶振是否启用且硬件支持。 - 检查启动文件和链接脚本是否正确。 - 确认中断向量表正确映射,没有遗漏或错误。 如果用户没有调试经验,可能需要指导他们如何插入调试代码,比如通过GPIO翻转或串口发送调试信息,逐步定位问题所在。</think>针对CH32V307VCT6芯片代码下载后不执行的问题,以下是逐步排查指南: --- ### **一、基础检查** 1. **硬件复位电路** - 测量复位引脚(NRST)电压,正常应为高电平(3.3V)。若持续低电平,检查复位按键是否卡住或电容损坏。 - 确认电源电压稳定(3.3V),避免欠压导致芯片无法启动。 2. **下载配置验证** - 在下载工具(如WCH-LinkUtility)中勾选 **“下载后复位运行”** 选项。 - 确认芯片型号选择正确,Flash地址范围为 `0x00000000`(默认)。 --- ### **二、最小系统测试** 1. **简化代码** 编最小测试程序(仅控制GPIO),例如: ```c #include "ch32v30x.h" int main(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; // 假设LED接PC13 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); while(1) { GPIO_WriteBit(GPIOC, GPIO_Pin_13, !GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)); Delay_Ms(500); // 简单延时函数 } } ``` 2. **检查时钟配置** - 若使用外部晶振,确认硬件已焊接晶振(8MHz)和负载电容(通常22pF)。 - 在代码中初始化时钟前,默认使用内部HSI(8MHz): ```c RCC_DeInit(); // 复位时钟配置 RCC_HSEConfig(RCC_HSE_OFF); // 若未用HSE,关闭外部晶振 ``` --- ### **三、软件调试** 1. **启动文件与链接脚本** - 确认启动文件(如 `startup_ch32v30x.s`)中 `Reset_Handler` 正确跳转到 `main` 函数。 - 检查链接脚本(.ld文件)中Flash和RAM地址范围是否匹配芯片规格: ``` FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K // CH32V307VCT6的Flash大小 RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K // RAM大小 ``` 2. **中断向量表偏移** - 若代码从Flash启动,确认向量表地址正确: ```c NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); ``` --- ### **四、高级排查** 1. **使用调试器跟踪** - 通过WCH-Link连接SWD接口,单步执行代码: - 检查是否进入 `Reset_Handler`。 - 确认能否跳转到 `main` 函数。 - 观察寄存器(如PC、SP)是否正常。 2. **堆栈溢出检测** - 在启动文件中增大堆栈大小(默认约1KB): ``` .stack : { . = ALIGN(4); __stack_end__ = .; . = . + 0x800; // 增加至2KB __stack_top__ = .; } >RAM ``` 3. **外设初始化顺序** - **先使能外设时钟,再配置外设**。例如: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 先使能时钟 GPIO_Init(GPIOC, &GPIO_InitStruct); // 再配置GPIO ``` --- ### **五、常见问题总结** | 现象 | 可能原因 | 解决方法 | |---------------------|--------------------------|----------------------------------| | 程序卡在启动文件 | 堆栈溢出/向量表错误 | 增大堆栈,检查链接脚本 | | GPIO无反应 | 时钟未使能/引脚模式错误 | 确认外设时钟开启,引脚模式为输出 | | 程序运行一次后停止 | 主函数退出导致跑飞 | 在main末尾添加 `while(1);` | | 代码下载后无任何现象 | 未勾选“下载后复位”选项 | 检查下载工具配置 | --- ### **六、推荐工具** 1. **WCH-LinkUtility**:用于固件下载和配置。 2. **RISC-V IDE(MounRiver Studio)**:集成调试功能,可单步跟踪代码。 3. **逻辑分析仪**:检测GPIO电平变化,确认程序是否运行。 通过以上步骤,可系统性定位问题。若仍无法解决,建议检查硬件焊接或联系沁恒技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

umiuwifi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值