文档章节

stm32 HAL库 HAL_UART_Transmit_DMA 发送函数分析

vccw
 vccw
发布于 2016/11/13 03:24
字数 541
阅读 1590
收藏 0
点赞 0
评论 0

请勿转载。谢谢。

###1.函数主体内容

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  uint32_t *tmp;
  
  /* 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;

    /* Set the UART DMA transfer complete callback */
    huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;

    /* Set the UART DMA Half transfer complete callback */
    huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt;

    /* Set the DMA error callback */
    huart->hdmatx->XferErrorCallback = UART_DMAError;

    /* Set the DMA abort callback */
    huart->hdmatx->XferAbortCallback = NULL;

    /* Enable the UART transmit DMA Stream */
    tmp = (uint32_t*)&pData;
    HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->DR, Size);
    
    /* Clear the TC flag in the SR register by writing 0 to it */
    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
    
    /* Process Unlocked */
    __HAL_UNLOCK(huart);
    
    /* Enable the DMA transfer for transmit request by setting the DMAT bit
       in the UART CR3 register */
    SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
    
    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

如上就是HAL_UART_Transmit_DMA 函数全部的代码。除去些初始化的代码,可以提炼到比较重要的代码如下

设置memory 到 periphery 的地址,并且开启中断 并使能DMA通道

HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->DR, Size);

清除串口 TC 中断 FLAG

__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);

使能发送

SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);

2.调用HAL_DMA_Start_IT

设置memory 到 periphery 的地址,并且开启中断 并使能DMA通道 函数内容如下

HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
{
  HAL_StatusTypeDef status = HAL_OK;

  /* calculate DMA base and stream number */
  DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress;
  
  /* Check the parameters */
  assert_param(IS_DMA_BUFFER_SIZE(DataLength));
 
  /* Process locked */
  __HAL_LOCK(hdma);
  
  if(HAL_DMA_STATE_READY == hdma->State)
  {
    /* Change DMA peripheral state */
    hdma->State = HAL_DMA_STATE_BUSY;
    
    /* Initialize the error code */
    hdma->ErrorCode = HAL_DMA_ERROR_NONE;
    
    /* Configure the source, destination address and the data length */
    DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
    
    /* Clear all interrupt flags at correct offset within the register */
    regs->IFCR = 0x3FU << hdma->StreamIndex;
    
    /* Enable Common interrupts*/
    hdma->Instance->CR  |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME;
    hdma->Instance->FCR |= DMA_IT_FE;
    
    if(hdma->XferHalfCpltCallback != NULL)
    {
      hdma->Instance->CR  |= DMA_IT_HT;
    }
    
    /* Enable the Peripheral */

__HAL_DMA_ENABLE(hdma);

  }
  else
  {
    /* Process unlocked */
    __HAL_UNLOCK(hdma);	  
    
    /* Return error status */
    status = HAL_BUSY;
  }
  
  return status;
}

设置memory 到 periphery 地址

DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);

打开中断

    hdma->Instance->CR  |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME;
    hdma->Instance->FCR |= DMA_IT_FE;

开启通道

__HAL_DMA_ENABLE(hdma);

关于开启通道的的这个marco 可以在这条语句中得到解答

#define __HAL_DMA_ENABLE(__HANDLE__)      ((__HANDLE__)->Instance->CR |=  DMA_SxCR_EN)

###3.结尾 那么HAL_UART_Transmit_DMA 函数主要做的事情顺序如下

  • 设置memory 到 periphery 的地址,并且开启中断 并使能DMA通道
  • 清除串口 TC 中断 FLAG
  • 使能发送

© 著作权归作者所有

共有 人打赏支持
vccw
粉丝 2
博文 1
码字总数 541
作品 0
武汉
程序员
STM32 HAL库 回调函数总结

普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数...

super828 ⋅ 01/21 ⋅ 0

STM32之HAL库详解 及 手动移植

HAL库结构   说到STM32的HAL库,就不得不提STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX就是以HAL库为基础的,且目前仅支持HAL库!首先...

ZCShouCSDN ⋅ 2017/02/15 ⋅ 0

STM32时钟配置与SysTick配置_基于STM32F103

【一】前言 STM32前后台程序编程时,最基本的配置应当是对其时钟和系统定时器的配置,对标准库而言,调用SysTickInit ();。如果采用HAL库,首先还应该调用HALInit();初始化HAL库。 此处采用标...

u010834669 ⋅ 05/05 ⋅ 0

最新HAL库 CUBEMX 的CAN总线配置接收发送(STM32F412)

STM32F412 精简版本 功能完整。 来说一下CAN外设的配置以及收发。 HAL库发展到现在BUG越来越少,大大减少了用户的开发量,但是缺点明显,代码量庞大。效率不高。 配置CAN总线首先要明确APB1的...

qubozhan4751 ⋅ 04/11 ⋅ 0

通俗易懂解析stm32 (一) HAL库 标准库 直接配置寄存器 三种开发方式的区别

通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行...

csdnpapa ⋅ 02/12 ⋅ 0

程序运行框架——基于STM32F767IGT6

一、startup_stm32f767xx.s Reset_Handler引导进入SystemInit函数和main函数; 二、system_stm32f7xx.c SystemInit函数:系统初始化; 三、main函数 用户函数入口; 四、stm32f7xx_hal.c HAL...

u014663232 ⋅ 04/17 ⋅ 0

第二章:STM32MxCube配置串口

基于上一次将第一章:STM32MxCube 基本使用方法,本章直接讲叙述STM32配置串口2的。 查看STM32F407电路图:可得USART2接在PA2、PA3。 下面新建STM32MxCube工程,开始配置。这里我们配置IO(定...

xuquanlin_1680 ⋅ 05/29 ⋅ 0

cmsis标准和使用

http://www.keil.com/pack/doc/cmsis/General/html/index.html cmsis在stm32标准库的应用 如上图所示,在标准库编程中,入口文件是stm32f4xx.h,该文件属于cmsis定义的Device Peripheral Acc...

心翔 ⋅ 2016/06/18 ⋅ 0

【分享】iTOP4412开发板-Bluetooth移植文档

本文转自迅为:http://www.topeetboard.com 近期需要把Bluetooth移植到iTOP-4412 开发平台,查阅了相关资料,经过一段时间的研究、调试,终于成功的将蓝牙功能移植到了开发板上面,这里笔者记...

topeet ⋅ 2015/07/20 ⋅ 0

mdk5+cubeMx入门简介(点亮一个LED灯)

准备工作 安装mdk5以及cubeMx软件 cubeMx下载地址: https://www.stmcu.com.cn/Designresource/loaddesignresource/catcode/firmwaresoftware/procat/STM32?filterprocat=STM32&filterprotok......

weixin_41101375 ⋅ 04/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部