找回密码
 立即注册
查看: 188|回复: 5

USB-CDC串口发送卡死,while循环正常,CDC设备在线,就是printf打印不出去

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-25 22:09:57
已绑定手机

1

主题

2

回帖

19

积分

新手上路

积分
19
发表于 2025-5-24 10:59:42 | 显示全部楼层 |阅读模式
USB-CDC串口发送卡死,while循环正常,CDC设备在线,就是printf打印不出去
  1. //使用BL51链接器,BL51 misc取消警告代码:16,目标:内存模式使用large 模式,把变量存在Xdata中
  2. //使用USB库文件,并实现不断电下载。但是首次下载需要把P3.2拉低,在上电,USB库需要打开两个中断
  3. //
  4. #include "Config.h"
  5. #define Vbus (*Vbus_ptr) //宏定义只是文本替换,没有顺序结构
  6. #define Vfb (*Vfb_ptr)
  7. #define Vre (*Vre_ptr)
  8. PWMx_Duty PWMB_Duty;
  9. volatile u8 ADC_tmp[18] _at_ 0x0102;//每个通道占6位, 0|高字节 1|低 2|通道号 3|取平均值后余数 4|平均高字节 5|平均低字节(内存对齐在ADC设置)
  10. u16 *Vbus_ptr = (u16 *)&ADC_tmp[0];//ADC通道0 的数值,定义了读取两个字节的指针
  11. u16 *Vfb_ptr = (u16 *)&ADC_tmp[6];//ADC通道3 的数值,定义了读取两个字节的指针
  12. u16 *Vre_ptr = (u16 *)&ADC_tmp[12];//ADC通道15 的数值,定义了读取两个字节的指针
  13. /******************** IO配置函数 **************************/
  14. void GPIO_config(void)
  15. {
  16.         // ADC P1.3光耦反馈CH3
  17.         GPIO_InitTypeDef GPIO_InitStructure;                // 结构定义
  18.         GPIO_InitStructure.Pin = GPIO_Pin_3;                // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
  19.         GPIO_InitStructure.Mode = GPIO_HighZ;                // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  20.         GPIO_Inilize(GPIO_P1, &GPIO_InitStructure); // 初始化
  21.         // ADC P1.0 Vus CH0
  22.         GPIO_InitStructure.Pin = GPIO_Pin_0;                // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
  23.         GPIO_InitStructure.Mode = GPIO_HighZ;                // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  24.         GPIO_Inilize(GPIO_P1, &GPIO_InitStructure); // 初始化
  25.         // PWM P1.7
  26.         GPIO_InitStructure.Pin = GPIO_Pin_7;                // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
  27.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  28.         GPIO_Inilize(GPIO_P1, &GPIO_InitStructure); // 初始化
  29.         // LED P5.4
  30.         GPIO_InitStructure.Pin = GPIO_Pin_4;                // 指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
  31.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  32.         GPIO_Inilize(GPIO_P5, &GPIO_InitStructure); // 初始化
  33. }
  34. /******************* AD配置函数 *******************/
  35. void ADC_config(void)//每次转换时间计算,
  36. {
  37.         ADC_InitTypeDef ADC_InitStructure; // 结构定义
  38.         ADC_InitStructure.ADC_SMPduty = 31;                                           // ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
  39.         ADC_InitStructure.ADC_CsSetup = 0;                                           // ADC 通道选择时间控制 0(默认),1
  40.         ADC_InitStructure.ADC_CsHold = 1;                                           // ADC 通道选择保持时间控制 0,1(默认),2,3
  41.         ADC_InitStructure.ADC_Speed = ADC_SPEED_2X5T;                   // 设置 ADC 工作时钟频率        ADC_SPEED_2X1T~ADC_SPEED_2X16T
  42.         ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; // ADC结果调整,        ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
  43.         ADC_Inilize(&ADC_InitStructure);                                           // 初始化
  44.         ADC_PowerControl(ENABLE);                                                           // ADC电源开关, ENABLE或DISABLE
  45.         NVIC_ADC_Init(ENABLE, Priority_0);                                           // 中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  46. }
  47. void ADC_DMA(void) // 后续需要创建文件和结构体
  48. {
  49.         DMA_ADC_CFG = 0; // 不允许中断
  50.         DMA_ADC_RXAH = (unsigned int)&ADC_tmp >> 8;
  51.         DMA_ADC_RXAL = (unsigned int)&ADC_tmp; // ADC数据存放的地址
  52.         DMA_ADC_CFG2 = 0x00;                                   // 每个通道转换次数转换1次
  53.         DMA_ADC_CHSW0 = 0x09;                                   // 通道使能 0-7
  54.         DMA_ADC_CHSW1 = 0x80;                                   // 通道使能 8-15
  55.         DMA_ADC_CR = 0xff;                                           // 允许DMA 开启DMA
  56. }
  57. /***************  PWM初始化函数 *****************/
  58. void PWM_config(void)
  59. {
  60.         PWMx_InitDefine PWMx_InitStructure;
  61.         PWMx_InitStructure.PWM_Mode = CCMRn_PWM_MODE1;           // 模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
  62.         PWMx_InitStructure.PWM_Duty = PWMB_Duty.PWM5_Duty; // PWM占空比时间, 0~Period
  63.         PWMx_InitStructure.PWM_EnoSelect = ENO5P;                   // 输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
  64.         PWM_Configuration(PWM5, &PWMx_InitStructure);           // 初始化PWM,  PWMA,PWMB
  65.         PWMx_InitStructure.PWM_Period = 692;                   // 周期时间,   0~65535
  66.         PWMx_InitStructure.PWM_DeadTime = 0;                   // 死区发生器设置, 0~255
  67.         PWMx_InitStructure.PWM_MainOutEnable = ENABLE; // 主输出使能, ENABLE,DISABLE
  68.         PWMx_InitStructure.PWM_CEN_Enable = ENABLE;           // 使能计数器, ENABLE,DISABLE
  69.         PWM_Configuration(PWMB, &PWMx_InitStructure);  // 初始化PWM通用寄存器,  PWMA,PWMB
  70.         // NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
  71.         PWM5_SW(PWM5_SW_P17); // PWM5_SW_P20,PWM5_SW_P17,PWM5_SW_P00,PWM5_SW_P74
  72.         PWMB_Duty.PWM5_Duty = 0;
  73. }
  74. /************************ 定时器配置 ****************************/
  75. void Timer_config(void)
  76. {
  77.         TIM_InitTypeDef TIM_InitStructure; // 结构定义
  78.         // 定时器0做16位自动重装, 中断频率为100000HZ,中断函数从P6.7取反输出50KHZ方波信号.
  79.         TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; // 指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
  80.         TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;  // 指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
  81.         TIM_InitStructure.TIM_ClkOut = DISABLE;                          // 是否输出高速脉冲, ENABLE或DISABLE
  82.         TIM_InitStructure.TIM_Value = 0;                                  // 65535-(MAIN_Fosc/65000);                //初值,
  83.         TIM_InitStructure.TIM_Run = ENABLE;                                  // 是否初始化后启动定时器, ENABLE或DISABLE
  84.         Timer_Inilize(Timer0, &TIM_InitStructure);                  // 初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
  85.         NVIC_Timer0_Init(ENABLE, Priority_0);                          // 中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  86. }
  87. void main(void)
  88. {
  89.         uint32_t step1;
  90.         uint32_t step2;
  91.   u16 Vbus_Actual;
  92.         u16 Vfb_Actual;
  93.         u8 i;
  94.         EAXSFR(); /* 扩展寄存器访问使能 */
  95.         GPIO_config();
  96.         ADC_config();
  97.         PWM_config();
  98.         Timer_config();
  99.         ADC_DMA();
  100.        
  101.         usb_init();         // USB CDC 接口配置
  102.         IE2 |= 0x80; // 使能USB中断
  103.         EA = 1;                 // IE |= 0X80;
  104.         while (DeviceState != DEVSTATE_CONFIGURED)
  105.                 ; // 等待USB完成配置
  106.         while (1)
  107.         {
  108.                          step1 = (uint32_t)Vfb * 1190;  // 4095 * 1190 = 4,874,550
  109.                          step2 = step1 / Vre;           // 4,874,550 / 1151 ≈ 4239.57
  110.                 printf("反馈电压是:%hu\n\n",Vbus);
  111.                 DMA_ADC_CR |= 0x40; // ADC_DMA继续开始
  112.                 delay_ms(1000);
  113.                 P54 = ~P54;
  114.         }
  115. }
复制代码

文件结构

文件结构
微信截图_20250524105046.png
现象描述,while循环中LED继续闪烁,但是USB_CDC的串口,在接收了一段时间后卡死不动了,不停电下载会一直提示“HID-ISP...”
我的初步判断是,USB这边配置没正确,但是不知道问题根本原因,



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1920

回帖

4311

积分

荣誉版主

无情的代码机器

积分
4311
发表于 2025-5-24 14:28:49 来自手机 | 显示全部楼层
可以复现吗,上传完整工程我晚点试下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-25 22:09:57
已绑定手机

1

主题

2

回帖

19

积分

新手上路

积分
19
发表于 2025-5-24 23:35:33 | 显示全部楼层
erci*** 发表于 2025-5-24 14:28
可以复现吗,上传完整工程我晚点试下

demo.rar (450.06 KB, 下载次数: 7)

IRC=45.158MHZ
复位口做I/O口

点评

先将主频降到 40MHz, 再测试下  详情 回复 发表于 2025-5-25 09:37
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16651
发表于 2025-5-25 09:37:06 | 显示全部楼层
大龄*** 发表于 2025-5-24 23:35
IRC=45.158MHZ
复位口做I/O口

STC8H8K64U, 先将主频降到 40MHz, 再测试下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1920

回帖

4311

积分

荣誉版主

无情的代码机器

积分
4311
发表于 2025-5-25 14:19:58 | 显示全部楼层
确实复测用40MHz正常,45.1584MHz复现阻塞异常

另外这个delay_ms入参是unsigned char ms,不要输入1000.

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-25 22:09:57
已绑定手机

1

主题

2

回帖

19

积分

新手上路

积分
19
发表于 2025-5-25 22:09:57 | 显示全部楼层
erci*** 发表于 2025-5-25 14:19
确实复测用40MHz正常,45.1584MHz复现阻塞异常

另外这个delay_ms入参是unsigned char ms,不要输入1000.

多谢支持,把主频降到40Mhz,不会卡了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 03:26 , Processed in 0.135321 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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