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

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

[复制链接]
kylongmu 发布时间:2017-10-5 02:37
本帖最后由 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! ]
  1. #define configCOMMAND_INT_MAX_OUTPUT_SIZE 128! \$ P0 F+ p( F. ~
  2. /* USER CODE BEGIN 4 */+ I9 D# N: A0 n* j/ s
  3. static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)
    . i: r5 q( K# Y/ F; o9 O+ i
  4. {. M& M$ R+ G' ], ?, ~( s4 a( U
  5.   uint16_t Recive_Length;5 |9 S! r7 h& o7 T" \4 Z
  6.   Recive_Length = *Len+1;( \" b5 i/ |, d& y1 A5 Q  k
  7. # S( v% P4 R" ^- T: e6 \* D
  8.   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
  9.   if(Recive_Length>=configCOMMAND_INT_MAX_OUTPUT_SIZE)//Error length
    , V3 ]6 C1 I1 ~; H; o6 J
  10.   {6 S. T0 Z3 `) p. l' B  K+ z: m7 y
  11.     UARTUSB_R_Msg.Recive_Buf_Copy_i = 0;
    , q$ @: S$ C2 I1 F% V7 k, p
  12.     USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);/ h, z, f, }& M7 H
  13.     USBD_CDC_ReceivePacket(&hUsbDeviceFS);
    , p7 E, E2 l" F5 J2 [2 m: n4 g
  14.     return (USBD_OK);
    2 B6 M0 M& |. _3 }# ^' p5 d4 _
  15.   }( @2 r. j: g3 w8 R6 q3 l0 H1 k+ b" {
  16.   UARTUSB_R_Msg.Recive_Buf_Copy_i += *Len;; R* `+ W" {* x8 e) a/ `
  17.   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
  18.   {
    % M  o' q* |! \- \' y% \/ d
  19.     UARTUSB_R_Msg.Recive_Buf_Copy[UARTUSB_R_Msg.Recive_Buf_Copy_i-1] = 0;8 Q4 L4 s7 q; p8 q" v
  20.     UARTUSB_R_Msg.Recive_Buf_Copy_i--;, `4 E7 \! {5 ?" f
  21.     UARTUSB_R_Msg.Recive_finished = 1;
    ) J: D# E2 G0 W( I5 s) h* T* K0 }
  22.   }0 A. t4 X7 o" \
  23.    
    1 R* i9 F: e" B
  24.   USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
    2 n  e3 j9 J* ^+ z/ ?9 }
  25.   USBD_CDC_ReceivePacket(&hUsbDeviceFS);
    % \5 I4 b; v( s0 p/ u4 K+ D9 T  J2 q

  26. ; K6 S- c1 A% a- S0 @" c/ c6 o
  27.   return (USBD_OK);0 h' j5 q9 j. \3 p; G5 z& I5 S% m
  28. }# l! y$ p: p. a3 q% R3 S

  29. 6 g) E& ~+ ^; }: _, s$ j
  30. /* USER CODE END 4 */
    & x! @1 C) g2 o3 t$ B# f5 E/ G
复制代码
后查看驱动源代码:. X0 r. X, Z  z! \, Y, u/ v
  1. #define APP_RX_DATA_SIZE  4: P: n. g( j3 u
  2. #define APP_TX_DATA_SIZE  4' e, s) D- h* p6 ]; Z! d" o8 d- D
  3. /* Received Data over USB are stored in this buffer       */
    $ L- m% ?& ?. J" g4 E3 [: q- z
  4. uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
    3 j* ?6 H1 D% t. m5 k; |( X
  5. ) Y+ z1 c1 I/ a
  6. /* Send Data over USB CDC are stored in this buffer       */
    % I! {# E+ ?6 b% H4 n
  7. 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

评分

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

查看全部评分

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

举报

11个回答
Paderboy 回答时间:2017-10-5 09:48:49
cube里可以设置的 QQ截图20171005094824.png ( m7 d! M6 Y. u" [( Z' n
MrJiu 回答时间:2017-10-5 10:14:15
楼上的更给力!!!
kylongmu 回答时间:2017-10-5 13:20:56
Paderboy 发表于 2017-10-5 09:485 e7 K7 h7 I: h- [5 K3 W/ Y
cube里可以设置的

4 F# s6 P; {+ R只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。
Paderboy 回答时间:2017-10-5 17:15:32
本帖最后由 Paderboy 于 2017-10-5 17:17 编辑 7 R# D8 ]; L4 O' k
kylongmu 发表于 2017-10-5 13:20( x. ?! \. W) R2 y! }9 n
只设置这里没有用的,驱动里写死了是4,并没有用这两个宏定义,或者说这是驱动的BUG。 ...

) t$ T2 I  |% g' V测试了下,最新版本的cube+L4最新的hal库可以成功设置参数,楼主可以更新到新版本的cube试试。。* [# f) [4 s+ g; R5 v7 E# V
QQ截图20171005171418.png 9 R* L0 j9 ]0 L/ C7 d
  q! j- k* T0 z' {8 M
QQ截图20171005171409.png
/ x9 h, X* l8 Y1 K; c
9 \0 ~4 X5 w( M; U. S- E1 _( K4 j; v! {5 y
kylongmu 回答时间:2017-10-5 18:38:39
cdc1.jpg 8 r) C& ?/ C+ _4 H' R: T
Cube:4.22.1
5 W$ t7 e( o$ J$ ?# _! X4 h$ ^FW:F7-1.8.0# W, h5 a% }" Q
最新了,试了几遍,我的F7就是不行。
9 y* w2 w! ~& L: s8 X% z---------------------------------------------------+ }) B* |3 X0 r2 V5 D; K8 M4 J
以下是用L496ZG来配置的,完全正常2 a) ?' {7 ^! v" [
cdc2.jpg
/ I0 o9 y+ m7 `; I3 z看来是F7独有的BUG了。, y* l0 x/ v9 Q! @- A
Paderboy 回答时间:2017-10-5 20:25:25
kylongmu 发表于 2017-10-5 18:38
: e+ f4 x9 X; nCube:4.22.1+ B4 z( b! l5 v, z7 f5 @  }
FW:F7-1.8.0
$ N. y' V2 ?  p$ C2 J. J; ~最新了,试了几遍,我的F7就是不行。

9 X6 Q* l  c# S2 V+ ]
" M$ H6 J9 N9 z5 C# @: PF7 我也建了2个工程,一个767 一个756,都可以正确配置。。' M& n& W  g) u: x1 |+ s
F767ZI " c* N0 j2 j6 k$ f2 B8 J
QQ截图20171005201655.png 1 z5 E  S" I7 V% B" Y

/ ]0 F2 W/ H  r6 _ QQ截图20171005201710.png 7 r6 y+ T/ F6 V! {
* Y# X' r% Q) E
F756ZG
3 Z+ t7 {4 u* D5 E6 n QQ截图20171005202320.png
8 {9 {, O$ B" u' _# h8 p' Z# v2 h4 I  Z7 o1 Z8 b) e0 ?( \! Q
QQ截图20171005202307.png / [: v" v' \* ?0 N2 B( b9 u* a
kylongmu 回答时间:2017-10-5 21:16:52
Paderboy 发表于 2017-10-5 20:25+ g; I5 k. u& D+ k1 e1 v
F7 我也建了2个工程,一个767 一个756,都可以正确配置。。
! q  M$ N  ^' mF767ZI

$ @) Z: ]3 e* G' o5 K2 f9 `你的是什么版本?
Paderboy 回答时间:2017-10-5 22:19:21
kylongmu 发表于 2017-10-5 21:163 U5 k7 H& Z+ P$ J
你的是什么版本?
" A! l8 R) \+ s4 u5 ]0 V6 j+ ]

. N7 t% a5 S$ F8 I3 {跟你的一样。cube 4.22.1  1.8.0的F7库/ K9 [, |( o6 C+ e2 x3 ^

! s1 V1 `* u. b' }. x工程: STM32F756ZG_CDC.rar (4.35 MB, 下载次数: 24)
kylongmu 回答时间:2017-10-5 22:37:39
Paderboy 发表于 2017-10-5 22:19
) c# z, j" P+ [6 F: D0 E跟你的一样。cube 4.22.1  1.8.0的F7库+ P9 L; U# W& w# u6 g

% Z8 A( T/ [- S" J! F& U) r工程:

* [3 ?9 S$ h& j2 L用你的工程一样不会同步改变,问题依旧。神奇了,看来我的成了孤立个案了。我是win10专业版64bit系统。
. ?/ P8 l- q  Y, A$ q还是多谢你热心帮忙,看看后面升级操作系统或软件,这个问题会不会消失。
kylongmu 回答时间:2017-10-6 16:51:43
kylongmu 发表于 2017-10-5 22:37
$ O* t' u2 a2 A- [0 `用你的工程一样不会同步改变,问题依旧。神奇了,看来我的成了孤立个案了。我是win10专业版64bit系统。
# }2 ^1 o! [! J ...

& y/ i( Z$ v+ [. k6 L; B1 t/ I重新下载,换用笔记本电脑新装,问题依旧。
深山明月 回答时间:2017-10-9 22:51:59
直接1024

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版