P47用作复位脚,按下后usb关联的printf不能使用,必须重新上电才行
P47用作复位脚,按下后usb关联的printf不能使用,必须重新上电才行我用的是擎天柱
关于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差分信号(复位前后对比)
芯片供电电压纹波(需
[本文内容由国芯人工智能辅助生成,仅供参考] 我使用的是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还能正常闪烁,但是串口收发不能使用。
P47和USB共存,修改为IO功能:
代码检测P47按键事件,参考:
不进下载模式修改:
IAP_CONTR = 0x20; //触发软件复位
另外需要注意:
页:
[1]