精华内容
下载资源
问答
  • 最近在看安富莱的bsp教程,关于usart的部分使用了fifo的管理,但是安富莱的教程中,FIFO管理部分都是自己写的,而stm32官方的hal库里面,关于usart发送部分是有HAL_UART_Transmit_IT可以以中断的方式发送数据的。...

    1、原因

    最近在看安富莱的bsp教程,关于usart的部分使用了fifo的管理,但是安富莱的教程中,FIFO管理部分都是自己写的,而stm32官方的hal库里面,关于usart发送部分是有HAL_UART_Transmit_IT可以以中断的方式发送数据的。我现在的疑惑就是,我只使用安富莱的fifo管理部分,将发送部分交给hal库的函数进行处理,可不可是实现和安富莱bsp教程相同的功能。

    2、函数解析

    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))
        {
          return HAL_ERROR;
        }
    
        /* Process Locked */
        __HAL_LOCK(huart);
    
        huart->pTxBuffPtr = pData;
        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 */
        __HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
    
        return HAL_OK;
      }
      else
      {
        return HAL_BUSY;
      }
    }
    

    该段代码是stm32f4的HAL_UART_Transmit_IT函数代码。再该段代码中,
    1、先判断了发送是否处于忙。
    2、进行上锁。
    3、设置队列,并设置相关参数
    4、解锁
    5、开始发送
    通过上面一段代码,可以知道该函数是非阻塞的发送方式,其方式是在串口中断中进行管理实现的队列数据发送。详细说明如下:

    void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
    {
      /* UART in mode Transmitter ------------------------------------------------*/
      if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
      {
        UART_Transmit_IT(huart);
        return;
      }
    
      /* UART in mode Transmitter end --------------------------------------------*/
      if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
      {
        UART_EndTransmit_IT(huart);
        return;
      }
    }
    

    在函数里面由这两段代码进行判断,其中标志位说明如下:
    在这里插入图片描述
    由标志位我们可以知道,当一组数据未传输完成时,TXE数据会置1,如果开启了中断,那么tc也会置1,但是根据if语句的先后顺序,会先执行UART_Transmit_IT(huart);函数,在该函数路面,会再次对dr寄存器进行数据写入。写入完成后,会对tc位置0。当所有的数据都发送完成之后,UART_Transmit_IT(huart);不会再次写入dr寄存器,程序进入UART_EndTransmit_IT(huart);函数,触发HAL_UART_TxCpltCallback(huart);中断。

    修改思路

    接下来的问题就简单了,我们只需要在安富莱的发送开始函数改成HAL_UART_Transmit_IT()即可,然后在发送中断里面写fifo的发送即可。

    展开全文
  • HAL_UART_Transmit_IT: 无法连续使用。例如HAL_UART_Transmit_IT(...);HAL_UART_Transmit_IT(...);,一般都是只有第二条发出去了,至于为什么也不想细查。 总之HAL_UART_Transmit_IT在连续使用时要在后面加上...

    在使用这两种函数之前先看看中断有没有打开。

    HAL_UART_Transmit_IT:

    无法连续使用。例如HAL_UART_Transmit_IT(...); HAL_UART_Transmit_IT(...);,一般都是只有第二条发出去了,至于为什么也不想细查。

    总之HAL_UART_Transmit_IT在连续使用时要在后面加上while(huart1.gState != HAL_UART_STATE_READY);,或者使用while(HAL_UART_Transmit_IT(&huart1, &cChar, 1) != HAL_OK);,这两种方法不是一定起效的,不行就换着用。这两种都有人用,我推荐优先使用第一种,第二种不是每次都奏效,我嫌第一种字多才用第二种。

     

    HAL_UART_Receive_IT:

    直接自定义一个HAL_UART_RxCpltCallback函数,这个函数原本是弱函数,自定义后会将原来的覆盖掉。这个函数是作为函数指针被串口中断里的一个HAL开头的函数调用

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

    {

        if (huart->Instance == USART1)

        {

            HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);

        }

    }

    这个函数需要在初始化后就执行一遍,否则中断不会开启,也就无法进入接收中断

     

    不要把同一个外设的阻塞式和中断式的HAL函数同时使用,否则真的会阻塞。除非这两个函数不会同时使用,但在有操作系统的情况下则必须遵守。

    这应该是这两个函数比较正式的用法了。

    展开全文
  • 而且最近遇到问题,在用HAL_UART_Transmit持续发数据时,会出现接收数据丢帧的情况,导致逻辑不能完成。故现在将中断接收改为DMA接收,解决了这问题。 1.下图为中断服务函数 2.下图为回调函数内容 3.串口...

    我原有的例程中,一直用HAL_UART_Receive_IT开启接收,且在中断接收单字节数据,这样做的优点是我可以自定义接收不同长度的数据帧,并且便于解析。缺点就是每个字节进入一次中断很低效。而且最近遇到个问题,在用HAL_UART_Transmit持续发数据时,会出现接收数据丢帧的情况,导致逻辑不能完成。故现在将中断接收改为DMA接收,解决了这个问题。

    1.下图为中断服务函数

    2.下图为回调函数内容

     3.串口的资源配置

     4.DMA初始化  一定要在串口初始化前面,否则就会发现每次只能接收到1个字节

     

    展开全文
  • 1. HAL_UART_Transmit 阻塞模式。初始化后可直接使用,无需中断。在实时性要求较高的RTOS中不宜使用。 2.HAL_UART_Transmit_IT 非阻塞模式,通过中断方式发送。必要准备工作: 1)使能USARTx_IRQn中断 2)启用...

    1. HAL_UART_Transmit 阻塞模式。初始化后可直接使用,无需中断。在实时性要求较高的RTOS中不宜使用。

    2. HAL_UART_Transmit_IT 非阻塞模式,通过中断方式发送。必要准备工作:

    1)使能USARTx_IRQn中断

    2)启用中断服务函数USARTx_IRQHandler,在里面清除标志位。

    每发送一个字符会进一次USARTx_IRQHandler。

    3. HAL_UART_Transmit_DMA 非阻塞模式,先发送到DMA,再通过中断方式发送。必要准备工作:

    1)使能USARTx_IRQn,DMAx_Streamy_IRQn中断。CubeMX里面可以选择不使能串口中断,实际测试是必须要使能的,否则第二次使用该函数会一直返回HAL_UART_STATE_BUSY_TX。

    2)启用中断服务函数USARTx_IRQHandler、DMAx_Streamy_IRQHandler,在里面清除标志位。

    整个过程只产生两次中断,第一次是进入DMAx_Streamy_IRQHandler;第二次进入USARTx_IRQHandler。

     

    暂未清楚问题:在FreeRTOS下,在Task下使用非阻塞模式发送会引起HardFaultHandle。

    展开全文
  • HAL_UART_Transmit_IT连续发送问题

    千次阅读 2021-03-04 19:58:11
    第一次做stm32项目,记录一次HAL_UART_Transmit_IT函数使用方法,在网上查询发现,这不能连续用,如果需要连续用需要判断串口状态为READY,经过实验发现,并非如此 在测试中发现,HAL_UART_Transmit_IT连续调用时大多数...
  • 近期在调试串口时想使用Hal_UART_Receive()这个函数来替代以前的Hal_UART_Receive_IT()串口接收中断函数,因为对串口还不够了解,导致忘记注释原有的代码。 导致Hal_UART_Receive()加入程序后形同虚设 实际...
  • 文章目录前言综述用法 前言 本篇文章主要介绍STM32F429的HAL库中USART的用法。...通过重定义函数HAL_USART_MspInit()初始化USART底层资源。 使能 USARTx接口时钟。 USART管脚配置 使能对应GPIO的时钟。 配置USA
  • 在USART的发送端有2寄存器,一是程序可以看到的USART_DR寄存器,另一是程序看不到的移位寄存器,对应USART数据发送有两标志,一是TXE=发送数据寄存器空(单字节),另一是TC=发送结束(多字节)。 当USART_DR...
  • stm32f4xx_hal_uart.c

    千次阅读 2020-06-14 11:22:55
    Uart的DMA类型的函数全部是中断回调函数,只是函数名后面没写call back >>HalfDuplex:半双工 >>Duplex:双工 >>MultiProcessor:多处理 >>mult:多 >>非阻塞模式:每次Uart发送/接收完后都...
  • STM32 HAL库函数学习 UART

    千次阅读 2021-02-18 22:16:18
    从今天开始定时更新一下有关STM32 HAL库学习的过程,主要是对HAL库函数的所有讲解。 HAL_USART_Init(USART_HandleTypeDef * husart) 初始化串口的的函数: 用法为 UART_HandleTypeDef huart1; huart1.xxx = ...
  • hal库中的UART使用

    千次阅读 2020-06-30 09:15:00
    UART_initStruct.Instance =USART1; UART_initStruct.Init.BaudRate = 9600; UART_initStruct.Init.WordLength = UART_WORDLENGTH_8B; UART_initStruct.Init.StopBits = UART_STOPBITS_1; UART_initStruct.Init....
  • HALuart 数据收发与部分源码...文章目录HALuart 数据收发与部分源码介绍前言一、uart 结构体成员介绍``二、uart .h 部分函数源码1.HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,
  • 使用HAL库开发STM32:UART基础使用

    千次阅读 2019-11-29 14:14:13
    UART(异步串口)是单片机非常常用的一功能,一般用作设备或模块间通讯的一种方式。通常所说的232或是485通讯从写程序的角度来说就是使用UART进行通讯。(这地方有些人会混淆,串口更多是一种通讯方式、机制,而...
  • l Stop Bits 停止位可选1位、2位 l Data Direction 数据方向,可选收发(Receive and Transmit)、只接收(Receive Only)、只发送(Transmit Only) 三、阻塞发送函数阻塞模式发送大量数据 当没有启用UART奇偶...
  • 目录一、目的:二、环境和平台:三、UART的普通收发:3.1、说明:3.2、cube配置:3.3、思路3.4、 本系列文章由江山(csdn名:补不补布)自己写成,当中用到引用时都已经标记出来,如果出现版权问题,请直接联系我...
  • 1、在HAL_UART_MspInit()函数中不能使用HAL_UART_Receive_IT()和HAL_UART_Transmit_IT()函数,否则不会进入中断处理函数中,也就是说设置中断无效; 2、在HAL_UART_RxCpltCallback()回调函数中不能使用HAL_UART_...
  • STM32--HAL库--UART使用

    2020-12-10 15:40:36
    写在前面的话 欢迎大家在评论区指正错误,该博文是我在这几天使用hal库的时候碰到的问题的...HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); H
  • 使用HAL库开发STM32:UART进阶使用

    千次阅读 2019-12-21 16:38:33
    while (1) { } } 上面代码中fun函数里声明了一数组,然后通过UART以非阻塞的方式进行发送,在调用发送函数后紧接着会立即退出fun函数,dara数组内存会被释放,但这时候发送还在进行,这里就有可能发生发生数据...
  • STM32 之 HAL 库USART的DMA的使用

    万次阅读 多人点赞 2019-01-26 23:16:09
    上一篇对于UART的使用是非常初级的。一般我也只会用来进行代码测试,不会运用到实际项目当中。因为阻塞式的询问串口数据非常占用CPU的使用率,即便每次询问1ms对于CPU来讲都是很长时间的空闲状态。上一篇讲的bug也...
  • STM32 HAL库学习(三):UART

    千次阅读 2019-08-27 11:13:11
    STM32 HAL库学习(三):UART 1 USART 与 UART // USART 是对 UART 的扩展。它除了支持异步传输之外,也支持同步传输。但目前较少应用。 UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发传输...
  • STM32Cube HAL库串口总结

    千次阅读 2018-03-06 13:37:21
    阻塞传输,中断传输、DMA传输HAL_UART_TransmitHAL_UART_ReceiveHAL_UART_Transmit_ITHAL_UART_Receive_ITHAL_UART_Transmit_DMAHAL_UART_Receive_DMA 此外还定义了两中断回调函数,供中断和DMA使用,分别在数据...
  • 声明:本教程仅教你如何使用HAL库,不对原理进行讲解。适合人群为调试信号质量的硬件工程师、STM32初学者和快速验证外设功能者。 工具: STMCUFinder STM32CubeMX Keil V5.25 芯片:STM32F030RCT6 步骤: 1、使用...
  • 用STM32CubeMx生成初始化配置代码是十分方便的,但是在处理多项目的时候,就会发现,自动生成的中断函数调用的都是同一回调函数,在这回调函数中又要根据不同的句柄来处理,不同的项目外设又有所区别,还是要...
  • stm32 hal库分析之uart

    千次阅读 2018-07-27 21:37:41
    haluart收发 阻塞发送(非中断方式) 607 /** 608 * @brief Sends an amount of data in blocking mode. ...
  • STM32 之 HAL 库串口 USART 丢数据及ORE卡死的解决方案

    万次阅读 多人点赞 2019-01-16 23:11:43
    刚装了VS2019Preview,VS2017系列应该...之前公司有人做这方面的项目的时候也是这情况,当时发现UART处于ORE(overrun error)状态,归结为波特率太高,降低波特率算妥协了。结果自己弄Nucleo的开发板也出现这...
  • STM32_HAL库函数之常用函数总结及注释

    千次阅读 多人点赞 2020-12-17 08:47:24
    刚学HAL库在总是不知道调用哪个函数,就算知道也写不出来,复制粘贴才是王道… 本文整理了一些常用的函数,有注释和使用方法方便使用的时候直接复制 目前有GPIO、UART、ADC、DAC、TIM、PWM、IIC、SPI、CAN、FLASH、...
  • USB接口是电脑主板上的一种四针接口,其中中间两针传输数据,两边两针给外设供电。 How? 串口的传输方式也很简单,除了电源线之外,只需要两根线:TX和RX用于发送和接收。串口的通讯需要遵循通讯协议——UART...
  • HAL库对串口中断进行了封装,留给用户的接口只有一回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //接收中断回调函数 在使用库函数或寄存器时,我们通常要自己清除中断标志位,且接收中断的...
  • STM32CubeMX生成的HAL库中,提供了三类串口数据收发的接口,分别为阻塞模式,非阻塞模式和DMA模式,文本主要对DMA模式进行了分析并依据提供的接口提出了更加实用的串口数据收发方案。通过对网上资料的查找和分析,...
  • HAL库-STM32F4 UART-IT

    千次阅读 2016-05-08 16:53:36
    注:参考ST公司HAL库附带UART-IT例程。 参考资料:ST-《STM32F4xx中文参考手册》、野火-《零死角玩转STM-F429》 主要数据类型: UART_HandleTypeDef UartHandle; 主要HAL函数: 初始化函数HAL_StatusTypeDef ...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 332
精华内容 132
关键字:

hal_uart_transmit是个阻塞函数嘛