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

HAL库UART的几个常用函数讲解+中断处理过程讲解  

[复制链接]
cuyebiren 发布时间:2016-12-6 21:42
阅读主题, 点击返回1楼
1 收藏 25 评论39 发布时间:2016-12-6 21:42
39个回答
zhao.zhao 回答时间:2017-3-15 08:38:27
这对初学HAL的人帮助很大,可以理解HAL库的一般的处理过程,赞一个
cuyebiren 回答时间:2017-3-17 09:31:17
*numb 发表于 2017-3-14 14:48+ c) v3 H7 q. }) {/ [
DMA的中断回调函数在哪,找也找不到
/ N/ h8 q$ {9 j0 B/ _" ]5 z  _
可以参考官方例程。。。如串口DMA的回调函数和串口中断的回调函数是同一个
moyanming2013 回答时间:2017-3-17 18:04:22
关于串口,如果想一直开着串口中断(通过接受串口数据来唤醒程序),该中断序列的API就显得有些问题了吧:8 ~* C& B& _, F! a% B7 B
中断收、发API会自己打开和关闭中断,如果程序前期把串口中断一直打开了,这势必造成问题吧?
三十不惑 回答时间:2017-4-25 08:59:45
学习了,谢谢楼主!
zhao.zhao 回答时间:2017-4-25 10:42:16
我用HAL库接收几个串口数据没出过问题,系统时钟才16MHz,原文写得很好的,有空慢慢读读
翱翔云端的鸟 回答时间:2017-4-25 11:55:42
mark!写得很好!
主所爱的门徒 回答时间:2017-6-2 11:26:42
分析得挺棒的,如果加上应用实例就更好啦
sgsong 回答时间:2017-10-16 11:53:56
/**
8 Q3 Z$ e) E) B- d  * @brief  Sends an amount of data in non blocking mode.# p& N* b: j( \5 ]
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains. G3 |6 s( ]& O7 D  r+ P* S, C
  *                the configuration information for the specified UART module.
4 j1 I5 c6 r$ ~, u) n1 i" ?8 M) c  * @param  pData: Pointer to data buffer
4 E  e% D7 ?2 `. w( W* c! H7 _  * @param  Size: Amount of data to be sent
- b) E! C& M; M' a7 D8 P1 r( m  * @retval HAL status
/ i% a& Q' i2 d9 o  S3 p  */                   串口中断发送,以中断方式发送指定长度的数据。
& O, f- S  ~$ `HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
! U: G2 K  U$ B3 }( Z% n{               
7 t0 w! y7 g+ L8 N! i& h% j  /* Check that a Tx process is not already ongoing */
2 ]4 [& k* U+ R' Z& U5 j  if(huart->gState == HAL_UART_STATE_READY)    如果 串口空闲,则执行以下语句。4 X0 s! F3 b. y; C+ J4 C$ o
  {& q! x7 L# i: L
    if((pData == NULL ) || (Size == 0U))      如果发送数据为空或者发送长度为0,则返回错误。
9 D9 `" B! B; ^- k$ E8 p! s$ _% ?+ Z    {' V* U7 I" B2 J! R: f! W! d! J; F
      return HAL_ERROR;
% N1 c5 U, |5 M& m) U    }
' t$ g: o3 B1 g
% S2 k" p& N; N! H# a  D: D    /* Process Locked */
9 L: J& D/ F* H4 s8 a9 w$ K# y; H% M    __HAL_LOCK(huart);                上锁。
0 y# \) x4 _( m5 G2 {8 |
( I3 R' M. E5 ^# J9 r( J* ^    huart->pTxBuffPtr = pData;               结构体变量 huart 的 参数设置。发送缓冲区,发送长度,发送计数器。
2 g) `; T1 i% ~6 L* ]    huart->TxXferSize = Size;
4 N( Y& I% l# j! s4 H3 h    huart->TxXferCount = Size;
/ N, E/ q! Y1 r2 Q, O1 W$ [1 t) ?0 c6 x9 l! z& s; g
    huart->ErrorCode = HAL_UART_ERROR_NONE;5 E0 p. [/ U1 Q0 q" o
    huart->gState = HAL_UART_STATE_BUSY_TX;           状态设为 发送繁忙。
& S6 H2 |0 e; C/ |, a. t# A/ Q! z" c8 j- D$ f4 {
    /* Process Unlocked */
+ {& i3 V6 i; Y    __HAL_UNLOCK(huart);               解锁。
, y/ S, K2 {* F0 j% ~/ F6 k+ |2 l
8 j' P6 h- [# K$ _9 {5 f+ b   /* Enable the UART Transmit data register empty Interrupt */# k+ x- n3 \8 E9 ?; q% |" y: |
    SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);              使能UART发送数据寄存器空中断,则会触发串口中断(发送中断)。$ Z- _" k* _) F1 z9 i0 {% C
1 Y0 q* v  ?! D. n8 x8 t6 |8 l
    return HAL_OK;
- Z8 a- T  U1 f/ B3 D6 D3 L  }+ E8 {0 P1 \: I& }( c
  else               如果 串口忙,则返回 忙状态。
+ T! b! a' G+ h6 o  {2 s2 Y+ p; P# \1 D. K
    return HAL_BUSY;   0 F' J. q( o0 N* H
  }% @& w6 k5 f6 z( L/ W
}% j) j1 f* Y3 H( t4 B
: @; }% r' c8 \" U8 a  q
有个疑问,这个代码发送时,给整个串口上锁了(不是串口发送上锁),如果配置为全双工,这时中断接收数据怎么办?数据来时,串口一直处于忙的状态,数据量大时,数据会不会丢失?这种情况应该就不是全双工了。没找到同时收发数据的官方例程,都是一发一收的。
cuyebiren 回答时间:2017-10-17 09:54:02
sgsong 发表于 2017-10-16 11:537 A! e& h3 K) E: {
/**3 j" l" \7 p7 H( Q: h! k6 `
  * @brief  Sends an amount of data in non blocking mode.
6 D. ?0 @% k  d! r  * @param  huart: pointer to a UART_H ...
: Q+ o' D9 R9 p/ e2 H' x/ U4 B  P
发送状态 和 接收状态 变量是不一样的,发送繁忙不影响设置接收;上锁 设置好数据和大小后就 解锁了,上锁的目的就是避免设置 发送或接收 数据和大小的过程中重复设置(只有在中断函数中才可能打断上锁后的设置过程),一般情况是不会冲突的;一般通信过程,发送和接收时间上不会同时进行。
# }) M/ W  V+ }( J0 c
捕获.PNG
molly0511 回答时间:2017-10-25 10:36:45
谢谢分享,很赞
星火002 回答时间:2017-11-9 09:14:03
有个疑问   上位机给单片机串口发送的时机不定,按照HAL这个接受一次关中断的机制  意味着我要不断进行开中断接收指令,那么要在回调函数里加入中断接受指令实现?  还有  我的数据是定长有包头包尾的   这样就用不到一次接受多个数据的设计,只能接受一个进行判断,符合包头后再存入数组,在数据量大的时候会不会因为HAL的判断过多而丢数据呢?   我还没具体测试,先抛砖引玉  有没有做过的来答一下
MISweiming 回答时间:2017-11-10 08:04:12
huart->TxXferSize = Size;
0 c; u" ?" q3 k6 S* |0 rhuart->TxXferCount = Size;--这一句不是huart->TxXferCount = Count;?
ahcong428 回答时间:2017-12-27 12:03:03
楼主,初次接触,想请教DMA具体如何使用。. l0 x6 u9 b- {4 |5 t. j
采用HAL_UART_Transmit_DMA()时,是不是不需要再使能传输完成中断等寄存器操作?
! @7 P* H; h" T8 q  M/ ]6 ~) i一次串口传输完成,按照默认的中断处理过程,该串口的状态有恢复到初始状态吗?要不要在回调函数里进行一些配置?或者说,等到下次使用该函数,会自动设置好发送环境?
0 l- R3 B# D8 M, I5 @' C采用HAL_UART_Receive_DMA(),把它放在串口回调函数里,是不是就自动启动下一次接收?无需再进行相关寄存器操作。
zwmasdf 回答时间:2017-12-27 12:33:33
any012 发表于 2016-12-7 09:09; _7 o6 N3 W1 a; X- D: j% J/ ]
感觉HAL库的中断接收不是那么方便。. t# x; b0 W$ q
有时候其他设备发送过来的数据比较快,用HAL库的中断接受的话,会做很 ...
# B6 c* G! M% t
串口再怎么快页没单片机处理快吧,一般115200的速度够快了
wandersky 回答时间:2018-1-16 10:36:16
我使用115200波特率,确实会丢数据。我的CAN中断接收也比较频繁。
- W0 k) N! M" o2 C6 S5 F# l6 N但是用9600波特率就不会丢数据。8 x' n0 L' \0 s* Y1 s
我准备改成DMA接收。
* o3 l3 P0 z) s4 A& a0 R对这个HAL库,我是又爱又恨

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版