health 发表于 2026-1-16 08:35:01

usb-cdc串口能出现串口号,但是无法打开,是什么原因?

stc32g144K使用 stc_usb_cdc_32g.lib 库demo程序,调试助手可以正常打开串口且收发数据正常。

但稍微增加或删除一点代码,就有可能调试助手打不开串口号,但程序其它功能运行正常。
代码改动部分不涉及USB,对程序执行时间也影响很小。唯一变化的就是总代码大小,函数的绝对地址有可能变化。

可以确认的是串口没有重复打开,没有别的软件占用串口,就是MCU程序的原因。
程序不超过64KB。

难道cdc lib对代码的绝对定位地址有要求?

ercircle 发表于 2026-1-16 09:19:11

主频设置太高了?上传完整工程看看

health 发表于 2026-1-16 13:03:34

ercircle 发表于 2026-1-16 09:19
主频设置太高了?上传完整工程看看

原工程正是您的作品《音乐播放器》,可以正常运行。
我在基础上增加一条命令,测试SD卡读取速度。
时而正常,
有时加几条语句就打不开串口了,
有时删几条语句就打不开串口了。
找不到规律。

修改后不正常的工程如下,请审阅。


ercircle 发表于 2026-1-16 13:40:25

health 发表于 2026-1-16 13:03
原工程正是您的作品《音乐播放器》,可以正常运行。
我在基础上增加一条命令,测试SD卡读取速度。
时而正 ...

应该还是主频高了导致的USB还是什么不稳定了,单体之间也有差异,我这颗下这个附件是正常的。
可以尝试降低主频(但是降主频可能导致解码和读卡速度跟不上),或者USB换为串口测试。

health 发表于 2026-1-16 14:00:33

ercircle 发表于 2026-1-16 13:40
应该还是主频高了导致的USB还是什么不稳定了,单体之间也有差异,我这颗下这个附件是正常的。
可以尝试降 ...

果然与主频有关。
IRC 48MHz时,CPU@102MHz,FPU@204MHz,此时不正常。
IRC改为40MHz,仍不正常。
IRC改为24MHz,CDC 串口正常了。代码其它未动,此时PLL输入是3MHz其实是不符合要求的 。

health 发表于 2026-1-16 14:10:21

IRC 48MHz,PLL输出设为最低值312MHz,CPU时钟为PLL/4即78MHz,仍然CDC串口出错。
IRC 48MHz,PLL输出仍为408MHz,CPU时钟设为PLL/8即51MHz,此时CDC串口 正常了。

奇怪的是高主频时程序其它功能都运行正常,只是CDC串口打不开。并且与代码连接地址有关,有些地址可以高速运行。

health 发表于 2026-1-16 14:17:42

目前Flash的速度肯定是不能支持50多M以上指令全速运行的,需要指令cache的参与。

此现象是否是极个别flash地址i-cache未能正确生效导致的?当某些代码分配到这种地址就会执行出错。

ercircle 发表于 2026-1-16 16:47:36

health 发表于 2026-1-16 14:17
目前Flash的速度肯定是不能支持50多M以上指令全速运行的,需要指令cache的参与。

此现象是否是极个别flash ...
楼主试下替换这个重新编译有效不,120M时,WTST可能要改为4

health 发表于 2026-1-17 02:28:17

ercircle 发表于 2026-1-16 16:47
楼主试下替换这个重新编译有效不,120M时,WTST可能要改为4

替换后功能正常了。

health 发表于 2026-1-17 13:12:51

按另一个贴的结论,CPU高主频时读写USB寄存器会失败,需加NOP解决。
本贴所述现象是有时行有时不行,与代码的执行地址有关。

推测应该是运行正确时是i-cache未命中,从flash取指令低速运行。
运行错误时是指令已缓存到cache,高速执行指令会出错。

至于为何有时能缓存有时不能缓存,需要更进一步考虑。
页: [1]
查看完整版本: usb-cdc串口能出现串口号,但是无法打开,是什么原因?