本帖最后由 kylongmu 于 2017-10-5 02:41 编辑
* e% k% A3 r; @, Q; {# P2 @. M! a f* N2 u4 |) V5 i8 Z
F756ZG,用CubeMX生成的工程,MCU发送到主机没有问题;主机发送到MCU只要超20个字符就挂起,debug跟踪发现会挂起到HardFault_Handler(),调用堆栈找不到父函数,应该是直接引起硬件故障了。以下是我的MCU接受函数,发生挂起时根本就没有进到函数执行。
/ k1 `0 s: Q$ Y# c/ U! ]- #define configCOMMAND_INT_MAX_OUTPUT_SIZE 128! \$ P0 F+ p( F. ~
- /* USER CODE BEGIN 4 */+ I9 D# N: A0 n* j/ s
- static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)
. i: r5 q( K# Y/ F; o9 O+ i - {. M& M$ R+ G' ], ?, ~( s4 a( U
- uint16_t Recive_Length;5 |9 S! r7 h& o7 T" \4 Z
- Recive_Length = *Len+1;( \" b5 i/ |, d& y1 A5 Q k
- # S( v% P4 R" ^- T: e6 \* D
- strlcat((char*)&UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i],(char*)Buf,Recive_Length);
, k, n9 E/ o- H: g - if(Recive_Length>=configCOMMAND_INT_MAX_OUTPUT_SIZE)//Error length
, V3 ]6 C1 I1 ~; H; o6 J - {6 S. T0 Z3 `) p. l' B K+ z: m7 y
- UARTUSB_R_Msg.Recive_Buf_Copy_i = 0;
, q$ @: S$ C2 I1 F% V7 k, p - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);/ h, z, f, }& M7 H
- USBD_CDC_ReceivePacket(&hUsbDeviceFS);
, p7 E, E2 l" F5 J2 [2 m: n4 g - return (USBD_OK);
2 B6 M0 M& |. _3 }# ^' p5 d4 _ - }( @2 r. j: g3 w8 R6 q3 l0 H1 k+ b" {
- UARTUSB_R_Msg.Recive_Buf_Copy_i += *Len;; R* `+ W" {* x8 e) a/ `
- 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' }; q, v7 `& L
- {
% M o' q* |! \- \' y% \/ d - UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1] = 0;8 Q4 L4 s7 q; p8 q" v
- UARTUSB_R_Msg.Recive_Buf_Copy_i--;, `4 E7 \! {5 ?" f
- UARTUSB_R_Msg.Recive_finished = 1;
) J: D# E2 G0 W( I5 s) h* T* K0 } - }0 A. t4 X7 o" \
-
1 R* i9 F: e" B - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
2 n e3 j9 J* ^+ z/ ?9 } - USBD_CDC_ReceivePacket(&hUsbDeviceFS);
% \5 I4 b; v( s0 p/ u4 K+ D9 T J2 q
; K6 S- c1 A% a- S0 @" c/ c6 o- return (USBD_OK);0 h' j5 q9 j. \3 p; G5 z& I5 S% m
- }# l! y$ p: p. a3 q% R3 S
6 g) E& ~+ ^; }: _, s$ j- /* USER CODE END 4 */
& x! @1 C) g2 o3 t$ B# f5 E/ G
复制代码 后查看驱动源代码:. X0 r. X, Z z! \, Y, u/ v
- #define APP_RX_DATA_SIZE 4: P: n. g( j3 u
- #define APP_TX_DATA_SIZE 4' e, s) D- h* p6 ]; Z! d" o8 d- D
- /* Received Data over USB are stored in this buffer */
$ L- m% ?& ?. J" g4 E3 [: q- z - uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
3 j* ?6 H1 D% t. m5 k; |( X - ) Y+ z1 c1 I/ a
- /* Send Data over USB CDC are stored in this buffer */
% I! {# E+ ?6 b% H4 n - uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];" B% K7 }* w% n7 f/ f; l
复制代码 . J; ~0 c9 Z, z1 k, A
此处吐血100升,改4为128后,问题消失,应该是超20个字符导致堆栈溢出了。我说ST就不能把这两个参数放到CubeMX里面可以设置,或者默认就写大点吗?6 |4 I& ^. h& P8 t
CDC的驱动仅仅给了4个字节的buffer大小,坑死人不偿命。: p8 q4 h) q( C& L1 S
|
只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。
测试了下,最新版本的cube+L4最新的hal库可以成功设置参数,楼主可以更新到新版本的cube试试。。* [# f) [4 s+ g; R5 v7 E# V
q! j- k* T0 z' {8 M
; U. S- E1 _( K4 j; v! {5 y
Cube:4.22.1
FW:F7-1.8.0# W, h5 a% }" Q
最新了,试了几遍,我的F7就是不行。
---------------------------------------------------+ }) B* |3 X0 r2 V5 D; K8 M4 J
以下是用L496ZG来配置的,完全正常2 a) ?' {7 ^! v" [
看来是F7独有的BUG了。, y* l0 x/ v9 Q! @- A
F7 我也建了2个工程,一个767 一个756,都可以正确配置。。' M& n& W g) u: x1 |+ s
F767ZI " c* N0 j2 j6 k$ f2 B8 J
* Y# X' r% Q) E
F756ZG
2 h4 I Z7 o1 Z8 b) e0 ?( \! Q
你的是什么版本?
跟你的一样。cube 4.22.1 1.8.0的F7库/ K9 [, |( o6 C+ e2 x3 ^
工程:
0 _' e0 {+ Z* S
用你的工程一样不会同步改变,问题依旧。神奇了,看来我的成了孤立个案了。我是win10专业版64bit系统。
还是多谢你热心帮忙,看看后面升级操作系统或软件,这个问题会不会消失。
重新下载,换用笔记本电脑新装,问题依旧。