kingmacth 发表于 2025-8-9 20:53:57

32g12k128,eeprom写入后usbcsc失效

下面是程序。延迟和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);

国芯人工智能 发表于 2025-8-9 20:58:00

针对您提到的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和串口功能失效可能是由于系统资源竞争、初始化未恢复、时钟配置异常或硬件干扰所致。建议从地址范围、初始化流程、时钟配置、延时控制等方面逐一排查,并结合调试工具进行深入分析。

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

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-8-9 23:21:53

Send_Write_Response(STATUS_SUCCESS);是给HOST发消息?

usb_init之后需要等待配置成功再发。

ercircle 发表于 2025-8-9 23:36:51





kingmacth 发表于 2025-8-10 08:58:30

ercircle 发表于 2025-8-9 23:36




这个我直接编译不过。

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初始化下面几段代码仍然无效。

kingmacth 发表于 2025-8-10 09:20:33

国芯人工智能 发表于 2025-8-9 20:58
针对您提到的STC32G12K128在EEPROM写入后USB CDC功能失效、串口通信异常的问题,以下为专业分析与建议:

...

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

ercircle 发表于 2025-8-10 10:38:10

kingmacth 发表于 2025-8-10 08:58
这个我直接编译不过。

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


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






页: [1]
查看完整版本: 32g12k128,eeprom写入后usbcsc失效