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

STM32实现USB转串口功能(含源码)

[复制链接]
STMCU小助手 发布时间:2021-2-1 10:36
STM32实现USB转串口功能(含源码)

- }# ~' t' k" N  O
之前的文章中介绍过STM32的USB接口虚拟串口的功能。《STM32CubeMX之USB从机》。本篇文章在此基础上,以STM32F407为例,介绍USB转串口功能的实现。
  t3 M  Z1 W3 v4 e
要实现USB转串口的功能,需要将单片机真实串口(这里以USART1为例)的收发数据与USB口进行交互。

" [" j+ N, |7 V
用过USB虚拟串口的朋友可能知道,要实现该功能,还存在以下问题:
1.电脑上设置的串口波特率不影响USB接口传输的速率。
2.怎样获取电脑上串口助手设置的波特率,以设置USART1使其波特率与串口
助手一致。
, @2 \9 `7 T( ]* t
波特率设置
其实STM32CubeMX生成的程序中已经提供了相关的接口,只需要用户自己实现即可。打开usbd_cdc_if.c文件,CDC_Control_FS函数中,添加如下程序。
2.1.png
: W6 H6 K0 X4 i. V2 n: W4 H" Z0 C% @
其中上面的注释是系统生成的,根据注释添加相应的红框中的程序。LineCoding是一个结构体:
  1. USBD_CDC_LineCodingTypeDef LineCoding =
    0 q9 n* X) K( d, o# n
  2. {) s/ {3 s7 l6 g- D3 X
  3.     115200, /* 波特率*// F0 M9 ?% v3 _% Z
  4.     0x00,   /* 停止位-1*/
    & H; s' `: U  v* W* z5 Y+ X1 L
  5.     0x00,   /* 校验 - none*/
    $ Q: w# {9 u; A7 B7 O
  6.     0x08    /* 数据位 8*/0 J- y1 ~0 m6 j+ a
  7. };
复制代码
7 u2 {0 v0 \+ i1 m
USBD_CDC_LineCodingTypeDef的格式也是系统定义好的。
1 ^0 P' C/ F7 A
添加完成后,在电脑的串口助手上更改波特率时,系统会调用这段程序,重新配置USART1的波特率,使两者保持一致。

8 {* I% z  y0 J
剩下的功能就是数据转发,即将USB接收的数据通过USART1发送出去,将USART1接收的数据发送到USB接口。
$ R2 Z' F" w" `+ }' a; ]
USB数据转发到USART1
同样是在usbd_cdc_if.c文件中,修改USB接收函数CDC_Receive_FS。将原来的程序屏蔽,添加串口发送的程序。
2.2.png

) |( q# d: s+ X1 u# q
添加串口发送完成中断回调函数(前提是使能串口发送中断):
  1. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  k' E& z. t) J0 _2 ~5 R2 F
  2. {
    5 R9 e& n9 A1 W% a
  3.   USBD_CDC_ReceivePacket(&hUsbDeviceFS);
      U; b* ^0 W. {. Q
  4. }
复制代码
8 m0 A0 \1 e8 q* J6 F0 P
USART1数据转发到USB
本例程是通过中断方式接收USART1数据,并通过接收超时时间来判断一帧数据接收完成。当然也可以通过其它方式实现转发,例程只是简单实现功能。
7 s8 I, f7 k4 y) N4 q9 l. K
添加串口中断回调函数:
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): Y- Z1 c7 J3 O: H0 q0 y
  2. {& l. m3 J5 o6 t4 R. e) f
  3.   UserTxBufPtrIn++;
    ) R1 z) h. |5 v
  4.   if(UserTxBufPtrIn == APP_RX_DATA_SIZE)//防止溢出# p9 F2 P" Z7 J
  5.   {
    4 G4 H2 ^' g6 P- u6 g' Z& g
  6.     UserTxBufPtrIn = 0;
    # K' @* A0 f- F& f8 w. P+ T& Y+ l
  7.   }
    . ?0 |9 Z: {6 N9 d8 j6 X
  8.   UR_Tick = 0;//接收计时器清零
    7 k& i) x. \6 C
  9.   UR_Flag = 1;//正在接收+ V9 f2 n4 x2 `- S& U+ R4 j$ [: f
  10.   HAL_UART_Receive_IT(huart, (uint8_t *)(UserTxBufferFS + UserTxBufPtrIn), 1);3 {9 J. j: l- d! K
  11. }
复制代码
; Q  X9 @( Y: P( B
判断一帧数据接收完成后,通过USB接口转发出去。
  1. if(UR_Flag == 2)
    : l' u$ b/ m; p; E2 F# L9 g- h5 w
  2. {
    # i! h1 k2 n: _0 l7 F
  3.   UR_Flag = 0;
    5 A; @5 g8 Z. ]# |/ b
  4.   CDC_Transmit_FS(UserTxBufferFS, UserTxBufPtrIn);
    & S+ G3 b6 u& r  `# ]  ]8 n% p
  5.   UserTxBufPtrIn = 0;  k* }3 ?9 O! G& z3 u3 s
  6. }
复制代码
通过以上设置,即可实现类似CH340等USB转串口芯片的功能。但STM32的USB接口功能更强大,可以实现USB复合设备,比如同时虚拟多个串口。以后有时间再做研究和大家分享。

! y3 X, G9 {; Q! p, J8 ]
提取码:swyl
文章出处:嵌入式技术开发

/ I1 H) F6 U% N% \
赞 收藏 2 评论0 发布时间:2021-2-1 10:36

举报

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