|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 岁月如歌21 于 2025-11-14 16:44 编辑 $ r3 D' O0 S" ^5 Y9 \
1 W" ~2 x4 H6 z* z# {- K: Y1 Z* U/ d
4组串口UART使用DMA收发, 精品实战代码, 易用,高效,稳定 !" |* Y# Q: Y& t+ L
源自实际系统 @STC32G12K128 系列
( }- r$ c6 @7 b' w4 [0 p8 t非常容易使用, 将C文件添加至项目, 初始化后, 即可用.
) f1 Q( d7 e( _- J仅3个函数, 包含一切UART串口操作, 适用90%以上场景 !, e' C9 k; u- K0 e4 z
===从此告别串口驱动代码开发.
/ v1 e6 {1 B& ]6 h- ~void UART1_Init(u32 btl); //初始化串口 2 K8 D+ D1 A& t4 M1 z
u8 UART1_Send(void *pt, u16 Size); //发送数据
- }4 w$ Q" r( W8 H( x4 @u16 UART1_Receive(u8 *buf, u16 Size); //接收数据: @: T6 z; Z" [8 ?( ^0 b% _
main() 函数演示 4个串口同时使用 DMA 收发数据, 收到数据后原路返回, 不限数据长度, 持续收发.
8 J. f8 H7 ?. o/ Y) Y: |# o$ F8 \4 b# X6 Y( h( a6 F
主要收发函数使用说明:! @. z: C4 W& y; _/ _2 {' N8 C
/**- b% m2 V8 |! p
* 原型: u8 UART1_Send( void *pt, u16 Size);- @& _5 {3 K0 _# t' C& z1 n
* @功能 串口发送数据. 写数据至发送缓冲区(循环池), 写完立即返回, 由DMA管理数据流向串口,$ ?9 v9 b6 A# a) K& t" ?4 ^
用户无须关心. 只要缓冲区有足够的空间, 可持续写入数据! l V7 q7 M$ l
* @参数 pt: 发送数据指针9 g' i! ^3 S! H" u7 ?2 K
* @参数 Size: 发送数量(字节)
) d# f- D/ {% } * @返回值 当缓冲区没有足够的空间装入数据时返回1, 其它时候返回0' e1 I& U6 J& K
*/ $ q# @; \# C: j* s
- f" _$ m# c; X& {* t
/**, m8 _7 q$ {2 X0 [; Y# c
* 原型: u16 UART1_Receive(u8 *buf, u16 Size);
, M/ s6 u" Z( F$ U7 ~; u * @功能 读串口数据, 从缓冲区内读取数据. (DMA接收数据后存放至接收缓冲区,, m9 ?$ s9 N1 R% @0 k" ^5 X& i
应用代码必须定时查询读取, 否则循环池发生数据覆盖, 会丢失一部分数据, 没有提示, 但不影响后续收发)( ?' g! N/ O- h5 `8 N5 l8 k
* @参数 buf: 接收数据指针
* c+ i# L' e& O* B0 D# \+ T * @参数 Size: Size期盼接收的字节数( ^1 [; X# O% P7 c4 l# v' k
* @返回值 实际接收字节数. 缓冲区空时(没有数据可读)返回0, 返回值<Size说明本次读取完成后,缓冲区已空.
- D- G% \: ~: ~5 Z j. |' Y 返回值==Size说明本次读取完成后,缓冲区仍有数据可读. 任何时候,返回值不会大于Size% V& q* e: J, X. n
*/ |
|