496803443 发表于 前天 15:22

P47用作复位脚,按下后usb关联的printf不能使用,必须重新上电才行

P47用作复位脚,按下后usb关联的printf不能使用,必须重新上电才行
我用的是擎天柱

国芯人工智能 发表于 前天 15:23

关于P47引脚复用为复位功能引发USB通信异常的故障分析及解决方案

一、故障现象描述
当使用P47作为硬件复位引脚时,系统复位操作后出现以下异常现象:
1. 通过USB接口输出的printf调试信息功能失效
2. 必须完全断电重启才能恢复USB通信功能
3. 软件复位(非P47触发)不会出现该异常

二、根本原因分析
根据现象可判断问题源于硬件复位与USB模块状态管理的关联异常,具体涉及以下技术层面:

1. 复位电路设计问题
P47作为硬件复位引脚时,复位脉冲宽度未达到芯片规格要求(典型值需>20μs)
复位信号存在回勾或噪声干扰,导致芯片进入非正常复位状态
复位引脚未正确配置上拉电阻(建议10kΩ±5%)

2. USB模块状态管理
硬件复位后USB PHY未自动复位(需检查USBDP/USBDM引脚电平状态)
USB时钟源未正确恢复(需验证HSI/HSE时钟树配置)
端点缓冲描述符表未重建(USBEPnR寄存器状态异常)

3. 电源管理单元(PMU)异常
VBUS检测电路在复位时误触发断电保护
内核电压调节器(LDO)复位时序不匹配
USB专用稳压器未配置软启动功能

三、解决方案建议

1. 硬件改进方案
a) 复位电路优化:
增加RC滤波电路(推荐值:100nF+10kΩ)
配置施密特触发器消除信号抖动
验证复位脉冲宽度满足tRST(min)=1.5μs(具体参考芯片手册)

b) USB电源路径改进:
在VBUS线路增加TVS二极管(SMAJ5.0A)
配置独立电源监控电路(建议使用MAX6715)
确保USBDP/USBDM串接22Ω阻抗匹配电阻

2. 固件修正方案
a) 复位后初始化流程优化:
c
void SystemResetHandler(void)
{
    // 优先复位USB外设
    RCCAPB1RSTR |= USBRSTMASK;
    RCCAPB1RSTR &= ~USBRSTMASK;
   
    // 重新配置USB时钟
    USBClockCmd(DISABLE);
    SysCtrlPLLConfig(USBCLKSRC);
    USBClockCmd(ENABLE);
   
    // 重建USB协议栈
    USBDeInit();
    USBInit();
}

b) 增加USB状态恢复机制:
c
void USBConnectionRecovery(void)
{
    if(USBGetConnectionStatus() == DISCONNECTED){
      GPIOWritePin(USBDPPIN, LOW);
      Delayms(100);
      GPIOWritePin(USBDPPIN, HIGH);
      USBSoftConnect();
    }
}

3. 调试验证方法
a) 使用示波器捕获关键信号:
复位引脚波形(需满足tRST参数)
USBDP/DM差分信号(复位前后对比)
芯片供电电压纹波(需

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

496803443 发表于 前天 16:16

我使用的是AIapp-ISP V6.95N 版生成的代码,
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    P0M0 = 0x00; P0M1 = 0x00;         //初始化P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;         //初始化P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;         //初始化P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;         //初始化P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;         //初始化P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;         //初始化P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;         //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;         //初始化P7口为准双向口模式

    CLK_Init();                         //时钟模块初始化
    USBLIB_Init();                      //USB库初始化

    //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
                RSTCFG = 0X50;
    // 在此添加用户初始化代码
    //<<AICUBE_USER_INITIAL_CODE_END>>

    EnableGlobalInt();                  //使能全局中断
}
只加入了RSTCFG = 0X50;这一句配置代码,
然后 while (1)
    {
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
                                                                        printf("zhehis yihdfa");
                                                                        delay_ms(500);
                                                                        P2=~P2;
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
下载好代码后打开串口接收测试正常,LED闪烁正常,当按下复位按键,LED还能正常闪烁,但是串口收发不能使用。

ercircle 发表于 前天 17:25

P47和USB共存,修改为IO功能:

代码检测P47按键事件,参考:

不进下载模式修改:
IAP_CONTR = 0x20;   //触发软件复位


另外需要注意:

页: [1]
查看完整版本: P47用作复位脚,按下后usb关联的printf不能使用,必须重新上电才行