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

STM32CubeMX开发之STM32F407USB实验(CDC虚拟串口)

[复制链接]
STMCU小助手 发布时间:2023-2-2 15:47
前言- F6 ?. P+ J0 ^* |$ {
本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。
; A; d$ ?1 D) R: D6 Y' j# Z2 CUSB通信引脚 与 MCU引脚 对应关系如下:6 a% J, p* s6 L- f; q3 [/ ]
7 ~0 ]: B2 \- k
(N[{M2V35~IJUGMBT21MCSS.png
+ p1 D# c. a( `/ o. y0 ~

0 D# A  w8 p, J* w: z7 |原理图
4 E: {- w9 A+ @, e1 H5 r
/ f' w1 {3 K' F: H: I1 ^* |+ ]
0ffe931f944e409aa3ef895ad8d377aa.png $ j  U, q$ F' u2 o
5 h0 D9 Q' E; m; `
% @$ n5 T0 {) K4 K- X( c" c
一、使用STM32CubeMX----新建USB实验工程/ z: ?. p0 U$ V3 [# O
步骤1:打开 STM32CubeMX 软件
" x, B! d4 I) l- F" y: i具体 STM32CubeMX 界面如下:
2 K$ W* }, ]# T1 S* S. N
* i+ @! _5 w. ~4 U
5e3baed520ec4265a0fa5d86e128a87d.png
' e2 g! p# k( m5 s5 ^& G( ~; }3 w& \" v5 B. ]
步骤2:选择 从MCU开始我的项目
$ G! ]/ S* q6 S; n- s) j" s! E
3 k5 v. v4 w; G# s
b78fbedc12aa48528cd6ee408cb781a5.png 0 `; S! f2 _6 c8 A; _7 ?" k5 V) ]

3 t9 `, j) ~4 y步骤3:选择MCU芯片, T1 O( ]7 U, g- h7 V" ^
我们本次实验选择 STM32F407VET6 芯片做 MCU。
, H/ z' g" o9 T6 W1 o/ e  Q, r; P$ d
fe3160420fda4e639189697407f7a41e.png , }1 _0 t5 H- \; y8 q; O( \

: v9 s" y$ Y/ H4 p( X& R

- g/ g) a- c' D进入工程编辑,具体界面如下:
! }8 b' }& c) y. }$ R5 M- Q
" R, L/ s; L* f$ m
2b36307036d54321854c09041aef8af2.png - H: \  q9 e* l7 M2 u  q5 o
0 [7 X/ ?9 S+ d6 r
步骤4:设置烧写方式为 SWD模式
% S. F( U! u/ }' f# i/ b这一步必须选择一种烧写方式,否则烧写一次程序后,芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序; F; J2 k  a- P: b
6 P- j2 E( \. o. U' X& X7 y
772505d02fc841edb6087325c6d5a918.png 1 G& I. C. _+ q% F$ `
+ ~! W, E' O+ U2 {1 `# p# F
步骤5:设置时钟源2 m6 e- T  a: T8 I1 W: \
设置外部晶振为芯片系统时钟源。
6 n, x' K6 ~' I9 b% }6 W; F( t. p( q/ q5 K9 c
9d4935492cd940f8a8f9d70b24ff5d5c.png 2 T, v+ }* z4 i9 w9 w

. `: t/ N: z! F4 L步骤6:USB通信配置
+ ^: L. [# H4 n) [& q激活 USB 设备1 r. g3 D; N! q; ?& O
* I6 Q" L2 F( A8 D$ p
3a7889bcf93246759229dfbd0756c59c.png . v- [, I' z2 I! s) l2 ]+ {( C
5 F& r$ j: U6 z6 t, d3 C
选择CDC模拟串口5 M" b; T2 j; T5 Y
/ X) E7 q7 z; j! a% E4 N( O, U
9eeb84778149413c92046fb8a6851e37.png % p( c( t2 x- k2 t! W, W  Y% O
9 p7 \! v% U# _3 P! _6 ^2 t; }

5 e" U4 G  X! R. J3 [3 Z* O8 \步骤7:设置时钟
# B- ^1 Q& }6 c1 k# G+ s4 m) m因为USB的时钟需要 48MHz,所以时钟配置如下:* O& p) y0 B% k' \! A

8 X7 T  }4 c& o
30ac6a7ae6ef4897bc2ceec484b379ce.png
  ]" Z2 ^9 t  n, s7 _& ~/ Y" W' ?* @0 y+ A2 s" F% q' m
- j7 @3 C+ Z  A8 T7 {3 [
步骤8:项目编辑% v! O: h* y' I1 ^9 |+ j
堆设置大一点,否则识别不到USB。
8 ~  |' X9 ^- U. ~9 Y% d1 z. v- G" i+ t1 p2 h! v# B2 w. U* b
c636c3e66e534d3da4e2d2c6b9165e7c.png " J1 W; V) w4 Z7 i" w
" z3 U; r4 c- \8 ]' r  m
步骤9:代码生成编辑+ D. A9 w/ f  l$ S7 l

- R4 {# g4 Q/ p& }
61eaf4a2790c4e5a89ab2b777d2b2b24.png
' R$ V2 [$ u0 S: ]" n9 A" B
6 O- p) x% R$ I! R3 A3 P  h, X步骤10:点击 GENERATE CODE 生成代码- P' [+ d/ W' U9 Y# [! ^
$ _: H0 m0 v( z5 E
9fe5104095df4ce9b3e59e948637ae60.png * Q- c) X: ^7 ]9 w1 v% `

7 d1 y( P: e4 a& s1 ^" O新建的工程,已经生成,接下来就是对工程代码的编辑。
2 @1 y) h! {8 y6 w( a- G5 C( r4 Q3 \9 M: j& @/ r
" n9 |, z; `+ m- }6 L  x
二、使用keil5----编辑程序9 c0 v0 w. C  M, K
想要使用keil5打开工程,需要电脑先安装 keil5编译环境,具体操作流程。
5 {/ `5 K' i! Q0 p( Y5 w) B' E
( X+ `% j2 n) W" p2 z" Z  }4 P9 ]
步骤1:使用keil5打开工程  l7 E( D, ?4 G! |
点击工程文件中的MDK-ARM 文件
  j, l5 ~5 t, R' [; p) v4 B- _8 `* X5 j5 E- \; x2 F/ j  u- I" p1 R
bade50b163404970a35f8f80ffdba501.png
& y" P/ K" g; d# T
* c& g. M; D( [5 m) `1 L
打开keil5工程$ b" r* s8 n+ u% u
4 R! h, P! b5 w+ m( _  x' e
7b083045873c4683a9f445d8d99ceea0.png 8 C% f! ~: ?: G% s  N$ C3 k

- M( ?  e/ I9 a  T+ ?3 h. I8 g步骤2:用户代码编辑位置2 ~* O" r. g- D2 S8 _
用户代码 要写在 USER xxxx BEGIN xxx 和 USER xxxx END xxx 之间。
/ H& \) X+ m  W+ k$ Z* u  E0 F这样下次使用 STM32CubeMX 重新生成代码后,自己写的代码不会被删除。& r( E/ G5 R- s: y! \, p8 z$ p

9 o2 n1 W! R- D2 b7 w; v
bb60a691bb4145209db966d0f63aecb3.png 0 N: v4 t- d) M# t0 W/ i# o
  A4 r$ v+ ]9 N3 Q1 |  x
步骤3:查看USB虚拟串口的端口3 ^2 i6 t+ ]- b
首先编译程序,然后烧录程序到开发板,具体步骤如下:3 t* N2 a) U5 _0 x: F6 ]

& `- b! P' p$ c1 X4 I. S  s烧写完程序后,连接开发板和PC端电脑,然后在设备管理器中查看USB虚拟串口的端口。) ~2 m- d' u, d, O
有以下端口,就说明USB虚拟串口功能实现了。( d( f6 _/ {8 \7 M( T. \
5 Y% \) p. f  d( x
fadf11a591f849f5988973bd07bade02.png
! x+ w/ C9 i- }7 Y6 A& [5 g3 q; N. M, [% e/ D$ }# q0 c/ n3 q* [
步骤4:USB虚拟串口发送数据
! @5 ?: F, `; Z; D% [在 usbd_cdc_if.c 文件中有 USB虚拟串口发送函数:
0 Z: _) p4 k- |
  1. /** USB虚拟串口发送函数6 l2 b) L% a; m
  2.   * 参数1:Buf 要发送的数据缓存区% {9 G7 s6 A; {& S
  3.   * 参数2:Len 要发送的数据个数8 ?2 ~" x" ~4 H/ O& N/ w' z
  4.   * 返回值:USBD_OK-成功,USBD_BUSY-忙碌, USBD_FAIL-失败  ?4 t7 r7 @, ?, O1 c* k
  5.   */
    & c8 M/ s5 \6 K( j7 i
  6. uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
    1 G9 L9 J2 ~1 f5 \, }
复制代码

$ ]/ C/ M0 \0 }% j将头文件 #include "usbd_cdc_if.h" 添加到 main.c 中。4 u; H2 P: q- x% o

& v( J) J. {/ {- O6 | 5d05ebcf2a534b6ea8319fe615bf3766.png
( j9 x- J' \: Z, }" _# a

7 ~9 c" @' d. Z( D- A: T在 main主函数循环中添加 USB虚拟串口发送函数
9 B) u; {7 H9 q: T  _' V( f* X- t
  1. int main(void)
    " P% S9 |2 b5 \% N- T: {
  2. {# c  g% X3 }9 l$ l* u
  3.   /* USER CODE BEGIN 1 */
    + Z( `$ w% G, C& Y8 ?# Y7 Y
  4. & B/ a( O  A( N& U+ U$ o  R* T
  5.   /* USER CODE END 1 */
    ' L4 F1 K! Q5 S
  6. 6 f" ^8 P5 C* W% K; C3 z( O$ @6 P' d
  7.   /* MCU Configuration--------------------------------------------------------*/
    : Q5 \1 S  _- j. K) O0 _* F/ O

  8. 2 B$ @' i# q3 r0 B8 @- K0 q4 p
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    ! P8 \# b! ]9 l$ a8 d
  10.   HAL_Init();
    ; Y: Y$ ^. Y0 W9 R$ Z

  11. " i2 O( B- P# u  H$ ?
  12.   /* USER CODE BEGIN Init */
    2 `+ C: j8 y0 Z1 G; F/ v' L' F% F; z- w
  13. 0 v. l# l4 k4 o7 F9 K1 ~! N, Z
  14.   /* USER CODE END Init *// z2 h( j) g- K; @
  15. 3 B6 S  O7 }( d: B: W$ @4 ^# n
  16.   /* Configure the system clock */
    1 Q. _- P7 y) |1 l
  17.   SystemClock_Config();; i2 K! A* x5 g) z
  18. 6 i1 g9 ^* W% o+ n5 x' P# q  _- A: ]8 y
  19.   /* USER CODE BEGIN SysInit */5 Y' B) F/ f; v$ w) E9 H/ i$ ]2 ^. Q
  20. 5 ]6 S, C6 y4 \5 T' u# i' x
  21.   /* USER CODE END SysInit */4 S+ Q- l2 {8 m$ q

  22. 9 a- d, [1 W8 k5 ^
  23.   /* Initialize all configured peripherals */
    ) `" W  w1 W; `2 q$ C6 T+ A* b
  24.   MX_GPIO_Init();* I9 e5 C0 |8 R
  25.   MX_USART1_UART_Init();* F) g( ~9 Z# Q* G4 h: b
  26.   MX_USB_DEVICE_Init();
    2 v4 h/ U1 ?3 D' H) ?+ S: V" r
  27.   /* USER CODE BEGIN 2 */; a# y* w4 u6 Q4 Q. {6 L
  28. * ^6 \$ A; A1 h
  29.   /* USER CODE END 2 */; C3 Q- H( Y$ L

  30. % G4 L* _/ o1 s8 ~% Q
  31.   /* Infinite loop */
    & o  i! B( j  v2 s8 M* u4 M
  32.   /* USER CODE BEGIN WHILE */
    " f: s- u1 s. G/ @- Y, e. j1 }) D
  33.   while (1)
    # z7 u1 L# K7 e" J" o- e. o9 F6 f7 Y
  34.   {
    1 s1 o( p+ C: q9 `  y, ?
  35.     /* USER CODE END WHILE */  k) @4 A% W$ ^* b# A

  36. # F$ j% [2 ]( i* D) J/ B
  37.     /* USER CODE BEGIN 3 */+ n* n% B5 k7 e
  38.         CDC_Transmit_FS("工欲善其事,必先利其器。",strlen("工欲善其事,必先利其器。"));
    2 E) U+ u# I0 l$ p5 E( h
  39.         HAL_Delay(500);* o0 U1 c, [* i3 c% F4 y0 R
  40.   }
    6 H4 P* o  d% e3 D/ ]7 G/ @
  41.   /* USER CODE END 3 */8 w' r9 c! J4 }
  42. }8 V$ [" o5 K9 o; M- P& f
复制代码
$ x! Y2 g& U. o% a
使用串口助手打印数据如下:0 ?) \; u& c/ I/ r1 t

' S6 B# o: B8 s6 d
3ee5814c820741cb8577affb9e366334.png
# \9 ]$ Z3 ~# e# S; u: z9 j$ q/ d# {. L% c
步骤5:USB虚拟串口接收数据
7 n4 _1 H, D# o6 V在 usbd_cdc_if.c 文件中,有 USB虚拟串口接收函数:( l- [+ ?) Q8 s# U$ t9 I  }: x# K* U
  1. /** USB虚拟串口接收函数
    0 f; \5 J3 N0 z1 s( L0 _+ p! g
  2.   * 参数1:Buf 要接收的数据缓存区
      |( y8 |$ S1 h; s+ k$ i5 @
  3.   * 参数2:Len 要接收的数据个数
    7 Q( z3 l6 }3 h: m! u( o  T3 ~
  4.   * 返回值:USBD_OK-成功,USBD_FAIL-失败
    " _2 A( S2 [3 {+ a  J0 t3 a) o
  5.   */2 }! N# P/ `4 P' V: K& c4 u4 z. U
  6. static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len);
    ; u, X: g: a1 Y+ Y6 H. S
复制代码
. _% O- P; m$ q1 Y1 [$ n
在USB虚拟串口接收函数中添加 CDC_Transmit_FS(Buf,*Len);,将接收到的数据发送出去。
, C% G# }3 m( O; g4 M$ `* \/ z; ~, y1 b9 y; J. O! T  k9 G
875ea12e40464964bbc66cafe0485039.png
# l8 p+ o+ D9 C
3 v! @: \5 ^; Y' ~+ Y! j3 n3 R使用串口助手调试如下:( N/ M, O+ \* \: T- m3 W

% }4 B; B1 B0 _2 ]3 j& p
f77e04111a7c46a096fbde3cb91a19c9.png ( ?0 B0 k6 c8 v) B
, g1 a$ ]9 C0 c4 j0 q+ X
————————————————
( P9 |$ w% S$ z: k" ~" W版权声明:根号五
/ o/ E7 \, F+ ]. ^; u" z
( \9 N( `' r/ J% J/ D) L# B$ M' h  m# J9 c: r
收藏 评论0 发布时间:2023-2-2 15:47

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版