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

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

[复制链接]
cuyebiren 发布时间:2016-12-6 21:42
阅读主题, 点击返回1楼
1 收藏 24 评论39 发布时间:2016-12-6 21:42
39个回答
翱翔云端的鸟 回答时间:2017-4-25 11:55:42
mark!写得很好!
主所爱的门徒 回答时间:2017-6-2 11:26:42
分析得挺棒的,如果加上应用实例就更好啦
sgsong 回答时间:2017-10-16 11:53:56
/**
  * @brief  Sends an amount of data in non blocking mode.
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @param  pData: Pointer to data buffer
  * @param  Size: Amount of data to be sent
  * @retval HAL status
  */                   串口中断发送,以中断方式发送指定长度的数据。
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{               
  /* Check that a Tx process is not already ongoing */
  if(huart->gState == HAL_UART_STATE_READY)    如果 串口空闲,则执行以下语句。
  {
    if((pData == NULL ) || (Size == 0U))      如果发送数据为空或者发送长度为0,则返回错误。
    {
      return HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);                上锁。

    huart->pTxBuffPtr = pData;               结构体变量 huart 的 参数设置。发送缓冲区,发送长度,发送计数器。
    huart->TxXferSize = Size;
    huart->TxXferCount = Size;

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;           状态设为 发送繁忙。

    /* Process Unlocked */
    __HAL_UNLOCK(huart);               解锁。

   /* Enable the UART Transmit data register empty Interrupt */
    SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);              使能UART发送数据寄存器空中断,则会触发串口中断(发送中断)。

    return HAL_OK;
  }
  else               如果 串口忙,则返回 忙状态。
  {
    return HAL_BUSY;   
  }
}

有个疑问,这个代码发送时,给整个串口上锁了(不是串口发送上锁),如果配置为全双工,这时中断接收数据怎么办?数据来时,串口一直处于忙的状态,数据量大时,数据会不会丢失?这种情况应该就不是全双工了。没找到同时收发数据的官方例程,都是一发一收的。
cuyebiren 回答时间:2017-10-17 09:54:02
sgsong 发表于 2017-10-16 11:53
/**
  * @brief  Sends an amount of data in non blocking mode.
  * @param  huart: pointer to a UART_H ...

发送状态 和 接收状态 变量是不一样的,发送繁忙不影响设置接收;上锁 设置好数据和大小后就 解锁了,上锁的目的就是避免设置 发送或接收 数据和大小的过程中重复设置(只有在中断函数中才可能打断上锁后的设置过程),一般情况是不会冲突的;一般通信过程,发送和接收时间上不会同时进行。
捕获.PNG
molly0511 回答时间:2017-10-25 10:36:45
谢谢分享,很赞
星火002 回答时间:2017-11-9 09:14:03
有个疑问   上位机给单片机串口发送的时机不定,按照HAL这个接受一次关中断的机制  意味着我要不断进行开中断接收指令,那么要在回调函数里加入中断接受指令实现?  还有  我的数据是定长有包头包尾的   这样就用不到一次接受多个数据的设计,只能接受一个进行判断,符合包头后再存入数组,在数据量大的时候会不会因为HAL的判断过多而丢数据呢?   我还没具体测试,先抛砖引玉  有没有做过的来答一下
zhanweiming2010 回答时间:2017-11-10 08:04:12
huart->TxXferSize = Size;
huart->TxXferCount = Size;--这一句不是huart->TxXferCount = Count;?
ahcong428 回答时间:2017-12-27 12:03:03
楼主,初次接触,想请教DMA具体如何使用。
采用HAL_UART_Transmit_DMA()时,是不是不需要再使能传输完成中断等寄存器操作?
一次串口传输完成,按照默认的中断处理过程,该串口的状态有恢复到初始状态吗?要不要在回调函数里进行一些配置?或者说,等到下次使用该函数,会自动设置好发送环境?
采用HAL_UART_Receive_DMA(),把它放在串口回调函数里,是不是就自动启动下一次接收?无需再进行相关寄存器操作。
zwmasdf 回答时间:2017-12-27 12:33:33
any012 发表于 2016-12-7 09:09
感觉HAL库的中断接收不是那么方便。
有时候其他设备发送过来的数据比较快,用HAL库的中断接受的话,会做很 ...

串口再怎么快页没单片机处理快吧,一般115200的速度够快了
wandersky 回答时间:2018-1-16 10:36:16
我使用115200波特率,确实会丢数据。我的CAN中断接收也比较频繁。
但是用9600波特率就不会丢数据。
我准备改成DMA接收。
对这个HAL库,我是又爱又恨

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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