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

HAL库串口空闲中断不定长接收

[复制链接]
李康1202 发布时间:2020-11-20 16:20
HAL库的封装提高了代码的可移植性,但是对常用到串口的不定长接收没有做封装,下面实现一下串口的不定长接收!1、创建工程,使用CUBEIDE创建原始工程,填入文件名选择芯片,启动CUBEMX(以L0为例);8 [* D5 x4 _0 _3 S$ ^+ q
创建工程.png 2、使能RCC和SWD调试接口,配置系统时钟频率  }. ]; M; Z& C  d
2rcc配置.png , z$ R& c- Q4 _8 I( e. A9 C
2RCC使能.png
. L- d8 T/ v% s4 m  j8 }; r 2调试接口使能.png 2 s# n2 w8 c; D" W. G% Q9 f& k
3、配置串口,使能串口中断,串口接收DMA中断4 }& r2 x% _* `
3usart1配置.png . M- e4 d+ g+ C; U. M
3usart1使能.png ; }* _/ ]( g+ r3 l: w9 h" b% b
& h' L; K) t& I" g
4、生成源代码
7 N$ y" F. f& D3 u2 ?; s+ l 代码生成.png
. O, ~0 l% ]8 [: E" S5、修改stm32l0xx_hal_uart.h文件,先声明串口接收缓存区的大小1 G# M& J# t2 ?; q* Y
idle长度定义.png
. S) e3 {, s: b& b在UART_HandleTypeDef结构体中添加接收长度和接收缓存区% d8 G. h2 h: c
长度和缓存区定义.png
! m* v( Q3 t/ }8 K6、修改stm32l0xx_hal_uart.c文件,先修改HAL_UART_Receive_DMA函数,使能空闲中断,* w$ |. \% z/ `9 A: z
HAL_UART_Receive_DMA函数修改前.png 2 C4 s& ^$ x) S. w/ B4 [+ I7 ^. W
HAL_UART_Receive_DMA修改后.png
/ j/ q1 c" I4 R. `! }* V 再修改HAL_UART_IRQHandler函数,0 r0 r8 z7 n7 n9 t& h- g
由于DMA结构体DMA_Channel_TypeDef在F4(NDTR)和L0(CNDTR)中定义不一样,所以F4和L0在修改时有一定差别
; ]9 n% e- C% G( l5 Q* t HAL_UART_IRQHandler修改前.png HAL_UART_IRQHandler修改后.png
- a2 i1 ]1 p3 U' Y F4的DMA寄存器.png
' y: H) M8 E" T; Q2 _9 a# C9 m接着修改HAL_UART_AbortReceive_IT函数
  J0 d6 Z/ m1 B0 h+ @3 z HAL_UART_AbortReceive_IT修改前.png
$ C* H+ f+ a( o' \8 c$ h HAL_UART_AbortReceive_IT修改后.png + r2 `0 Q; `' k0 k1 t( J- E1 u
最后修改HAL_UART_AbortReceiveCpltCallback函数,该函数是HAL库留给用户的回调函数,可以在重新定义,该例程主要将接收到的数据通过该串口发出去,用户可在该函数中处理数据
: y8 d, l/ X# e3 L+ p+ ] HAL_UART_AbortReceiveCpltCallback修改前.png
& n' R/ z& X0 {; q* W* r HAL_UART_AbortReceiveCpltCallback修改后.png
* `8 o7 V8 I8 L7 C( E$ c最后在main函数中调用接收DMA函数HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),4 z' q4 t& I' c2 P% n
编译工程,下载;在串口助手端发送字符串,长度不大于USART_IDLE_MAX_LENGTH,串口助手显示0 q/ S- g9 T' A" F/ |4 i$ U7 {: `# z
main函数添加.png
$ l$ u5 A3 o4 ?# B 串口助手显示.png
$ U7 T2 e. I4 I, r; ]" v1 K: y1 ~" m到此工程已实现串口不定长接收功能,但是如果要更改CUBEMX的配置,修改后的文件会被HAL库的标准文件覆盖,如果想将修改后的文件应用到以后的工程中,可以将修改后的文件替换掉原始的HAL库文件,方法如下,在CUBEMX首页,点击Help,选择updater Settings选项,会出现以下界面,图中红框标记的就是HAL库存放位置,进入该文件夹* ]* {; f0 G2 Y) ?1 B9 k
cubemx源码地址.png : O0 t# F, M  r: v1 G3 n, G" j1 w
按照以下路径进入STM32L0xx_HAL_Driver文件夹,将stm32l0xx_hal_uart.h文件放入Inc文件夹中,覆盖原先的stm32l0xx_hal_uart.h文件;将stm32l0xx_hal_uart.c文件放入Src文件夹并覆盖,; G: j2 N- u3 V, Q0 m
最终目录.png
+ }; [# b# t' E) o. p验证 现在创建新的L0工程,按照以前CUBEMX配置,生成工程,在main函数中添加函数
/ G1 W: c  _1 }5 A$ v, \HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),编译,下载7 @- z) j/ I& S* L/ h4 [
串口助手信息.png
& k* D/ E" F" @; d
* J4 \7 V" p; W' j8 D  Y/ N
3 ?% [- h9 [0 K4 Z8 o. K5 q4 x% Q0 L& ]5 j) E! \
HAL_UART_Receive_DMA函数修改前.png
赞 收藏 评论1 发布时间:2020-11-20 16:20

举报

1个回答
呵呵1991 回答时间:2020-11-21 15:13:41
很棒,
: d2 K1 p$ n& C大部分人都不是回调,直接按照标准库的处理方式 处理了。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版