找回密码
 立即注册
查看: 35|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 15:22:39

6

主题

8

回帖

96

积分

注册会员

积分
96
发表于 昨天 15:22 | 显示全部楼层 |阅读模式
P47用作复位脚,按下后usb关联的printf不能使用,必须重新上电才行
我用的是擎天柱
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 昨天 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) 复位后初始化流程优化:
  1. c
  2. void SystemResetHandler(void)
  3. {
  4.     // 优先复位USB外设
  5.     RCCAPB1RSTR |= USBRSTMASK;
  6.     RCCAPB1RSTR &= ~USBRSTMASK;
  7.    
  8.     // 重新配置USB时钟
  9.     USBClockCmd(DISABLE);
  10.     SysCtrlPLLConfig(USBCLKSRC);
  11.     USBClockCmd(ENABLE);
  12.    
  13.     // 重建USB协议栈
  14.     USBDeInit();
  15.     USBInit();
  16. }
复制代码

b) 增加USB状态恢复机制:
  1. c
  2. void USBConnectionRecovery(void)
  3. {
  4.     if(USBGetConnectionStatus() == DISCONNECTED){
  5.         GPIOWritePin(USBDPPIN, LOW);
  6.         Delayms(100);
  7.         GPIOWritePin(USBDPPIN, HIGH);
  8.         USBSoftConnect();
  9.     }
  10. }
复制代码

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 15:22:39

6

主题

8

回帖

96

积分

注册会员

积分
96
发表于 昨天 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 yi  hdfa");
                                                                        delay_ms(500);
                                                                        P2=~P2;
        //<<AICUBE_USER_MAIN_LOOP_END>>
    }
下载好代码后打开串口接收测试正常,LED闪烁正常,当按下复位按键,LED还能正常闪烁,但是串口收发不能使用。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 昨天 17:25 | 显示全部楼层
P47和USB共存,修改为IO功能:

代码检测P47按键事件,参考:
截图202504301722498040.jpg
不进下载模式修改:
IAP_CONTR = 0x20;   //触发软件复位


另外需要注意:
截图202504301725284125.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 20:02 , Processed in 0.160062 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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