单片机
返回首页

STM32 HAL库 串口DMA发送完成中断

2019-08-28 来源:eefocus

近期使用STM32驱动MAX3485进行485通信,发现STM32F103C8并不自带硬件485首发功能,需要软件上控制IO高低来驱动MAX3485进行485接收、485发送。

根据MAX3485手册可得,进行485发送时给相应引脚高电平。其余时间为低电平进行485接收。因此需要找到串口DMA发送完成的回调函数,在发送完成后将引脚拉低。

在stm32f1xx_hal_uart.c中


/** @defgroup UART_Exported_Functions_Group2 IO operation functions 

  *  @brief UART Transmit and Receive functions 

  *

@verbatim

  ==============================================================================

                      ##### IO operation functions #####

  ==============================================================================

  [..]

    This subsection provides a set of functions allowing to manage the UART asynchronous

    and Half duplex data transfers.


    (#) There are two modes of transfer:

       (++) Blocking mode: The communication is performed in polling mode. 

            The HAL status of all data processing is returned by the same function 

            after finishing transfer.  

       (++) Non blocking mode: The communication is performed using Interrupts 

            or DMA, these APIs return the HAL status.

            The end of the data processing will be indicated through the 

            dedicated UART IRQ when using Interrupt mode or the DMA IRQ when 

            using DMA mode.

            The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks 

            will be executed respectively at the end of the transmit or receive process.

            The HAL_UART_ErrorCallback() user callback will be executed when 

            a communication error is detected.


    (#) Blocking mode APIs are:

        (++) HAL_UART_Transmit()

        (++) HAL_UART_Receive() 


    (#) Non Blocking mode APIs with Interrupt are:

        (++) HAL_UART_Transmit_IT()

        (++) HAL_UART_Receive_IT()

        (++) HAL_UART_IRQHandler()


    (#) Non Blocking mode functions with DMA are:

        (++) HAL_UART_Transmit_DMA()

        (++) HAL_UART_Receive_DMA()

        (++) HAL_UART_DMAPause()

        (++) HAL_UART_DMAResume()

        (++) HAL_UART_DMAStop()


    (#) A set of Transfer Complete Callbacks are provided in non blocking mode:

        (++) HAL_UART_TxHalfCpltCallback()

        (++) HAL_UART_TxCpltCallback()

        (++) HAL_UART_RxHalfCpltCallback()

        (++) HAL_UART_RxCpltCallback()

        (++) HAL_UART_ErrorCallback()


    [..]

      (@) In the Half duplex communication, it is forbidden to run the transmit 

          and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX

          can't be useful.


可以看到 HAL_UART_TxCpltCallback() 的相关解释,发现其位发送完成的回调函数。

因此定义该函数后自行添加相关的代码即可完成。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章