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

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

[复制链接]
李康1202 发布时间:2020-11-20 16:20
HAL库的封装提高了代码的可移植性,但是对常用到串口的不定长接收没有做封装,下面实现一下串口的不定长接收!1、创建工程,使用CUBEIDE创建原始工程,填入文件名选择芯片,启动CUBEMX(以L0为例);& I9 g9 D* [- ^" F; p' x
创建工程.png 2、使能RCC和SWD调试接口,配置系统时钟频率* @, A9 q1 K* J* Y" R
2rcc配置.png 6 Y8 f7 ]) H3 c9 B$ h8 L; S0 D7 q
2RCC使能.png 3 r8 t6 K" \5 ]* B' S
2调试接口使能.png ( T' v8 G" M9 D1 M5 U& b4 t. r
3、配置串口,使能串口中断,串口接收DMA中断' i2 e( H( a# V8 m
3usart1配置.png
; ?- f0 [* _0 J# A' G 3usart1使能.png & f! P9 `4 C9 G+ \0 \
' c+ K* o' ^  d3 J8 _
4、生成源代码
" t( u. f4 u/ y 代码生成.png
3 N  N; H' b- T- a( X9 k5、修改stm32l0xx_hal_uart.h文件,先声明串口接收缓存区的大小
# P  \1 N. c% I+ n5 U idle长度定义.png
! x* v3 n* O1 c( Z: H! ^( V( q9 R在UART_HandleTypeDef结构体中添加接收长度和接收缓存区% ^( j6 E4 G5 r- j# j
长度和缓存区定义.png
8 j7 @' g" {1 {6、修改stm32l0xx_hal_uart.c文件,先修改HAL_UART_Receive_DMA函数,使能空闲中断,: G  i2 z. g6 G  `+ G. W
HAL_UART_Receive_DMA函数修改前.png
  N* L( ]( ]- M! C" N- P3 h- ?: W& ^  { HAL_UART_Receive_DMA修改后.png 6 c' H, K8 A5 Y- ^/ Y
再修改HAL_UART_IRQHandler函数,
* t- n4 d6 T3 Q& W; z由于DMA结构体DMA_Channel_TypeDef在F4(NDTR)和L0(CNDTR)中定义不一样,所以F4和L0在修改时有一定差别& [( F* u, _  g% B2 e- K, e1 f
HAL_UART_IRQHandler修改前.png HAL_UART_IRQHandler修改后.png 5 n8 W4 P9 k0 ]9 `
F4的DMA寄存器.png
# D$ e$ X( f" I接着修改HAL_UART_AbortReceive_IT函数
# [5 c+ a5 a: N! O: W5 d; C$ G HAL_UART_AbortReceive_IT修改前.png
1 @" O/ y- T; W  D; |' P HAL_UART_AbortReceive_IT修改后.png
7 g$ t) T3 P- ]8 P6 b最后修改HAL_UART_AbortReceiveCpltCallback函数,该函数是HAL库留给用户的回调函数,可以在重新定义,该例程主要将接收到的数据通过该串口发出去,用户可在该函数中处理数据
% B- [, R6 h! ?. q, f  D HAL_UART_AbortReceiveCpltCallback修改前.png
7 w/ i3 {  S* O" e( o5 A HAL_UART_AbortReceiveCpltCallback修改后.png
% r. l, x  t3 V  x6 v  D. T最后在main函数中调用接收DMA函数HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),# [: r0 ]! v) u! T8 x
编译工程,下载;在串口助手端发送字符串,长度不大于USART_IDLE_MAX_LENGTH,串口助手显示9 e& B2 J  ?/ ]5 `* s8 `
main函数添加.png 5 H1 \. j4 L& k8 d
串口助手显示.png
4 J- w" }3 P$ r) T到此工程已实现串口不定长接收功能,但是如果要更改CUBEMX的配置,修改后的文件会被HAL库的标准文件覆盖,如果想将修改后的文件应用到以后的工程中,可以将修改后的文件替换掉原始的HAL库文件,方法如下,在CUBEMX首页,点击Help,选择updater Settings选项,会出现以下界面,图中红框标记的就是HAL库存放位置,进入该文件夹
2 R) w! W9 z2 F; G# z) k cubemx源码地址.png
" V) e  r: o7 E4 z按照以下路径进入STM32L0xx_HAL_Driver文件夹,将stm32l0xx_hal_uart.h文件放入Inc文件夹中,覆盖原先的stm32l0xx_hal_uart.h文件;将stm32l0xx_hal_uart.c文件放入Src文件夹并覆盖,3 m8 O6 I3 x% y9 X& Q8 J& |
最终目录.png ) @/ w2 a  a: d) E1 y) E
验证 现在创建新的L0工程,按照以前CUBEMX配置,生成工程,在main函数中添加函数5 C/ e, K" W" v( b) @0 }
HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),编译,下载7 W/ i9 A( B  e- P- m# t6 J
串口助手信息.png
" M1 v! X' e. d9 H
' i3 p" ]! X( V# a% e" r+ i: |$ {6 K
9 i. ?8 P: }- h
HAL_UART_Receive_DMA函数修改前.png
收藏 评论1 发布时间:2020-11-20 16:20

举报

1个回答
呵呵1991 回答时间:2020-11-21 15:13:41
很棒,, M, M! Q; n  q) n
大部分人都不是回调,直接按照标准库的处理方式 处理了。

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版