你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的CDC虚拟串口接收超20个字符就挂起,需要修改驱动参数

[复制链接]
kylongmu 发布时间:2017-10-5 02:37
本帖最后由 kylongmu 于 2017-10-5 02:41 编辑

F756ZG,用CubeMX生成的工程,MCU发送到主机没有问题;主机发送到MCU只要超20个字符就挂起,debug跟踪发现会挂起到HardFault_Handler(),调用堆栈找不到父函数,应该是直接引起硬件故障了。以下是我的MCU接受函数,发生挂起时根本就没有进到函数执行。
  1. #define configCOMMAND_INT_MAX_OUTPUT_SIZE 128
  2. /* USER CODE BEGIN 4 */
  3. static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)
  4. {
  5.   uint16_t Recive_Length;
  6.   Recive_Length = *Len+1;

  7.   strlcat((char*)&UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i],(char*)Buf,Recive_Length);
  8.   if(Recive_Length>=configCOMMAND_INT_MAX_OUTPUT_SIZE)//Error length
  9.   {
  10.     UARTUSB_R_Msg.Recive_Buf_Copy_i = 0;
  11.     USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  12.     USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  13.     return (USBD_OK);
  14.   }
  15.   UARTUSB_R_Msg.Recive_Buf_Copy_i += *Len;
  16.   while(UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1]=='\n' || UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1] == '\r' )//Seek to the end
  17.   {
  18.     UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1] = 0;
  19.     UARTUSB_R_Msg.Recive_Buf_Copy_i--;
  20.     UARTUSB_R_Msg.Recive_finished = 1;
  21.   }
  22.    
  23.   USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  24.   USBD_CDC_ReceivePacket(&hUsbDeviceFS);

  25.   return (USBD_OK);
  26. }

  27. /* USER CODE END 4 */
复制代码
后查看驱动源代码:
  1. #define APP_RX_DATA_SIZE  4
  2. #define APP_TX_DATA_SIZE  4
  3. /* Received Data over USB are stored in this buffer       */
  4. uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];

  5. /* Send Data over USB CDC are stored in this buffer       */
  6. uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
复制代码

此处吐血100升,改4为128后,问题消失,应该是超20个字符导致堆栈溢出了。我说ST就不能把这两个参数放到CubeMX里面可以设置,或者默认就写大点吗?
CDC的驱动仅仅给了4个字节的buffer大小,坑死人不偿命。

评分

参与人数 1 ST金币 +6 收起 理由
MrJiu + 6 很给力!

查看全部评分

收藏 1 评论11 发布时间:2017-10-5 02:37

举报

11个回答
Paderboy 回答时间:2017-10-5 09:48:49
cube里可以设置的 QQ截图20171005094824.png
MrJiu 回答时间:2017-10-5 10:14:15
楼上的更给力!!!
kylongmu 回答时间:2017-10-5 13:20:56
Paderboy 发表于 2017-10-5 09:48
cube里可以设置的

只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。
Paderboy 回答时间:2017-10-5 17:15:32
本帖最后由 Paderboy 于 2017-10-5 17:17 编辑
kylongmu 发表于 2017-10-5 13:20
只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。 ...

测试了下,最新版本的cube+L4最新的hal库可以成功设置参数,楼主可以更新到新版本的cube试试。。
QQ截图20171005171418.png

QQ截图20171005171409.png


kylongmu 回答时间:2017-10-5 18:38:39
cdc1.jpg
Cube:4.22.1
FW:F7-1.8.0
最新了,试了几遍,我的F7就是不行。
---------------------------------------------------
以下是用L496ZG来配置的,完全正常
cdc2.jpg
看来是F7独有的BUG了。
Paderboy 回答时间:2017-10-5 20:25:25
kylongmu 发表于 2017-10-5 18:38
Cube:4.22.1
FW:F7-1.8.0
最新了,试了几遍,我的F7就是不行。


F7 我也建了2个工程,一个767 一个756,都可以正确配置。。
F767ZI
QQ截图20171005201655.png

QQ截图20171005201710.png

F756ZG
QQ截图20171005202320.png

QQ截图20171005202307.png
kylongmu 回答时间:2017-10-5 21:16:52
Paderboy 发表于 2017-10-5 20:25
F7 我也建了2个工程,一个767 一个756,都可以正确配置。。
F767ZI

你的是什么版本?
Paderboy 回答时间:2017-10-5 22:19:21
kylongmu 发表于 2017-10-5 21:16
你的是什么版本?


跟你的一样。cube 4.22.1  1.8.0的F7库

工程: STM32F756ZG_CDC.rar (4.35 MB, 下载次数: 24)
kylongmu 回答时间:2017-10-5 22:37:39
Paderboy 发表于 2017-10-5 22:19
跟你的一样。cube 4.22.1  1.8.0的F7库

工程:

用你的工程一样不会同步改变,问题依旧。神奇了,看来我的成了孤立个案了。我是win10专业版64bit系统。
还是多谢你热心帮忙,看看后面升级操作系统或软件,这个问题会不会消失。
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版