使用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库)
推荐阅读最新更新时间: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),而计数是对周期不确定(可能固定也可能不固定)的脉冲信号进行计数。 更为深入的比喻:就是水杯中装水的
[单片机]
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)最重要的是免费!!!不用到处找破解
[单片机]
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
[单片机]
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
[单片机]