单片机基础——使用USART发送和接收数据(DMA模式)

2023-11-12

1. 准备工作

硬件准备

  • 开发板
    首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接。

mark

2.生成MDK工程

选择芯片型号

打开STM32CubeMX,打开MCU选择器:

mark

搜索并选中芯片STM32L431RCT6:

mark

配置时钟源

  • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
  • 如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:

mark

配置串口

小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:

mark

这里我将开关拨到AT-MCU模式,使PC的串口与USART1之间连接。

接下来开始配置USART1

mark

USART DMA配置

知识小卡片 —— DMA

DMA 全称 Direct Memory Access(直接存储器访问), 是STM32的一个外设,它的特点在于:

不占用CPU的情况下将数据从存储器直接搬运到外设,或者从外设直接搬运到存储器,当然也可以从存储器直接搬运到存储器。

比如在需要串口发送大量数据的时候,CPU只需要发起DMA传输请求,然后就可以去做别的事情了,DMA会将数据传输到串口发送,DMA传输完之后会触发中断,CPU如果有需要,可以对该中断进行处理,这样一来CPU的效率是不是大大提高了?

在STM32L431RCT6中有 2 个 DMA 外设:DMA1 和 DMA2,每个DMA外设有 7 个通道,每个通道都是独立的,配置DMA的时候有几个关键点:

  • 数据从哪里来?
  • 数据到哪里去?
  • 有多少数据?

知识小卡片结束啦~对STM32的DMA外设有没有了解呢?

接下来我们配置DMA,将存储器(SRAM)中的数据直接搬运到串口外设去发送:

mark

配置时钟树

STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

mark

生成工程设置

mark

代码生成设置

最后设置生成独立的初始化文件:

mark

生成代码

点击GENERATE CODE即可生成MDK-V5工程:

mark

3. 在MDK中编写、编译、下载用户代码

定义发送数据区域

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t dat[] = "Hello, I am Mculover666.\n";
/* USER CODE END 0 */

在main函数中发起DMA传输

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit_DMA(&huart1, (uint8_t*)dat, sizeof(dat));
  /* USER CODE END 2 */

  while (1)
  {
  }
}

实验现象

编译下载运行后,实验现象如下:

mark

4. 使用DMA接收串口数据

说明

  • 使用HAL库的时候不能同时使用DMA发送和接收数据,会出错。
  • 所有的步骤和发送时一样,这里我只给出需要修改的部分。

修改串口DMA配置

mark

添加串口接收缓冲区

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t dat[] = "Hello, I am Mculover666.\n";
uint8_t recv_buf[13] = {0};		//串口接收缓冲区
/* USER CODE END 0 */

修改main函数

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit(&huart1, (uint8_t*)dat, sizeof(dat), 0xFFFF);
  HAL_UART_Receive_DMA(&huart1, recv_buf, 13);  //使能DMA接收
  /* USER CODE END 2 */

  while (1)
  {
  }
}

添加串口接收中断回调函数

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
{ 
	//将接收到的数据再发送
	HAL_UART_Transmit(&huart1,recv_buf,13, 0xFFFF);
}
/* USER CODE END 4 */

编译代码

点击如图所示的按钮编译工程

image.png

编译成功

mark

设置下载器

点击如图所示按钮打开设置页面

image.png

进行下载设置,选择“ST-Link Debugger”,并点击“Settings”。
mark
在“Flash Download”菜单下勾选“Reset and Run”选项,已达到烧录程序后单片机自动复位并运行程序的目的。
mark

下载运行

点击"LOAD"按钮即可烧录代码到单片机中。

image.png

烧录成功

mark

实验现象

mark

至此,我们已经学会了如何配置USART使用DMA模式发送数据和接收数据,下一节将讨论实现printf()函数的多种方法。

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

单片机基础——使用USART发送和接收数据(DMA模式) 的相关文章

  • 【vue2】el-table 从接口获取数据改变了,但是页面却没有正常渲染

    方法一 在el table上面添加一个 key 属性 指定一个唯一的值 然后数据改变后 我们更新这个唯一值 这样 Vue 会自动重新渲染该组件 1 获取随机uuid 创建在uuid js文件当中 获取唯一id export function
  • 7月15日---7月21日(计划50小时,实际12小时,还有5258小时)

    本周单位事情应该不算多 没事就在家看看文挡 切忌浮躁 一颗平常心 就当学东西了 业余爱好 就按照DDRAW 软引擎 OSG引擎 自制3D引擎去走 上午PHYSX 中午DDRAW引擎 下午加入GAMEDEMO程序 晚上文挡 周六日文档 擦 最
  • 哪个进程在访问这个恶意域名???

    哪个进程在访问这个恶意域名 背景 信息安全工程师很多时候需要通过某个恶意域名来判断主机失陷情况 恶意域名特征比较明显的 比较容易通过威胁情报找到相关线索 例如fr minexmr com 通过威胁情查询 该恶意域名比较容易判断该主机感染Wa
  • 数据双向绑定

    一 什么是双向绑定 我们先从单向绑定切入单向绑定非常简单 就是把Model绑定到View 当我们用JavaScript代码更新Model时 View就会自动更新双向绑定就很容易联想到了 在单向绑定的基础上 用户更新了View Model的数
  • cocos cretor shader effect-the book of shader-4.二维矩阵

    2D Matrices 二维矩阵 前面章节 TheBookofShader开始 Shaping functions 造型函数 Color 颜色 Shapes 形状 平移 之前的章节我们学习了如何制作一些图形 而如何移动它们的技巧则是借助移动
  • 【设计模式】Chain of Responsibility 责任链式模式

    一 前言 责任链行为模式是行为模式的一种 行为模式涉及到算法和对象间职责的分配 行为模式不仅描述对象或类的模式 还描述它们之间的通信模式 行为模式分为 Template Method 模板方法 和 Interpreter 解析器行为模式 模
  • linux下安装mysql(rpm)方式安装

    前言 在linux中使用rpm安装包安装5以上版本的mysql的都可以参考这个 1 首先下载rpm安装包 要下载两个安装包一个client 一个server 有个镜像做的不错 下载地址mirrors sohu com mysql 进入后找到
  • 虚拟机centos7搭建k8s

    虚拟机centos7搭建k8s 1 踩坑大全 centos7安装的docker后 默认非root用户无法使用 所以需要创建docker组 把当前普通用户加入到组中 这里参考链接 设置docker非root用户正常使用 在给docker配置镜
  • Error creating bean with name ‘sqlSessionFactory‘ 、MySQL启动报错

    今天学习SpringSecurity的时候 选用了springboot 因为公司用的不是boot 所以 boot一直不是很熟悉 在此连接数据库的时候 遇到了一个bug Error creating bean with name sqlSes
  • UR机器人:位姿表示以及相关移动

    博主最近在做强化相关的任务 用到了UR5机械臂 所以本文主要讲述在使用过程中 对于UR机器人位姿的理解 在阅读本文之前 希望大家能够花一点时间读一下我的另一篇博文空间信息与坐标变换 本文如有错误的地方 欢迎大家指正 欢迎讨论 机座和工具 首
  • 麦科捷联合 Mellanox 加速eXtremeDB 集群性能

    2016年7月20日McObject 作为分布式数据库管理系统eXtremeDB 中集群功能的开发者 联合端对端以太网和无限宽带互联方案和服务领先供应商的Mellanox 共同宣布一个基准测试结果 该测试通过集成Mellanox的信息加速器
  • Node-RED配置

    配置文件 可通过配置文件配置Node RED 配置文件在哪 Node RED启动时 会在Node RED用户目录下寻找setting js文件 node red Windows中为系统盘 Users 当前用户 node red 若找不到 将
  • Vue3下pinia的状态管理原理和具体使用示例

    一 Pinia是什么 Pinia在Composition API的设计背景下 以Vuex下一代的构想设计了新的Vue存储状态管理库 Pinia 是一个基于 Vue 3 的状态管理库 它提供了一个可组合的 类型安全的 API 来管理 Vue
  • SpringMVC学习指南(2)

    文章目录 系列文章目录 前言 一 RequestMapping注解 1 1 value属性 1 2 method属性 1 3 params属性 1 4 header属性 1 5 通配符 二 PathVariable 注解 三 REST风格的
  • 安装64位SoildWorks时总是出现无法确定当前的订阅失效日期

    总共会出现两个弹窗信息 弹窗1 安装管理程序无法确定当前的的订阅失效日期 您想重新激活您的许可以更新信息吗 这个弹窗要点击 否 弹窗2 无法决定订阅服务失效日期 您必须使用 这个点击 确定 转载于 https www cnblogs com
  • matlab画对数坐标!

    在很多工程问题中 通过对数据进行对数转换可以更清晰地看出数据的某些特征 在对数坐标系中描绘数据点的曲线 可以直接地表现对数转换 对数转换有双对数坐标转换和单轴对数坐标转换两种 用loglog函数可以实现双对数坐标转换 用semilogx和s
  • 专访《白话区块链》作者蒋勇:学习区块链空谈不如实践

    上周HiBlock区块链社区联合蒋勇老师推出课程 区块链技术概念及智能合约实践 课程上线一天内报名42人 3天时间报名80多人 其中70人通过审核 超额完成第一期招生 为保证学员学习效果 不得已提前关闭报名通道 近几天来 很多学员还在留言问
  • 用C++实现数组切片

    这里写自定义目录标题 用C 实现数组切片 写的一般 权当抛砖引玉了 int slice int arr const int n int a new int n for
  • ubuntu20.4编译AOSP安卓源码(AndroidP android-9.0.0_r9)

    目录 代码下载 安装初始化依赖工具 配置repo工具 配置git信息 初始化仓库 配置编译环境 安装jdk 安装编译依赖 编译 初始化编译环境 选择编译目标 编译源码 启动模拟器 windows和Linux协同工作 遇到的问题解决 安装依赖
  • /etc/sysctl.conf 调优 & 优化Linux内核参数

    from http apps hi baidu com share detail 15652067 http keyknight blog 163 com blog static 3663784020104152407759 http bl

随机推荐

  • vue + video.js 加载多种视频流(HLS、FLV、RTMP、RTSP)

    起因 由于需要在一个项目内接入多种常用的视频流 所以接触到video js 这里就做个记录 框架 vue2 video js videojs contrib hls videojs flvjs es6 videojs flash video
  • 微信小程序支付 java

    话不多说 直接开撸 支付流程步骤 1 首先调用wx login方法获取code 通过code获取openid 2 java后台调用统一下单支付接口 这里会进行第一次签名 用来获取prepay id 3 java后台再次调用签名 这里会进行第
  • 锁升级过程和原理

    目录 同步方法与一般方法字节码对比 对象头中的锁信息 锁升级中涉及的四种锁 锁升级的过程 锁升级过程和原理 同步方法与一般方法字节码对比 public class SynchronizedTest1 public static void m
  • Linux权限详解

    你好 我是史丰源 欢迎你的来访 希望我的博客能给你带来一些帮助 我的Gitee 代码仓库 Linux权限 Shell外壳程序运行原理 Shell 外壳 相当于一层遮蔽内部的保护壳 Linux是一个操作系统 请大家思考一个问题 我们 操作系统
  • pytest参数化实现DDT:读取JSON数据

    JSON JavaScript Object Notation JS 对象简谱 是一种轻量级的数据交换格式 与上一篇文章类似 使用pytest中的pytest mark parametrize 便可实现参数化 代码如下所示 导入json模块
  • conda新建、复制、删除、重命名envs环境

    1 新建环境 conda create n torch python 3 6 这样就创建好了一个名叫torch的python3 6环境 2 复制环境 conda create n new torch clone torch 这样就将torc
  • 【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 LSTM神经网络算法 1 2 PSO算法 1 3 PSO LSTM负荷预测模型 2 运行结果 2
  • pytorch: 转onnx模型

    摘要 onnx Open Neural Network Exchange 主要用于部署 训练一般使用pytorch和tensorflow 等训练完成 我们需要模型转成onnx 用于部署在云或者边缘计算上 而为什么要要转成onnx模型呢 主要
  • vscode CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘.解决

    1 问题出现 已安装anaconda并已添加其环境变量 测试在win cmd中输入conda及相关conda activate命令等都是正常的 但当在vscode中run debug工程py脚本时出现以下错误及提示 2 踩坑记录 1 根据提
  • xterm使用详情

    常用配置项 rendererType dom canvas 渲染器类型 当 canvas 渲染器运行过慢时 会回退为 DOM 渲染器 DOM 渲染器下不起作用的功能 Letter spacing Cursor blin cols numbe
  • word页码怎么从第三页开始设置为第一页_Word小技巧

    在使用word编辑文档或者写论文的时候 会涉及到页码的设置 今天粉笔君就来给大家分享一下如何快速正确的设置页码格式 一 第一页为封面 第二页为目录 从第三页开始编码 1 将鼠标固定到文档第二页的第一个字符前 在菜单栏中单击 布局 选项 找到
  • Java+Servlet+Jsp(el, jstl)+MyBatis的CRUD练习小项目

    1 概述 这篇博客主要是分享一个基于Servlet Jsp el jstl MyBatis的CRUD练习小项目 包括项目的源码 以及项目的逻辑 通过这个项目能够学习Java web中最基础的servlet jsp和mybatis的使用 为后
  • 一篇短文告诉你阿里云用户如何通过等保测评

    随着等保2 0的脚步越来越近 云上等保受到越来越多人的关注 近日在成都举行的云栖大会安全论坛上 牛君特意关注了阿里云云上系统的等保合规方案 阿里云最早于2012年通过 ISO 27001 认证 并于2016年9月通过新的云计算安全等级保护三
  • 点云绪论(点云数据及获取、点云数据处理、常用软件及开源库)

    文章目录 点云数据及获取 点云数据处理 常用软件及开源库 点云数据及获取 定义 点云 point cloud 三维点的数据集合属性 三维坐标 强度 颜色 时间戳 点云组织形式 organized the point cloud is lai
  • BG-20k数据集分析及下载

    包含20000张高清背景图片 包含清晰的对象轮廓 可以用做高质量图像生成的研究 此数据集下载流程繁琐 还需要签保证书获得授权等等 可以联系此人 提供高速下载链接 q 2389411778 备注要bg20k数据集
  • centos7 ping: www.baidu.com: Name or service not known

    转自 https www cnblogs com maowenqiang articles 7727910 html root www ping www baidu comping www baidu com Name or service
  • RPC介绍+原理

    RPC 远程过程调用 它是一种通过网络从远程计算机程序上请求服务 而不需要了解底层网络技术的协议 RPC协议假定某些传输协议的存在 如TCP或UDP 为通信程序之间携带信息数据 在OSI网络通信模型中 RPC跨越了传输层和应用层 RPC采用
  • spingboot热部署,实现jsp页面时时刷新

    SpringBoot默认不支持JSP的实时更新 目前有两种解决方案 解决方法1 在配置文件 手工开启实时编译JSP的功能 application yml 配置如下 server jsp servlet init parameters dev
  • 双目标定(三)标定流程(含矫正)

    1 原理 参见单目标定基本原理 2 采集 2 1标定板的制作 大小 应当使得标定板在图像中占比尽可能大一些 占图像长度比例应当超过1 3 如果实在无法保证标定板占图像比例比较大如果占比比较小 则需要尽可能多采集一些图像 平 标定板应当尽可能
  • 单片机基础——使用USART发送和接收数据(DMA模式)

    1 准备工作 硬件准备 开发板 首先需要准备一个小熊派IoT开发板 并通过USB线与电脑连接 2 生成MDK工程 选择芯片型号 打开STM32CubeMX 打开MCU选择器 搜索并选中芯片STM32L431RCT6 配置时钟源 如果选择使用