本帖最后由 kylongmu 于 2017-10-5 02:41 编辑 1 @( ^- ^) T' X6 \, |2 u7 s- v9 i
6 E0 |/ a3 x! P) eF756ZG,用CubeMX生成的工程,MCU发送到主机没有问题;主机发送到MCU只要超20个字符就挂起,debug跟踪发现会挂起到HardFault_Handler(),调用堆栈找不到父函数,应该是直接引起硬件故障了。以下是我的MCU接受函数,发生挂起时根本就没有进到函数执行。1 [9 _ M& u- U. H. N# x2 a
- #define configCOMMAND_INT_MAX_OUTPUT_SIZE 128
1 x( h- v* A- G$ Z0 { - /* USER CODE BEGIN 4 */" _6 S1 H% e7 c. i7 D% K2 E6 l
- static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)
# n5 [6 V* v- u4 I3 I0 f - {
6 U. A! X1 t- ~: g4 D/ E' ^ - uint16_t Recive_Length;4 i. J! [3 U9 b1 f( [
- Recive_Length = *Len+1;
: u/ I5 x7 l8 j& a6 }: s2 l
4 [/ P5 Z- `% ^4 g. f( N- strlcat((char*)&UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i],(char*)Buf,Recive_Length);
1 c1 O7 D" G2 W- _3 [ - if(Recive_Length>=configCOMMAND_INT_MAX_OUTPUT_SIZE)//Error length7 A8 B: J. b) [) [! ]( K: A& p
- {
. v/ L7 {$ w' H# W - UARTUSB_R_Msg.Recive_Buf_Copy_i = 0;
5 g% h' ~ e- @/ [! x$ P A) i - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);$ v: }( X2 q1 u7 D- t+ R6 A
- USBD_CDC_ReceivePacket(&hUsbDeviceFS);* |+ L% d0 B7 F, o7 h
- return (USBD_OK);
7 D2 v# o E& a - }8 [- ~$ R. }0 I+ C! ?: P, T
- UARTUSB_R_Msg.Recive_Buf_Copy_i += *Len;
8 h ^' l1 S U# w# s - 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: F& S9 P' k q( \
- {
7 i7 @9 g3 ~" B8 Q7 n/ `! R% g! _2 @ - UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1] = 0;; u3 G+ _) F" C% F. O) [& i: _
- UARTUSB_R_Msg.Recive_Buf_Copy_i--;
: E7 \. I+ {" D1 b" n" i8 m - UARTUSB_R_Msg.Recive_finished = 1;
. q) f* B4 t0 ~' V J, [* I6 Y" C" Q1 [ - }7 s4 m d0 q) i# X( T j1 w0 O+ J
-
; ]( o0 C% D" B( N1 T - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);( O4 T4 I/ E. h
- USBD_CDC_ReceivePacket(&hUsbDeviceFS);7 A$ D7 X S) Z, t: T/ l, h! }
( y7 ~0 b/ _$ ^% ^3 Z- return (USBD_OK);
: Y* _8 _: G. k - }6 P5 }- b+ ~& X9 e6 A( f6 Z0 u! B
8 b% Q! F3 h% ?2 Q, m+ L/ H- /* USER CODE END 4 */
; Y8 s% @) [4 e5 y$ k% d7 y' L# f
复制代码 后查看驱动源代码:# ^7 }% D4 W+ B. e/ ]
- #define APP_RX_DATA_SIZE 4. t2 a+ X- I; b5 ]8 L! F! w8 ]
- #define APP_TX_DATA_SIZE 4
. s+ [: Z: B5 } - /* Received Data over USB are stored in this buffer */
: c4 r( l1 ^: G% I - uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
3 F$ Z7 o+ ~- R% \( _: K
; t2 A2 q$ T* ^8 m7 e8 ~& _- /* Send Data over USB CDC are stored in this buffer */6 p2 p4 ]& I& T0 P5 W, l$ ~% k2 u
- uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
8 n( ^3 }. A' R8 p7 w: ~
复制代码
1 q8 l% E4 m9 N2 V& Z此处吐血100升,改4为128后,问题消失,应该是超20个字符导致堆栈溢出了。我说ST就不能把这两个参数放到CubeMX里面可以设置,或者默认就写大点吗?0 p7 }* E8 M! {+ ~; `
CDC的驱动仅仅给了4个字节的buffer大小,坑死人不偿命。
' e5 Z- D0 f W; J: ^% z$ e6 x |
只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。
测试了下,最新版本的cube+L4最新的hal库可以成功设置参数,楼主可以更新到新版本的cube试试。。
+ z8 W* e- }$ x% y. @6 \
Cube:4.22.1
FW:F7-1.8.0' L7 Q4 j& p* s) \, A) Z: E; _( T. ~3 V
最新了,试了几遍,我的F7就是不行。 |* K8 Q: Z! @4 P
---------------------------------------------------
以下是用L496ZG来配置的,完全正常
看来是F7独有的BUG了。0 A+ ~, m4 W N- N! L8 L Z
F7 我也建了2个工程,一个767 一个756,都可以正确配置。。- @* N" m) ^# J( O; I: s5 Q
F767ZI 2 V: V& d5 @/ `7 a& T ?: ?/ E
( Q# T( W& V* l2 X _( J& M
F756ZG
M2 e4 u" c0 I1 H) Z p" {; D
你的是什么版本?
& j, e. Y2 X# O+ |; n' d& @5 Z
跟你的一样。cube 4.22.1 1.8.0的F7库
工程:
用你的工程一样不会同步改变,问题依旧。神奇了,看来我的成了孤立个案了。我是win10专业版64bit系统。
还是多谢你热心帮忙,看看后面升级操作系统或软件,这个问题会不会消失。
重新下载,换用笔记本电脑新装,问题依旧。