STM32F103用hal库使用DMA+串口空闲中断接收数据

2023-05-16

简介:

出现空闲标志时,认为一帧报文发送完毕,进行报文分析,比普通的串口中断效率高很多!

用到的工具:CubeMX,Keil5

芯片:STM32F103VET6

步骤:

一、配置串口

二、使能串口NVIC中断

三、配置DMA

四、配置为MDK5,并生成代码工程

五、打开工程,添加部分代码

uint8_t receive_buff[255];                //定义接收数组
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
	HAL_UART_Receive_DMA(&huart1, (uint8_t*)receive_buff, 255); 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

六、添加串口空闲中断处理

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 1 */
	if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))   //判断是否是空闲中断
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);                       //清除空闲中断标志
		HAL_UART_DMAStop(&huart1);                                //停止本次DMA传输    
		uint8_t data_length  = 255 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);   //计算接收到的数据长度
		HAL_UART_Transmit(&huart1,receive_buff,data_length,0x200);             //测试函数:将接收到的数据打印出去
		memset(receive_buff,0,data_length);                                            
		data_length = 0;
		HAL_UART_Receive_DMA(&huart1, (uint8_t*)receive_buff, 255);                    //重启开始DMA传输
	}
  /* USER CODE END USART1_IRQn 1 */
}

七、连接串口助手测试

收到数据后,会在空闲中断里把收到的数据发送回去。效果如下图所示:


以下为把串口空闲中断抽离出来:以串口2为例:

UART_HandleTypeDef huart2;
uint8_t receive_buff2[255];
DMA_HandleTypeDef hdma_usart2_rx;

void Uart2_Init()
{
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_AFIO_CLK_ENABLE();
  __HAL_RCC_PWR_CLK_ENABLE();
	__HAL_RCC_USART2_CLK_ENABLE();
	__HAL_RCC_DMA1_CLK_ENABLE();
	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
	
	HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
	
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = GPIO_PIN_2;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = GPIO_PIN_3;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	/* USART2 DMA Init */
    /* USART2_RX Init */
	hdma_usart2_rx.Instance = DMA1_Channel6;
	hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
	hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
	hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
	hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
	hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
	hdma_usart2_rx.Init.Mode = DMA_NORMAL;
	hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
	if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
	{
		Error_Handler();
	}

	__HAL_LINKDMA(&huart2,hdmarx,hdma_usart2_rx);

	/* USART2 interrupt Init */
	HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(USART2_IRQn);
	
	
	huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
	__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
	HAL_UART_Receive_DMA(&huart2, (uint8_t*)receive_buff2, 255); 	  
}
/**
  * @brief This function handles USART2 global interrupt.
  */
uint8_t data_length;
void USART2_IRQHandler(void)
{
	if(RESET != __HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))   //判断是否是空闲中断
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart2);                       //清除空闲中断标志
		HAL_UART_DMAStop(&huart2);                                //停止本次DMA传输    
		data_length  = 255 - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);   //计算接收到的数据长度
		HAL_UART_Transmit(&huart2,receive_buff2,data_length,0x200);             //测试函数:将接收到的数据打印出去
//		memset(receive_buff2,0,data_length);                                            
		HAL_UART_Receive_DMA(&huart2, (uint8_t*)receive_buff2, 255);                    //重启开始DMA传输
	}
}

main里调用初始化即可

int main(void)
{
    int count = 1;
    Uart2_Init();
    while (1)
    {
        ...
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103用hal库使用DMA+串口空闲中断接收数据 的相关文章

  • ubuntu14.04 升级内核

    转载地址 xff1a http blog csdn net u011884290 article details 52082809 前两周升级了ubuntu 16 04 出现了关机卡死的情况 xff0c 查了下可能是系统内核 xff08 4
  • linux firefox提示“firefox is already running”的解决方法

    背景解决方法 背景 linux下 xff0c 多用户通过vnc访问指定IP xff0c 比如192 168 2 94 不同用户执行firefox xff0c firefox进程存在且仅能存在一个 记录一下 xff0c 以备不时之需 解决方法
  • 论C++类对象赋值

    class Demo public Demo Demo int j cout lt lt 34 Demo int 34 lt lt j lt lt endl this gt i 61 j Demo const Demo amp d cout
  • gnuradio+b210实现FM收音机

    gnuradio 43 b210实现FM收音机 环境介绍FM接收1 Flow Graph2 变量参数 FM发射1 Flow Graph2 变量参数 环境介绍 NameVersiongnuradio3 7 14 0uhd3 15 0 0ubu
  • 图深度学习 Deep Learning on Graph

    深度学习在图上的应用 引言图神经网络图卷积网络卷积操作谱方法Efficiency AspectMultiple Graphs Aspect框架 Readout 操作改进与讨论注意力机制残差和跳跃连接 Residual and Jumping
  • Ubuntu16.04中文输入法安装初战

    最近刚给笔记本装了Ubuntu 43 win10双系统 xff0c 但是ubuntu16 04没有自带中文输入法 xff0c 所以经过网上的一些经验搜索整合 xff0c 分享一下安装中文输入法的心得 本文主要介绍了谷歌拼音跟ibus中文输入
  • GoDaddy与Namecheap域名注册商对比分析

    默默鸟已经有几天没有更新博客 xff0c 博客更新的少是因为我必须在更新之前想好了围绕博客的主题更新 xff0c 而不是想到哪个就更新哪些内容 xff0c 一来可能不符合博客的中心 xff0c 二来对于用户群也有影响 xff0c 同事显得不
  • ubuntu18安装vnc远程桌面服务

    安装 vnc4server xff0c xfce4 sudo apt install vnc4server xfce4 xfce4 goodies 安装完成后配置VNC登录密码 vncpasswd 启动VNC server vncserve
  • 国内国外常用的10个云服务器可视化管理面板

    如今无论是搭建网站 xff0c 还是部署小程序 xff0c 甚至一些企业应用都会用到云服务求或者独立服务器 对于很多希望利用网站 网络创业的 xff0c 也会用到服务器 xff0c 不过在使用服务器过程中 xff0c 我们对于服务器环境的配
  • 几个Windows强力卸载工具软件推荐

    对于我们有在使用Windows系统的时候 xff0c 是不是会主动或者被动的安装一些软件和插件工具 殊不知日积月累之后 xff0c 系统中的软件会越来越多 xff0c 甚至有很多我们安装几个月甚至几年都不会用到的 这些软件 xff0c 其实
  • 几款值得选的SSH客户端软件

    对于服务器运维工作来说 xff0c 我们少不了SSH远程客户端管理工具 我们在用哪款呢 xff1f 比如常见用的包括PuTTY XShell WindTerm等 xff0c 有很多的付费或者免费的 xff0c 既然有这么多免费且好用的为什么
  • 原生态Ubuntu部署LAMP环境 PHP8.1+MySQL+Apache

    如果我们部署WEB环境用于网站项目 xff0c 我们还是建议用成熟的一键包或者可视化面板这种 xff0c 毕竟软件的部署和后续的运维方便很多 但是 xff0c 如果我们有需要学习Linux环境的原理 xff0c 那还是要学会原生态部署软件的
  • Passwork适合多人协作团队的自建密码管理器

    如今互联网已经深入我们的工作和生活中 xff0c 从办公 购物 学习每天都会用到各种网站平台 各种APP客户端 各种软件账户 xff0c 这就离不开对各个平台账户的管理 我们应该也知道 xff0c 账户的安全是至关重要的 xff0c 如果账
  • 完整利用Rsync实现服务器/网站数据增量同步备份

    我们在选择VPS 服务器架设项目之后 xff0c 所有的项目 网站数据都需要我们自行备份和维护 xff0c 即便有些服务商有提供管理型服务器 xff0c 但是数据自行备份和管理才是较为靠谱的 无论是网站 xff0c 还是其他项目 xff0c
  • 整理Nginx/Apache服务器配置HTTPS SSL证书示范教程

    昨天我们看到百度发布 34 百度烽火算法升级 34 xff0c 提到网站如果被劫持或者拦截可能会降低网站的权重和排名等问题 这使得我们网站需要使用HTTPS SSL证书来减少被拦截劫持的风险 其实在早些时候我们已经看到很多浏览器都强制要求网
  • 6个免费DNS解析服务商评测分析 适用于网站域名解析应用

    这几天我们很多网友应该知道CloudXNS DNS解析服务商预计7月15日会宣布停止提供免费解析服务而主营商业服务 虽然网络上提供免费DNS解析服务商很多 xff0c 但是毕竟这么多年CloudXNS域名解析稳定性还是不错的 xff0c 而
  • 两种方法修改数据库myslq密码

    搞了很久终于修改数据库密码成功了 命令行修改root密码 xff1a mysql gt UPDATE mysql user SET password 61 PASSWORD 新密码 WHERE User 61 root mysql gt F
  • 关于学生课堂行为识别算法

    目前基于针对学校做了一款考生行为识别算法 xff0c 算法可以在服务器部署 xff0c 也可以在前端设备如Jetson RK等边缘设备运行 xff0c 目前算法已经投入使用 xff0c 算法效果如下 目前算法在 2080Ti 服务器运行效率
  • 获取imagefield 类型图片的路径

    绝对路径 request build absolute uri 图片 url 相对路径 图片 url
  • mmdetection 常用命令

    1 多卡训练 CUDA VISIBLE DEVICES 61 0 1 2 3 PORT 61 15200 tool dist train py configs py 4 2 普通测试 python tools test py configs

随机推荐

  • yolov5 导出onnx 忽略检测层

    def forward self x z 61 inference output for i in range self nl x i 61 self m i x i conv bs ny nx 61 x i shape x bs 255
  • python opencv 添加运动模糊

    在训练过程中增加 运动模糊 class MotionBlur object def init self p 61 0 5 degree 61 5 angle 61 45 self p 61 p self degree 61 degree s
  • pth 多类模型改成一类模型

    import torch import copy def change pth input pth out pth model dir 61 input pth checkpoint 61 torch load model dir mode
  • 使用opencv进行车牌提取及识别

    商业合作可联系 xff1a 547691062 64 qq com 目录 1车牌提取过程 1 1车辆图像获取1 2车牌定位1 3车牌字符分割2车牌提取 2 1灰度化2 2Candy边缘检测2 3形态学 xff08 膨胀腐蚀 xff09 处理
  • python 爬虫禁止访问解决方法(403)

    1 增加Header2 代理IP3 终极方法4 实例练习 5 更多思考 在上一篇博客中说到 xff0c 程序使用一段时间后会遇到HTTP Error 403 Forbidden错误 因为在短时间内直接使用Get获取大量数据 xff0c 会被
  • C++多线程编程

    c 43 43 11 之后有了标准的线程库 xff1a C 43 43 11发布之前 xff0c C 43 43 并没有对多线程编程的专门支持 xff0c C 43 43 11通过标准库引入了对多线程的支持 xff0c 大大方便了程序员的工
  • TensorFlow车牌识别完整版(含车牌数据集)

    在之前发布的一篇博文 MNIST数据集实现车牌识别 初步演示版 中 xff0c 我们演示了如何使用TensorFlow进行车牌识别 xff0c 但是 xff0c 当时采用的数据集是MNIST数字手写体 xff0c 只能分类0 9共10个数字
  • 混合精度训练

    MIXED PRECISION TRAINING https arxiv org pdf 1710 03740 pdf 论文概述 nvidia的Pascal和Volta系列显卡除了支持标准的单精度计算外 xff0c 也支持了低精度的计算 x
  • LDA-原理解析

    前言 在之前的一篇博客机器学习中的数学 7 PCA的数学原理中深入讲解了 xff0c PCA的数学原理 谈到PCA就不得不谈LDA xff0c 他们就像是一对孪生兄弟 xff0c 总是被人们放在一起学习 xff0c 比较 这这篇博客中我们就
  • Linux下配置使用VNC

    1 在Linux下配置使用VNC 1 1 VNC简介 VNC xff08 Virtual Network Computing xff0c 虚拟网络计算机 xff09 是一种可以对远程计算机进行远程控制的软件 xff0c 支持linux远程桌
  • 双目测距原理

    双目测距基本原理 xff1a 双目测距实际操作分4个步骤 xff1a 相机标定 双目校正 双目匹配 计算深度信息 相机标定 xff1a 摄像头由于光学透镜的特性使得成像存在着径向畸变 xff0c 可由三个参数k1 k2 k3确定 xff1b
  • openstack虚拟机无法启动的一次排错经历

    如上图所示 xff0c 虚拟机卡在这个界面并且无法启动 一般的虚拟机排错方式 xff1a 1 查找虚拟机宿主机的以下日志排查是否有报错的关键字 span class hljs built in var span span class hlj
  • 给自己时间沉淀下来

    像很多学长学姐当初一样 xff0c 我也到了繁忙的大四 这个尴尬的时间 xff0c 要选择 xff0c 要放弃 开始实习 xff0c 去窥探一下外面的世界 经过一个月的测试工作 xff0c 开始发现自己与别人的差距还是很大 再继续试水 xf
  • ROS学习(22)TF变换

    文章目录 前言一 TF功能包二 TF工具1 tf monitor2 tf echo3 static transform publisher4 view frames 三 乌龟例程中的TF四 乌龟跟随例程代码实现1 创建TF广播器2 创建TF
  • C# winform 窗体缩放问题处理

    一 问题 xff1a 本身窗体在设计器显示没有问题 xff0c 但运行时窗口却被缩放失真 xff1a 二 解决方法 xff1a 修改项目的配置文件 xff0c 使项目运行时自动检测屏幕分辨率 xff0c 在高分辨率屏幕禁用系统缩放 xff0
  • strlen与sizeof计算char* 与char数组

    sizeof 可以计算所有类型 xff0c strlen 仅计算字符串 xff0c 至于这二者的详细区别可以看其他文章 char a char b 5 sizeof a 61 8 64位系统 xff0c 8代表的是指针的大小 xff0c 指
  • MySQL的not null default

    建表语句每行末尾的NOT NULL DEFAUTL 含义 该句的含义是 xff0c 该字段不能为null xff0c 并且设置如果插入数据的时候不设置该字段的值的时候使用的默认值 insert操作且不给该字段插值的时候 xff0c 数据库判
  • eclipse 中 中文字符变小的解决方法

    前言 xff1a 装了新版的eclipse后发现 英文代码部分正常 xff0c 但是但凡有中文的地方中文字符变小了 xff0c 若调整字体大小 xff0c 英文就更大了 xff0c 总归中英文大小不一致 推荐解决方法 xff1a 打开 ec
  • LINUX/AIX下文本DOS格式与UNIX格式互转

    LINUX AIX下文本DOS格式与UNIX格式互转 一 文本换行符简介 n 换行 newline LF LineFeed 0x0D r 回车 return CR CarrageReturn 0x0A windows dos r n uni
  • STM32F103用hal库使用DMA+串口空闲中断接收数据

    简介 xff1a 出现空闲标志时 xff0c 认为一帧报文发送完毕 xff0c 进行报文分析 xff0c 比普通的串口中断效率高很多 xff01 用到的工具 xff1a CubeMX xff0c Keil5 芯片 xff1a STM32F1