本帖最后由 kylongmu 于 2017-10-5 02:41 编辑
F756ZG,用CubeMX生成的工程,MCU发送到主机没有问题;主机发送到MCU只要超20个字符就挂起,debug跟踪发现会挂起到HardFault_Handler(),调用堆栈找不到父函数,应该是直接引起硬件故障了。以下是我的MCU接受函数,发生挂起时根本就没有进到函数执行。
- #define configCOMMAND_INT_MAX_OUTPUT_SIZE 128
- /* USER CODE BEGIN 4 */
- static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)
- {
- uint16_t Recive_Length;
- Recive_Length = *Len+1;
- strlcat((char*)&UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i],(char*)Buf,Recive_Length);
- if(Recive_Length>=configCOMMAND_INT_MAX_OUTPUT_SIZE)//Error length
- {
- UARTUSB_R_Msg.Recive_Buf_Copy_i = 0;
- USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
- USBD_CDC_ReceivePacket(&hUsbDeviceFS);
- return (USBD_OK);
- }
- UARTUSB_R_Msg.Recive_Buf_Copy_i += *Len;
- 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
- {
- UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1] = 0;
- UARTUSB_R_Msg.Recive_Buf_Copy_i--;
- UARTUSB_R_Msg.Recive_finished = 1;
- }
-
- USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
- USBD_CDC_ReceivePacket(&hUsbDeviceFS);
- return (USBD_OK);
- }
- /* USER CODE END 4 */
复制代码 后查看驱动源代码:
- #define APP_RX_DATA_SIZE 4
- #define APP_TX_DATA_SIZE 4
- /* Received Data over USB are stored in this buffer */
- uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
- /* Send Data over USB CDC are stored in this buffer */
- uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
复制代码
此处吐血100升,改4为128后,问题消失,应该是超20个字符导致堆栈溢出了。我说ST就不能把这两个参数放到CubeMX里面可以设置,或者默认就写大点吗?
CDC的驱动仅仅给了4个字节的buffer大小,坑死人不偿命。
|
只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。
测试了下,最新版本的cube+L4最新的hal库可以成功设置参数,楼主可以更新到新版本的cube试试。。
Cube:4.22.1
FW:F7-1.8.0
最新了,试了几遍,我的F7就是不行。
---------------------------------------------------
以下是用L496ZG来配置的,完全正常
看来是F7独有的BUG了。
F7 我也建了2个工程,一个767 一个756,都可以正确配置。。
F767ZI
F756ZG
你的是什么版本?
跟你的一样。cube 4.22.1 1.8.0的F7库
工程:
用你的工程一样不会同步改变,问题依旧。神奇了,看来我的成了孤立个案了。我是win10专业版64bit系统。
还是多谢你热心帮忙,看看后面升级操作系统或软件,这个问题会不会消失。