STM32采用HAL库使用usart_DMA问题

发布者:泥匠手最新更新时间:2017-09-27 来源: eefocus关键字:STM32  HAL库  usart_DMA 手机看文章 扫描二维码
随时随地手机看文章

在这里需要理解一个概念就是,使用hal库,首先一定要对标准库中外设的使用,有一个很好的了解,在我这里出现这个原因就是由于对标准库中外设的使用不够了解,导致转移到HAL库,出现各种问题。 
本次采用的是HAL库串口2中断的接受,DMA方式发送。 
具体想实现的功能是:上位机发送一帧固定的数据(15bit)前面2个字节固定的,在串口中断中,检测到了这个前面2个字节是正确的,则进行数据的处理。处理好数据以后,在采用DMA方式发送出去对应的数据。 
出现的问题:每次调用函数这个函数后,下次就不能使用了

        MYDMA_USART_Transmit(&UART2_Handler(u8*)USART2_TX_BUF,USART2_REC_LEN); //启动传输12

(ps : 该函数是原子哥提供的采用hal库USART_DMA发送固定长度的数据的函数) 
查看各种问题后,发现是由于发送完成以后,没有清除中断完成标志,并且完成以后需要在关闭串口DMA.

//等待DMA1_Steam6传输完成         if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))
{
 __HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6传输完成标志
 HAL_UART_DMAStop(&UART2_Handler);//传输完成以后关闭串口DMA                          }123456

一般情况下我们都是采用while(1)循环的方式来进行等待DMA发送完成.

while(1)
{    if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))  //等待DMA1_Steam6传输完成
    {                                                                                                                                          __HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6传输完成标志
         HAL_UART_DMAStop(&UART2_Handler);                                  //传输完成以后关闭串口DMA
    }    break;}12345678

当时采用这种方式会是的我们的CPU主权的不到很好的释放,所以我们采用定时中断的方式去实现,这样就不会占用CPU了。可以采用定时400us判断一次传输是否完成。

//定时器中断回调函数
  void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{  if (htim == (&TIM3_Handler))
 { if(__HAL_DMA_GET_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6))  //等待DMA1_Steam6传输完成
  {
 __HAL_DMA_CLEAR_FLAG(&UART2TxDMA_Handler,DMA_FLAG_TCIF2_6);//清除DMA1_Steam6传输完成标
 HAL_UART_DMAStop(&UART2_Handler);                                  //传输完成以后关闭串口DMA
  }
 }
}


关键字:STM32  HAL库  usart_DMA 引用地址:STM32采用HAL库使用usart_DMA问题

上一篇:STM32学习笔记:adc采样得到的电压值用485发送给pc
下一篇:STM32学习笔记:读写内部Flash

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

STM32输出与输入概念区别
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一
[单片机]
<font color='red'>STM32</font>输出与输入概念区别
STM32单片机实现DMA+ADC+UART功能
突然想测试一下STM32单片机ADC采样速率问题,按照常规方法,可以通过ADC采样,然后将采样值打印出来。但是这种方法在处理和打印数据的时候会占用很多时间,导致处理数据的时间超过了ADC的采样时间。于是想到了ADC采样的数据用DMA功能存储,并通过串口打印。但是串口打印依然要占用单片机时间,那能不能串口数据的输出也采用 DMA功能呢?这样ADC采样的数据通过DMA直接存储,然后串口通过DMA功能直接输出采样到的数据。这样速度程序执行速度不就极大的提升了吗?说干就干,使用STM32F103C8T6单片机,标准库函数,keil5软件,编写一个测试程序。 首先实现ADC采样并通过DMA存储 #ifndef __ADC_H #de
[单片机]
<font color='red'>STM32</font>单片机实现DMA+ADC+UART功能
STM32 F4 从bootloader跳转用户代码遇到的问题
代码跳转后运行用户程序遇到的问题: DMA2_Stream3_IRQHandler DMA2_Stream4_IRQHandler ETH_IRQHandler ETH_WKUP_IRQHandler CAN2_TX_IRQHandler CAN2_RX0_IRQHandler CAN2_RX1_IRQHandler
[单片机]
STM32的断言机制——函数assert_param()
我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。 下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。 我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param(); 下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解, 函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型 #define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH)) == GPIOA_
[单片机]
<font color='red'>STM32</font>的断言机制——函数assert_param()
STM32之GPIO原理
GPIO的配置种类有8种: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。 推挽电路是两个参数相同的三极管
[单片机]
<font color='red'>STM32</font>之GPIO原理
MDK-ARM(Keil uVision V4.72)上STM32开发环境配置
以前我都是在Eclipse上面和arm-none-eabi交叉编译环境来开发STM32应用程序的。 现在改用MDK-ARM比较专业的工具搭建一个开发环境。 新建一个指定STM32微控制器型号的工程: 为了生成编译文件,勾选如下复选框: 配置编译项: STM32F4XX, USE_STDPERIPH_DRIVER 添加库编译符号,和语言/代码生成级别 其中最关键的头文件包含目录: 首先要添加包含工程目录,因为固件库会查找 stm32f4xx_conf.h 配置头文件,中断服务例程实现文件可能也会调用main.h中的函数。 再添加包含 xxxySTM32F4_LibLibrariesCMSISIn
[单片机]
MDK-ARM(Keil uVision V4.72)上<font color='red'>STM32</font>开发环境配置
stm32库函数下,输出可调频率pwm
//////////////////////////////////////////////////////////// //基于库函数的不完全代码 //////////////////////////////////////////////////////////// TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz while(1) { TIM3- ARR=led0pwmval+50; //改变此句话的值,调节pwm频率 TIM_SetCompare2(TIM3,49); delay_ms(500); led0pwmval++; if(led0
[单片机]
基于STM32的PS2遥控小车
摘要:PS2手柄是索尼的PlayStation2游戏机的遥控手柄。索尼的psx系列游戏主机在全球很是畅销。不知什么时候便有人打起ps2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的智能小车。突出的特点是这款手柄性价比极高,按键丰富,方便扩展到其它应用中。 1.PS2手柄控制 PS2手柄由手柄与接收器两部分组成,手柄主要负责发送按键信息;接收器与单片机(也可叫作主机,可直接用在PS2游戏机上)相连,用于接收手柄发来的信息,并传递给单片机,单片机也可通过接收器,向手柄发送命令,配置手柄的发送模式。 2.PS2手柄时序 1、CS线在通讯期间拉低,通信过程中CS信号线在一串数据(9个字节,每
[单片机]
基于<font color='red'>STM32</font>的PS2遥控小车
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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