STM32实现USB转串口功能(含源码) ( P! V6 N" |$ M; t0 m+ n0 e" t" j6 h
之前的文章中介绍过STM32的USB接口虚拟串口的功能。《STM32CubeMX之USB从机》。本篇文章在此基础上,以STM32F407为例,介绍USB转串口功能的实现。 ; M' |' @+ P9 c6 B. F, o5 a4 H
要实现USB转串口的功能,需要将单片机真实串口(这里以USART1为例)的收发数据与USB口进行交互。 " g6 h3 w- e; @& E6 P' k: `% h g
用过USB虚拟串口的朋友可能知道,要实现该功能,还存在以下问题: 1.电脑上设置的串口波特率不影响USB接口传输的速率。 2.怎样获取电脑上串口助手设置的波特率,以设置USART1使其波特率与串口 助手一致。
/ h5 M' w J4 F) G
波特率设置 其实STM32CubeMX生成的程序中已经提供了相关的接口,只需要用户自己实现即可。打开usbd_cdc_if.c文件,CDC_Control_FS函数中,添加如下程序。 i J4 q( E8 A1 O: S' @1 J
其中上面的注释是系统生成的,根据注释添加相应的红框中的程序。LineCoding是一个结构体: - USBD_CDC_LineCodingTypeDef LineCoding =& T' T& ]* T: k4 F& }; q) V0 I
- {6 P# [, t2 g& k0 I
- 115200, /* 波特率*/. v2 w- g8 U8 @7 ?! |/ y' s0 K0 n
- 0x00, /* 停止位-1*/8 y6 k. j5 Z* D: w: F
- 0x00, /* 校验 - none*/
' c7 ]/ x" l+ a3 F - 0x08 /* 数据位 8*/
8 b8 V% a# U: w! ` - };
复制代码
' `" l3 V* y$ u% PUSBD_CDC_LineCodingTypeDef的格式也是系统定义好的。 " R) o1 l/ i8 d
添加完成后,在电脑的串口助手上更改波特率时,系统会调用这段程序,重新配置USART1的波特率,使两者保持一致。 ( s; D" ^9 z$ s2 m& _
剩下的功能就是数据转发,即将USB接收的数据通过USART1发送出去,将USART1接收的数据发送到USB接口。 0 c) R- d: [. a4 x4 X$ Q3 I6 [5 |; I
USB数据转发到USART1 同样是在usbd_cdc_if.c文件中,修改USB接收函数CDC_Receive_FS。将原来的程序屏蔽,添加串口发送的程序。
, [* o9 c% H/ v2 R3 T* |. T* b添加串口发送完成中断回调函数(前提是使能串口发送中断): - void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
. e. L4 Z7 ^( Q1 p$ I - {
x9 t6 G2 `0 H; x" Y, f - USBD_CDC_ReceivePacket(&hUsbDeviceFS);* Q$ h6 v r- Y1 U
- }
复制代码 c% R1 O4 M9 ]: Q' a% S6 c. ]
USART1数据转发到USB 本例程是通过中断方式接收USART1数据,并通过接收超时时间来判断一帧数据接收完成。当然也可以通过其它方式实现转发,例程只是简单实现功能。 . R: w9 g o* K9 W1 y6 w$ X' I1 I$ e- O/ W
添加串口中断回调函数: - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)) S. R3 |1 M+ R
- {
6 ~ [' ~( N1 J: b( v - UserTxBufPtrIn++;
" [0 W, E3 f/ P$ K1 P, R4 Z - if(UserTxBufPtrIn == APP_RX_DATA_SIZE)//防止溢出& U2 |& @2 D! o( g% o
- {5 E) h, y9 M1 p0 P# v# E4 J' a
- UserTxBufPtrIn = 0;& [: c% z `1 {' p
- }, R$ _, A2 r6 h+ Z) }' [
- UR_Tick = 0;//接收计时器清零
( x3 z ~6 p# S+ K - UR_Flag = 1;//正在接收
. ~7 C# H. k" p - HAL_UART_Receive_IT(huart, (uint8_t *)(UserTxBufferFS + UserTxBufPtrIn), 1);+ n5 K# x. u3 _0 }
- }
复制代码 * D* i/ g, w- l
判断一帧数据接收完成后,通过USB接口转发出去。 - if(UR_Flag == 2)
$ k+ z( S) J/ \4 J* G - {
& c; q b8 w" ^8 M - UR_Flag = 0;
2 E! }% G+ m: s - CDC_Transmit_FS(UserTxBufferFS, UserTxBufPtrIn);
3 h" P! W9 R6 P+ v9 N/ p: Z6 a - UserTxBufPtrIn = 0;
# v8 X0 ]; n- X; U( ?( h - }
复制代码 通过以上设置,即可实现类似CH340等USB转串口芯片的功能。但STM32的USB接口功能更强大,可以实现USB复合设备,比如同时虚拟多个串口。以后有时间再做研究和大家分享。 2 [- i3 x" \/ _+ U: ?7 s
提取码:swyl 文章出处:嵌入式技术开发 / p: M/ T, Q$ r' ^) n9 z) f8 ~
|