找回密码
 立即注册
查看: 37|回复: 6

32g12k128,eeprom写入后usbcsc失效

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-10 08:58:30

14

主题

23

回帖

219

积分

中级会员

积分
219
发表于 前天 20:53 | 显示全部楼层 |阅读模式
下面是程序。延迟和usb_init都是我后加的。症状就是eeprom写入后USBcdc发不出去数据。并且串口也坏了。从PCB发数据给他会提示超时。必须重启MCU才行。

EEPROM_SectorErase(EEPROM_CONFIG_START_ADDR);
                EEPROM_write_n(EEPROM_CONFIG_START_ADDR, (u8*)new_settings, sizeof(new_settings));

                // 更新当前运行的配置
                for(i=0; i<NUM_CHANNELS; i++)
                {
                    g_channel_settings = new_settings;
                }

                // ====================================================================
                //                            *** 此处已修正 ***
                // ====================================================================
                // 在发送响应前增加一个短暂延时,以确保USB外设稳定
                delay_ms(200);
                // ====================================================================
                                                                usb_init();
                // 发送成功应答
                Send_Write_Response(STATUS_SUCCESS);

回复

使用道具 举报 送花

3

主题

2077

回帖

1002

积分

等待验证会员

积分
1002
发表于 前天 20:58 | 显示全部楼层
针对您提到的STC32G12K128在EEPROM写入后USB CDC功能失效、串口通信异常的问题,以下为专业分析与建议:

首先,根据您提供的代码片段,EEPROM写入操作发生在配置更新过程中。此过程可能对系统资源(如时钟、中断、GPIO等)产生影响,进而导致USB或串口功能异常。

一、问题可能性分析

1. EEPROM写入期间系统状态不稳定  
   EEPROM写入通常需要一定时间,并且在此过程中MCU可能进入低功耗模式或执行特定操作,可能导致USB控制器或串口模块的时钟或使能状态被意外修改。

2. USB/CDC初始化未正确恢复  
   如果在EEPROM写入过程中USB初始化流程被中断或未重新调用,可能导致USB设备无法正常枚举或数据传输失败。

3. 硬件复位或电源波动  
   在某些情况下,EEPROM写入可能引发轻微的电源波动或时序问题,导致USB模块或串口模块未能正常工作。

4. 配置寄存器被意外覆盖  
   若EEPROM写入地址范围与USB或串口相关寄存器地址重叠,可能导致关键配置被覆盖,从而引发功能异常。

5. 中断或DMA冲突  
   在EEPROM写入过程中若存在中断或DMA操作,可能干扰USB或串口的数据传输,导致通信失败。

二、建议排查步骤

1. 检查EEPROM写入地址范围  
   确保EEPROMCONFIGSTARTADDR及后续地址不与USB或串口相关的寄存器地址重叠。可通过查阅STC32G12K128的参考手册确认各外设寄存器地址范围。

2. 确保USB初始化流程完整  
   在EEPROM写入完成后,应重新调用usbinit()函数,以确保USB控制器重新初始化并恢复到正常状态。

3. 增加写入完成后的延时  
   在EEPROM写入完成后,增加适当的延时(如10ms以上),确保写入操作完全完成,避免因时序问题导致系统不稳定。

4. 检查USB和串口时钟配置  
   确认USB和串口模块的时钟源是否稳定,特别是在EEPROM写入过程中是否被意外更改。可使用调试工具(如STC-ISP或J-Link)查看时钟寄存器状态。

5. 验证USB CDC驱动逻辑  
   检查USB CDC的发送逻辑是否在写入后被正确触发,确保数据缓冲区和状态标志未被错误清空或置位。

6. 测试断电重启行为  
   验证MCU在EEPROM写入后是否必须通过外部复位才能恢复USB功能,若如此,说明可能存在深层的硬件或固件问题。

三、优化建议
将EEPROM写入操作放在主循环之外,避免在关键任务中进行长时间操作。
增加写入前后的状态检测,例如在写入前后读取EEPROM内容,确认写入成功。
使用独立的线程或任务处理EEPROM写入,避免阻塞主线程或中断服务程序。
记录日志信息,通过串口或LED指示灯反馈当前系统状态,便于问题定位。

四、结论

综上所述,EEPROM写入后USB CDC和串口功能失效可能是由于系统资源竞争、初始化未恢复、时钟配置异常或硬件干扰所致。建议从地址范围、初始化流程、时钟配置、延时控制等方面逐一排查,并结合调试工具进行深入分析。

如需进一步协助,建议提供完整的代码段及硬件设计图,以便更精准地定位问题。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-08-11 08:50:56
已绑定手机

78

主题

2836

回帖

5875

积分

荣誉版主

无情的代码机器

积分
5875
发表于 前天 23:21 | 显示全部楼层
Send_Write_Response(STATUS_SUCCESS);是给HOST发消息?

usb_init之后需要等待配置成功再发。
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-08-11 08:50:56
已绑定手机

78

主题

2836

回帖

5875

积分

荣誉版主

无情的代码机器

积分
5875
发表于 前天 23:36 | 显示全部楼层
截图202508092336187961.jpg


eeprom_usb_test.zip (278.61 KB, 下载次数: 1)
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-10 08:58:30

14

主题

23

回帖

219

积分

中级会员

积分
219
发表于 昨天 08:58 | 显示全部楼层

wechat_2025-08-10_085615_055.png

这个我直接编译不过。

WTST = 0;                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXSFR();                //扩展SFR(XFR)访问使能
        CKCON = 0;      //提高访问XRAM速度

        GPIO_config();
        Timer_config();
       
        //====== USB 初始化 ======
    P3M0 &= ~0x03;
    P3M1 |= 0x03;
   
    IRC48MCR = 0x80;
    while (!(IRC48MCR & 0x01));
   
    USBCLK = 0x00;
    USBCON = 0x90;
    //========================
        usb_init();  //USB CDC 接口配置 */



我是这样初始化的。在程序中进行写eeprom。再吃使用USB初始化下面几段代码仍然无效。

点评

你的头文件不对,看下引用的哪个位置头文件,使用最新ISP软件重新导入头文件 [attachimg]111294[/attachimg] [attachimg]111295[/attachimg]  详情 回复 发表于 昨天 10:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-08-10 08:58:30

14

主题

23

回帖

219

积分

中级会员

积分
219
发表于 昨天 09:20 | 显示全部楼层
国芯人*** 发表于 2025-8-9 20:58
针对您提到的STC32G12K128在EEPROM写入后USB CDC功能失效、串口通信异常的问题,以下为专业分析与建议:

...

EEPROM的写入是在一个子函数中。通过usbcdc串口接收到12字节数据写入到eeprom中。我加了最长2秒的等待延时无效,我增加了usbinit()函数重新初始化无效。所有eeprom写入函数都是从官方demo“STC32G12K128-LQFP64-DIP64-DEMO-CODE”中复制的。  官方对于这两个硬件的冲突没有测试和说明么?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-08-11 08:50:56
已绑定手机

78

主题

2836

回帖

5875

积分

荣誉版主

无情的代码机器

积分
5875
发表于 昨天 10:38 | 显示全部楼层
kingm*** 发表于 2025-8-10 08:58
这个我直接编译不过。

WTST = 0;                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快

你的头文件不对,看下引用的哪个位置头文件,使用最新ISP软件重新导入头文件



截图202508101036403686.jpg

截图202508101037361234.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-11 10:06 , Processed in 0.129448 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表