STM32CubeMX串口接收数据(DMA方式,HAL库)

发布者:中原读书客最新更新时间:2018-06-19 来源: eefocus关键字:STM32CubeMX  串口接收数据  DMA方式  HAL库 手机看文章 扫描二维码
随时随地手机看文章

使用DMA方式可以减轻CPU负担,此例子相关配置可以参考


STM32CubeMX串口接收数据(中断方式,HAL库)

(1)设置USART1中断,NVIC配置如下图 

这里写图片描述

(2)设置USART1的DMA,如下图 
这里写图片描述

注意:要将RX的模式设置为circular ,否则只能接收一次,如果这里不作设置,网上也有其他方法介绍代码实现多次接收的,但既然用到了STM32CubeMX就尽量发挥最大作用吧!

这里写图片描述 
(3)生成项目工程

(4)在main.c里设置变量以及启动DMA接收

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

uint8_t aRxBuffer1[1];      //接收缓存

uint8_t aTxBuffer[] = "*********SENDING DATA USING USART1 with DMA***********\r\n";


/* USER CODE END PV */


 /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  HAL_UART_Receive_DMA(&huart1,aRxBuffer1,1);// 启动DMA接收

  HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer));// DMA发生数据

  while (1)

  {

  }


  /* USER CODE END WHILE */编写USART1接收中断处理函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 

HAL_UART_Transmit_DMA(&huart1,aRxBuffer1,1); // DM2发送出去 
// HAL_UART_Receive_DMA(&huart1,aRxBuffer1,1); // 重新DMA接收 

“` 
注意这里和只采用中断方式的不同,配置了循环模式后可以不用自己手动再次启动DMA接收

linux下(windows下是一样的)使用串口助手cutecom效果如下: 
这里写图片描述

不足之处: 
如果一开始不使能串口中断,那么DMA接收完成后就不会进入HAL_UART_RxCpltCallback函数,虽然有单独的DMA中断处理函数DMA2_Stream2_IRQHandler 和 DMA2_Stream7_IRQHandler ,简单试了一下还未实现预定效果,有待改进,也请同道小伙伴告知


关键字:STM32CubeMX  串口接收数据  DMA方式  HAL库 引用地址:STM32CubeMX串口接收数据(DMA方式,HAL库)

上一篇:STM32CubeMX FreeRTOS软件定时器实验
下一篇:STM32CubeMX时钟配置详解

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

如何使用带定时器的中断
步骤1:在STM32CubeMX中创建项目 打开STM32CubeMX。点击“新建项目”。从系列选择‘STMF1’,从‘线’选择STM32F103。从MCU列表中,选择“STM32F103RBTx”。单击“确定”。 [1] 现在,需要完成两件事。首先,在STM32板上显示的STM32微控制器上,单击“PA5”并选择“GPIO_Output”。其次,在Peripherals选项卡下的‘TIM1’选项卡下选择‘Internal Clock’作为‘Clock Source’,如图所示: [2] 现在,切换到配置选项卡。在“控件”下,您将看到“TIM1”按钮。单击它,您将看到如下窗口: [3] 现在,在此计数器设置下的“
[单片机]
如何使用带定时器的中断
STM32F1系列基本定时器HAL库配置
时钟的概念了解完就趁热打铁进行定时器的简单讲解,定时器的操作是十分重要的,他不仅可以用于计数/定时(两者其实一个道理),还可以生成PWM,输入捕获等等,高级定时器可以用于工业电机上的有关操作。所以,我们专门讲解一波基本定时器,并用它做一个闪烁灯小实验。 定时器简介 在STM32F1上,常规定时器分为三种定时器:高级,通用,基本; 高级定时器的功能涵盖通用定时器,通用定时器功能涵盖基本定时器 以基本定时器实现计数功能,这里说的并不准确,应该说是定时功能, 定时是对周期固定的脉冲信号进行计数如APB(MCU的外设时钟APB),而计数是对周期不确定(可能固定也可能不固定)的脉冲信号进行计数。 更为深入的比喻:就是水杯中装水的
[单片机]
STM32F1系列基本定时器<font color='red'>HAL库</font>配置
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
[单片机]
STM32CubeMX串口接收数据(中断方式HAL库
系统:linux mint 18.3 xfce 64bit 软件: STM32CubeMX 4.24 SW4STM32 2.4 开发板芯片:STM32F103RCT6,STM32F407VET6 实现效果:打开两个串口助手窗口,一个是USART1的,一个是USART2的,任意一个串口(串口1或者串口2)发送数据过去就会马上通过该串口返回来。 开篇语: 使用STM32CubeMX和SW4STM32具有的优点: (1)跨平台开发的优势,win和linux系统都有现成的安装包,安装sw4stm32过程会提升自动安装STLINK驱动 (2)版本升级积极,我觉得这是一个好现象,说明开发者很重视 (3)最重要的是免费!!!不用到处找破解
[单片机]
<font color='red'>STM32CubeMX</font><font color='red'>串口</font><font color='red'>接收</font><font color='red'>数据</font>(中断<font color='red'>方式</font>,<font color='red'>HAL库</font>)
STM32cubeMX使用心得
使用STM32cubeMX创建工程 首先你需要下载STM32cubeMX软件版本,我使用的是——5.0.1.软件版本可以去官网下载。 其次你需要一个合适你工程的《STMcube_FW_F1_Vxx》库链接如下:提取码:uqbw https://pan.baidu.com/s/1x-tMOqPwUC0R9O2xAx2QfQ 当我们使用STM32cubeMX创建一个工程时选择MCU selector - core,series。 最后在选择具体什么型号的芯片。 工程配置说明: 系统核心- systeam core 数模转换- analog 定时器功能- timers 通讯功能- connectivity 音频- multi
[单片机]
<font color='red'>STM32cubeMX</font>使用心得
S3C2440 Mini 2440 DMA方式实现Uart(串口)通信
搞了好久,终于完成了DMA方式实现串口通信。使用DMA不是很难,主要是DCONn的配置比较麻烦以及几种模式的理解。 DMA service mode:single service&Whole service。前一模式下,一次DMA请求完成一项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成一次整体服务。具体对应DCON 。 DMA DREQ/DACK PROTOCOL:DMA请求和应答的协议有两种,Demond mode 和 Handshake mode。两者对Request和Ack的时序定义有所不同: 在Demond模式下,如
[单片机]
第12章 STM32F429的HAL库框架设计学习
12.1 初学者重要提示 学习使用HAL库前,有必要对他们的基本设计框架有所了解,然后深入学习,效果更好。 为了方便调用,HAL库为各种外设基本都配了三套API,查询,中断和DMA。 12.2 HAL库的配置文件 HAL库有一个专门的配置文件叫stm32f4xx_hal_conf.h,这个文件里面有一个很重要的参数,就是HSE_VALUE,大家所设计板子使用的实际晶振大小一定要与这个数值一致。比如V6的外置晶振是8MHz,那么这里就务必配置宏定义为: #define HSE_VALUE ((uint32_t)8000000) 完整的代码如下: 1. /* ##########################
[单片机]
STM32如何从串口接收数据,取出数据中的密码段再保存到flash中
STM32如何从串口接收数据,取出数据中的密码段再保存到flash中 u8 Usart2_buf ; unsigned int usart2_lent; void main(void) { char buf_password = 000000 ;//6位密码 memset((char *) &buf_password, 0, sizeof(buf_password)); strncpy(buf_password, Usart2_buf + 9, 6);//从外键获取的信息保存到Usart2_buf中,其中从第10-15位保存的是密码 if(save_password()==1) { soundBe
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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