本帖最后由 kylongmu 于 2017-10-5 02:41 编辑
$ l) ~* k2 y; O1 b" o7 ~ c% H: k. s1 t* ?: s
F756ZG,用CubeMX生成的工程,MCU发送到主机没有问题;主机发送到MCU只要超20个字符就挂起,debug跟踪发现会挂起到HardFault_Handler(),调用堆栈找不到父函数,应该是直接引起硬件故障了。以下是我的MCU接受函数,发生挂起时根本就没有进到函数执行。
+ Y( b1 |. V: T9 i: v) S6 Z/ t- #define configCOMMAND_INT_MAX_OUTPUT_SIZE 128/ Z* K) |; E& q; X
- /* USER CODE BEGIN 4 */% Q" A4 b* e2 v. T
- static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)
: H( n" d9 ?6 F( f& ] - {
$ O8 [+ }: Z! B+ r& j) y( s - uint16_t Recive_Length;
1 f4 ~6 M B+ c9 U - Recive_Length = *Len+1;
$ l s) x; `* |5 F$ a
1 s* ?9 C( \" B. S- strlcat((char*)&UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i],(char*)Buf,Recive_Length);
, m: G& M/ W- _" W1 \ g: B+ _ D - if(Recive_Length>=configCOMMAND_INT_MAX_OUTPUT_SIZE)//Error length- \# x6 l# X, }
- {
7 r8 B! K/ k% [+ Z9 O - UARTUSB_R_Msg.Recive_Buf_Copy_i = 0;
' ]% j- C5 d8 ^& C - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
% i( K5 \" |( }! G" e* L& { - USBD_CDC_ReceivePacket(&hUsbDeviceFS);# u% R+ n( K, c/ p
- return (USBD_OK);
+ l2 {" z0 k" T - }( \7 O! s3 j7 U7 O
- UARTUSB_R_Msg.Recive_Buf_Copy_i += *Len;
' c3 i9 d1 F( f% T8 |# X# L4 _ - 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 end6 p& S+ l( p3 p) k) g9 x! K: ?! Q
- {
4 u* @1 y7 s* @& q# r- X5 T7 i' V$ {: P - UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1] = 0;
3 J/ S: n' e( y6 F - UARTUSB_R_Msg.Recive_Buf_Copy_i--;% V# i h3 A) U0 x3 S3 q ~+ T
- UARTUSB_R_Msg.Recive_finished = 1;
# e( U& Q$ ~; O7 }- n% g! l! J - }
$ X7 w! p( }' N% D -
3 H# c5 n, D; j# O/ Z5 ]) ^1 } - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);1 n3 S. P6 \. J
- USBD_CDC_ReceivePacket(&hUsbDeviceFS);
4 V) Q! ^$ u6 n# Z5 N
5 O! l, S9 v2 ~$ [- return (USBD_OK);
! \. i7 A, N) w$ m: |* c, h; L6 i8 k - }
5 @- M2 C% b T8 _' Y; f
4 e" W- p* |' n* D( E+ v% M- /* USER CODE END 4 */
" J Q* N6 D. a! [: L9 F% ]
复制代码 后查看驱动源代码:; o; t) d3 ~4 Z: K& D2 m
- #define APP_RX_DATA_SIZE 4
( B; P/ E( B" J# u1 a6 k l - #define APP_TX_DATA_SIZE 4
0 F+ Y" B) S; M' W: L6 w( m - /* Received Data over USB are stored in this buffer */
: ^: i- ]* z" h8 x8 T - uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
' ?& {8 M* g: X6 N - 6 R& p" H$ n% K. O7 C
- /* Send Data over USB CDC are stored in this buffer */
! ?4 o* S/ W+ Z' [$ w* U - uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];' D- }: U4 b: J; u' b
复制代码 7 P5 C& P' }; ^% c6 c1 y( Q
此处吐血100升,改4为128后,问题消失,应该是超20个字符导致堆栈溢出了。我说ST就不能把这两个参数放到CubeMX里面可以设置,或者默认就写大点吗?" Q3 G! x+ }! L- j5 `" Y- T: G
CDC的驱动仅仅给了4个字节的buffer大小,坑死人不偿命。; Q9 f8 v; ^1 ~& q
|
只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。
测试了下,最新版本的cube+L4最新的hal库可以成功设置参数,楼主可以更新到新版本的cube试试。。
7 {# w4 }5 W0 P) c M, S
, e0 C" x! i/ P( D* {; Q
Cube:4.22.1
FW:F7-1.8.0; T+ l3 G: H& e2 E* B* Q6 _/ L
最新了,试了几遍,我的F7就是不行。
---------------------------------------------------
以下是用L496ZG来配置的,完全正常
看来是F7独有的BUG了。+ I7 B, z. f) P8 s$ _
2 ` J4 R& O+ a* ]# p% c* i
F7 我也建了2个工程,一个767 一个756,都可以正确配置。。 e4 q8 }/ m1 \* ?4 r7 ]) `5 k
F767ZI
0 g. v. {+ [& ^0 V. F0 p
F756ZG
: g1 o$ q( A' @3 ]9 s
你的是什么版本?
+ w p' G& H6 Q* W) G
跟你的一样。cube 4.22.1 1.8.0的F7库
. h \2 B5 \2 A
工程:
# u. v8 e( N6 D( V+ |) ]! c
用你的工程一样不会同步改变,问题依旧。神奇了,看来我的成了孤立个案了。我是win10专业版64bit系统。
还是多谢你热心帮忙,看看后面升级操作系统或软件,这个问题会不会消失。
重新下载,换用笔记本电脑新装,问题依旧。