STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据

发布者:SparkStar22最新更新时间:2017-09-27 来源: eefocus关键字:STM32L1XX  串口数据 手机看文章 扫描二维码
随时随地手机看文章

使用STM32CubeMX生成初始化代码。

问题:

HAL_UART_Transmit_DMA函数只能调用一次,第二次就返回状态HAL_UART_STATE_BUSY 0x02。


原因:

stm32l1xx_hal_uart.c开头有描述

        (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA()
             and HAL_UART_Receive_DMA() APIs):
            (+++) Declare a DMA handle structure for the Tx/Rx channel.
            (+++) Enable the DMAx interface clock.
            (+++) Configure the declared DMA handle structure with the required 
                  Tx/Rx parameters.                
            (+++) Configure the DMA Tx/Rx channel.
            (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle.
            (+++) Configure the priority and enable the NVIC for the transfer complete 
                  interrupt on the DMA Tx/Rx channel.
            (+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle
                  (used for last byte sending completion detection in DMA non circular mode)


配置USARTx中断优先级,启用NVIC USART中断句柄(使用DMA非循环模式时,用来检测最后一个字节发送完毕)



默认 USART1的全局中断未Checked。


或者:

在发送结束的回调函数中,恢复uart的Ready状态。

void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
{
//回调函数
huart->State=HAL_UART_STATE_READY; 


}

下面附的是mbed-os的代码,它的UART_DMATransmitCplt函数直接复位Uart的状态了。


  1. /** 

  2.   * @brief DMA UART transmit process complete callback  

  3.   * @param hdma: DMA handle 

  4.   * @retval None 

  5.   */  

  6. 01523 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)       

  7. {  

  8.   UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;  

  9.   huart->TxXferCount = 0;  

  10.     

  11.   /* Disable the DMA transfer for transmit request by setting the DMAT bit 

  12.   in the UART CR3 register */  

  13.   huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);  

  14.     

  15.   /* Wait for UART TC Flag */  

  16.   if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, HAL_UART_TXDMA_TIMEOUTVALUE) != HAL_OK)  

  17.   {  

  18.     /* Timeout Occured */   

  19.     huart->State = HAL_UART_STATE_TIMEOUT;  

  20.     HAL_UART_ErrorCallback(huart);  

  21.   }  

  22.   else  

  23.   {  

  24.     /* No Timeout */  

  25.     /* Check if a receive process is ongoing or not */  

  26.     if(huart->State == HAL_UART_STATE_BUSY_TX_RX)   

  27.     {  

  28.       huart->State = HAL_UART_STATE_BUSY_RX;  

  29.     }  

  30.     else  

  31.     {  

  32.       huart->State = HAL_UART_STATE_READY;  

  33.     }  

  34.     HAL_UART_TxCpltCallback(huart);  

  35.   }  

  36. }  



关键字:STM32L1XX  串口数据 引用地址:STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据

上一篇:使用STM32 HAL库读取RTC时间芯片SD3088
下一篇:STM32学习笔记:adc采样得到的电压值用485发送给pc

推荐阅读最新更新时间:2024-03-16 15:38

STM8S UART串口使用中断收发数据
原来调过STM8L的串口,逻辑简单,中断清晰,换成STM8S105K4后,虽然也是用STD库,除去函数名、宏名等语言层面的差异以外,中断处理方面也有些不一样的地方,特此记之。 和此篇【STM8L USART串口使用】结构相同,也是中断异步模式,但为调用方便起见,在调用层面改为同步。 (STM8S105K的MCU下,RX为PD6,RX为PD5。) 使用方面,感觉主要困扰就是中断名、使用场合和时机不明确、不清晰,这一点不如STM8L的定义清晰。 举例而言,开关中断用UART2_IT_RXNE_OR,清中断则用UART2_IT_RXNE。不能开关时用UART2_IT_RXNE,也不能清中断时用UART2_IT_RXNE_OR,否则S
[单片机]
基于LabVIEW与单片机串口数据采集系统
1LabVIEW部分设计 1.1VISA简介         LabVIEW提供了功能强大的VISA库。VISA(Virtual Instrument Software Architecture)——虚拟仪器软件规范,是用于仪器编程的标准I/O函数库及其相关规范的总称。VISA库驻留于计算机系统中,完成计算机与仪器之间的连接,用以实现对仪器的程序控制,其实质是用于虚拟仪器系统的标准的API。VISA本身不具备编程能力,它是一个高层API,通过调用底层驱动程序来实现对仪器的编程,其层次如图1所示。VISA是采用VPP标准的I/O接口软件,其软件结构包含三部分,如图2所示。     与其他现存的I/O接口软件相
[嵌入式]
msp430串口数据收发的讨论
在做串口通信看 MSP430系列16位超低功耗单片机原理与应用 沈建华编著 一书中感到书中有些控制字没有列出,编写程序时容易忘记写.出现不必要的错误. ME2 IE2 IFG2 (或ME1 IE1 IFG1)下面的本程序用的是USART1.要从.H的头文件里找上面三个特殊功能寄存器的用法. #define IE2_ (0x0001) /* Interrupt Enable 2 */ DEFC( IE2 , IE2_) #define U1IE IE2 /* UART1 Interrupt Enable Register */ #define URXIE1 (0x1
[单片机]
单片机串口发送数据
很少看到有资料写如何以中断的方式发送一帧数据,如果以等待的发送数据帧,对高速运行的单片机来说是很浪费时间的,下面就介绍一种使用中断方式发送数据帧,操作平台采用51 mcu 首先定义一个数据帧的结构体,该结构体可以做为一个全局变量,所有的发送都要经过这个结构体: //结构体 struct { char busy_falg;//忙标志,若在发送数据时置位1,即在开始发送置位1,发送结束置位0 int index;//索引,指向需要发送数组的位置 int length;//整个数据帧的长度 char *buf;//指向需要发送的数据帧,建议为全局变量,否则一旦开始发送,必须等到发送结束,即判断bus
[单片机]
STM32串口发送数据第一个字节丢失问题
STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。 故障排除过程: 1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。 2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01
[单片机]
TQ2440之最简串口传输数据
来个最简单的串口程序,添加2440lib.c,程序如下: #include 2440addr.h #include Option.h #include def.h unsigned int PCLK; extern void Uart_Printf(char *fmt,...); extern void Uart_Init(int pclk,int baud); extern void Port_Init(void); extern void Uart_Select(int ch);//外部函数申明,不然一直有警告。看着不爽 void delay(void) { unsigned int i,j; for
[单片机]
串口发送数据格式
作为单片机入门的我们,在做普通串口通信实验时候,我们发送的都是十六进制数!如U0DBUF = j,默认j为十六进制数,串口调试助手有两种显示格式,当勾选hex时,就是显示字符对应的十六进制数,取消勾选,则显示我们所发的字符!比如: 情景一:void UartTX_Send_String(uchar *Data,int len) { int j; for(j=0;j { U0DBUF = *Data; while(UTX0IF == 0); UTX0IF = 0; Data++; } } UartTX_Send_String( nihaoaaa ,8); 情景二: for(
[单片机]
基于LabVIEW与单片机串口数据采集系统
1LabVIEW部分设计 1.1VISA简介 LabVIEW提供了功能强大的VISA库。VISA(Virtual Instrument Software Architecture)——虚拟仪器软件规范,是用于仪器编程的标准I/O函数库及其相关规范的总称。VISA库驻留于计算机系统中,完成计算机与仪器之间的连接,用以实现对仪器的程序控制,其实质是用于虚拟仪器系统的标准的API。VISA本身不具备编程能力,它是一个高层API,通过调用底层驱动程序来实现对仪器的编程,其层次如图1所示。VISA是采用VPP标准的I/O接口软件,其软件结构包含三部分,如图2所示。 与其他现存的I/O接口软件相比,VISA的I/O控制功能具有如下几个特
[测试测量]
基于LabVIEW与单片机<font color='red'>串口</font>的<font color='red'>数据</font>采集系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved