stm32——hal库学习笔记(DMA实验)

一、DMA介绍(了解)

在这里插入图片描述

二、DMA结构框图介绍(熟悉)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、DMA相关寄存器介绍(熟悉)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、DMA相关HAL库驱动介绍(掌握)

在这里插入图片描述
在这里插入图片描述

五、DMA配置步骤(掌握)

在这里插入图片描述

六、编程实战(掌握)

在这里插入图片描述
dma.c

#include "./BSP/DMA/dma.h"
#include "./SYSTEM/delay/delay.h"DMA_HandleTypeDef  g_dma_handle;            /* DMA句柄 */
extern UART_HandleTypeDef g_uart1_handle;   /* UART句柄 *//*** @brief       串口TX DMA初始化函数*   @note      这里的传输形式是固定的, 这点要根据不同的情况来修改*              从存储器 -> 外设模式/8位数据宽度/存储器增量模式** @param       dmax_chy    : DMA的通道, DMA1_Channel1 ~ DMA1_Channel7, DMA2_Channel1 ~ DMA2_Channel5*                            某个外设对应哪个DMA, 哪个通道, 请参考<<STM32中文参考手册 V10>> 10.3.7节*                            必须设置正确的DMA及通道, 才能正常使用! * @retval      无*/
void dma_init(DMA_Channel_TypeDef* DMAx_CHx)
{if ((uint32_t)DMAx_CHx > (uint32_t)DMA1_Channel7)     /* 大于DMA1_Channel7, 则为DMA2的通道了 */{__HAL_RCC_DMA2_CLK_ENABLE();                      /* DMA2时钟使能 */}else {__HAL_RCC_DMA1_CLK_ENABLE();                      /* DMA1时钟使能 */}__HAL_LINKDMA(&g_uart1_handle, hdmatx, g_dma_handle);           /* 将DMA与USART1联系起来(发送DMA) *//* Tx DMA配置 */g_dma_handle.Instance = DMAx_CHx;                               /* USART1_TX使用的DMA通道为: DMA1_Channel4 */g_dma_handle.Init.Direction = DMA_MEMORY_TO_PERIPH;             /* DIR = 1 , 存储器到外设模式 */g_dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;                 /* 外设非增量模式 */g_dma_handle.Init.MemInc = DMA_MINC_ENABLE;                     /* 存储器增量模式 */g_dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;    /* 外设数据长度:8位 */g_dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;       /* 存储器数据长度:8位 */g_dma_handle.Init.Mode = DMA_NORMAL;                            /* DMA模式:正常模式 */g_dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;               /* 中等优先级 */HAL_DMA_Init(&g_dma_handle);
}

dma.h

#ifndef __DMA_H
#define	__DMA_H#include "./SYSTEM/sys/sys.h"void dma_init(DMA_Channel_TypeDef* DMAx_CHx);#endif

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/DMA/dma.h"const uint8_t TEXT_TO_SEND[] = {"正点原子 STM32 DMA 串口实验"};  /* 要循环发送的字符串 */
#define SEND_BUF_SIZE       (sizeof(TEXT_TO_SEND) + 2) * 200    /* 发送数据长度, 等于sizeof(TEXT_TO_SEND) + 2的200倍. */uint8_t g_sendbuf[SEND_BUF_SIZE];           /* 发送数据缓冲区 */
extern DMA_HandleTypeDef  g_dma_handle;     /* DMA句柄 */
extern UART_HandleTypeDef g_uart1_handle;   /* UART句柄 */int main(void)
{uint8_t  key = 0;uint16_t i, k;uint16_t len;uint8_t  mask = 0;float pro = 0;          /* 进度 */HAL_Init();                             /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */delay_init(72);                         /* 延时初始化 */usart_init(115200);                     /* 串口初始化为115200 */led_init();                             /* 初始化LED */lcd_init();                             /* 初始化LCD */key_init();                             /* 初始化按键 */dma_init(DMA1_Channel4);                /* 初始化串口1 TX DMA */lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);lcd_show_string(30, 70, 200, 16, 16, "DMA TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY0:Start", RED);len = sizeof(TEXT_TO_SEND);k = 0;for (i = 0; i < SEND_BUF_SIZE; i++) /* 填充ASCII字符集数据 */{if (k >= len)   /* 入换行符 */{if (mask){g_sendbuf[i] = 0x0a;k = 0;}else{g_sendbuf[i] = 0x0d;mask++;}}else     /* 复制TEXT_TO_SEND语句 */{mask = 0;g_sendbuf[i] = TEXT_TO_SEND[k];k++;}}i = 0;while (1){key = key_scan(0);if (key == KEY0_PRES)       /* KEY0按下 */{printf("\r\nDMA DATA:\r\n");lcd_show_string(30, 130, 200, 16, 16, "Start Transimit....", BLUE);lcd_show_string(30, 150, 200, 16, 16, "   %", BLUE);    /* 显示百分号 */HAL_UART_Transmit_DMA(&g_uart1_handle, g_sendbuf, SEND_BUF_SIZE);/* 等待DMA传输完成,此时我们来做另外一些事情,比如点灯  * 实际应用中,传输数据期间,可以执行另外的任务 */while (1){if ( __HAL_DMA_GET_FLAG(&g_dma_handle, DMA_FLAG_TC4))   /* 等待 DMA1_Channel4 传输完成 */{__HAL_DMA_CLEAR_FLAG(&g_dma_handle, DMA_FLAG_TC4);HAL_UART_DMAStop(&g_uart1_handle);                  /* 传输完成以后关闭串口DMA */break;}pro = __HAL_DMA_GET_COUNTER(&g_dma_handle); /* 得到当前还剩余多少个数据 */len = SEND_BUF_SIZE;        /* 总长度 */pro = 1 - (pro / len);      /* 得到百分比 */pro *= 100;                 /* 扩大100倍 */lcd_show_num(30, 150, pro, 3, 16, BLUE);} lcd_show_num(30, 150, 100, 3, 16, BLUE);    /* 显示100% */lcd_show_string(30, 130, 200, 16, 16, "Transimit Finished!", BLUE); /* 提示传送完成 */}i++;delay_ms(10);if (i == 20){LED0_TOGGLE();  /* LED0闪烁,提示系统正在运行 */i = 0;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…

大概了解一下G1收集器

在上一篇文章中&#xff08;链接&#xff1a;大概了解一下CMS收集器&#xff09;我们提到&#xff0c;CMS是一种主要针对旧生代对象进行回收的收集器。与CMS不同&#xff0c;G1号称“全功能的垃圾收集器”&#xff0c;对初生代内存和旧生代内存均进行管理。鉴于此&#xff0c;这…

ubuntu虚拟机与windows之间实现复制粘贴功能

1.首先卸载ubuntu中已有的vm-tools工具 sudo apt-get autoremove open-vm-tools 2.安装open-vm-tools sudo apt-get install open-vm-tools #安装open-vm-tools sudo apt-get install open-vm-tools-desktop 3.重启ubuntu虚拟机

pyspark分布式部署随机森林算法

前言 分布式算法的文章我早就想写了&#xff0c;但是一直比较忙&#xff0c;没有写&#xff0c;最近一个项目又用到了&#xff0c;就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程&#xff0c;写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…

成功解决ModuleNotFoundError: No module named ‘cv2’

&#x1f525; 成功解决ModuleNotFoundError: No module named ‘cv2’ &#x1f525; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 …

中间件-Nginx漏洞整改(限制IP访问隐藏nginx版本信息)

中间件-Nginx漏洞整改&#xff08;限制IP访问&隐藏nginx版本信息&#xff09; 一、限制IP访问1.1 配置Nginx的ACL1.2 重载Nginx配置1.3 验证结果 二、隐藏nginx版本信息2.1 打开Nginx配置文件2.2 隐藏Nginx版本信息2.3 保存并重新加载Nginx配置2.4 验证结果2.5 验证隐藏版本…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录&#xff0c;然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

Jenkins 中针对视图分组(11)

一、将没有在视图的项目进行归纳操作&#xff1b; 新增的项目规则&#xff0c;并入到某就一个视图中&#xff0c;但常规是设置一个规则&#xff0c;后续按照规则走&#xff0c;就不用单独设置 1、首先到控制台页面&#xff0c;如果没有视图分组就点击加号新增&#xff1b;已存在…

JavaScript异步编程

回调地狱 回调地狱是一种由于过度使用嵌套回调函数而导致的代码结构不清晰、难以理解和维护的问题。一个典型例子是嵌套多个回调函数&#xff0c;每个回调函数都作为另一个回调函数的参数。这样会导致各个部分之间高度耦合、程序结构混乱、流程难以追踪&#xff0c;每个任务只能…

PowerShell入门:掌握基本的输入输出命令

PowerShell入门&#xff1a;掌握基本的输入输出命令 本文将深入探讨PowerShell中的基本输入输出命令&#xff0c;以及如何使用这些命令来简化日常任务。 PowerShell的基本概念 在深入了解输入输出命令之前&#xff0c;让我们先快速了解一下PowerShell的一些基本概念。PowerS…

详解顺序结构滑动窗口处理算法

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

modelValue实现组件的双向数据绑定

modelValue modelValue是Vue.js 3.x中的一个重要概念&#xff0c;用于实现组件的双向数据绑定。当在父组件中使用v-model指令绑定一个子组件时&#xff0c;子组件需要声明一个modelValue属性来接收这个绑定值。同时&#xff0c;子组件还需要通过$emit方法触发一个名为update:m…

普通jar和SpringBootjar的区别

普通的 JAR&#xff08;Java Archive&#xff09;文件是一种压缩文件格式&#xff0c;它通常用于打包 Java 类文件、资源文件和其他相关文件。这些 JAR 文件可以包含任何类型的 Java 代码&#xff0c;并且可以由任何 Java 虚拟机&#xff08;JVM&#xff09;运行。普通的 JAR 文…

【2024】TCP、UDP和 HTTP 的区别是?

前言 作为前端开发者&#xff0c;理解TCP、UDP和HTTP这三种基本协议的区别和应用&#xff0c;对于构建高效、可靠的Web应用至关重要。本文将通过深入浅出的解释和实际的例子&#xff0c;帮助你掌握这些基础知识。 核心对比 TCP和UDP都是传输层协议&#xff0c;它们的主要区别…

性能优化问题思考总结

INP 是什么&#xff1f; Interaction to Next Paint (INP) INP是一项指标&#xff0c;通过观察用户在访问网页期间发生的所有点击、点按和键盘互动的延迟时间&#xff0c;评估网页对用户互动的总体响应情况。 互动是指在同一逻辑用户手势期间触发的一组事件处理脚本。例如&a…

龙蜥OS 尝试

> 尝试一下龙蜥OS&#xff0c;和Centos8应该没什么区别。 阿里云版本龙蜥 https://alinux3.oss-cn-hangzhou.aliyuncs.com/aliyun_3_x64_20G_nocloud_alibase_20230727.vhd Index of /anolis/8.8/isos/GA/x86_64/ (openanolis.cn) 网卡 我在虚拟机上安装完后&#xff0c;…

[Python进阶] 混合编程

2.22 混合编程 2.22.1 什么是混合编程 所谓的混合编程就是指在一个大型项目中&#xff0c;因为要涉及到多个方面&#xff0c;单独使用某一种语言进行开发已经不能满足要求&#xff0c;可能在某一个模块中&#xff0c;需要用A语言编写一部分&#xff0c;而用B语言编写另外的部…

SpringBoot使用classfinal-maven-plugin插件加密Jar包

jar包加密 1、在启动类的pom.xml中加入classfinal-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><…

算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)

算法沉淀——动态规划之子数组、子串系列 01.最大子数组和02.环形子数组的最大和03.乘积最大子数组04.乘积为正数的最长子数组长度 01.最大子数组和 题目链接&#xff1a;https://leetcode.cn/problems/maximum-subarray/、 给你一个整数数组 nums &#xff0c;请你找出一个具…

计算机设计大赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…