GD32f103系列教程—(SPI DMA方式软件实现篇)

news2024/11/15 8:30:39

DMA知识简介:

DMA 控制器提供了一种硬件的方式在外设和存储器之间或者存储器和存储器之间传输数据,而无需 CPU 的介入,从而使 CPU 可以专注在处理其他系统功能上。

项目中需要采用DMA方式传输数据的原因:如果仅仅采用SPI接口进行寄存器通信,那么大可不必采用DMA通信,直接让CPU利用SPI接口通信即可。但是项目中往往会出现传输大量的数据包的情况,此时直接传输和以DMA传输的时间上的差异就体现出来了,并且采用直接传输的时候由于MCU需要不停的搬运数据,因此在传输的两帧数据中间会有很大的延时,导致传输效率极低。而采用DMA方式情况进行传输的话,每个数据帧之间的延时极低。

该图展示的就是采用直接传输的方式所截取的spi通信过程,中间有很大的延时。

该图为SPI采用DMA通信方式的SPI的波形图

程序分析

第一步:配置SPI的基本功能,可以参考GD32f103系列教程—(SPI非DMA方式软件实现篇)

第二步:配置DMA的功能

查看GD32F10x 用户手册,找到DMA那节,可以看出,如果我们想采用SPI0发送数据,则需要配置SPI0 TX端为DM0 的通道2

所以,首先,配置DMA的时钟,然后配置DMA的一些功能,比如存储器的宽度,传输方向,内存的宽度等

void hal_dma_spi0_config(u8_t *sram_buffer, u16_t sram_buffer_legth)

{

    rcu_periph_clock_enable(RCU_DMA0); // 使能dma0的时钟

    dma_parameter_struct dma_init_struct;

    // 停用DMA0的DMA_CH2通道

    dma_deinit(DMA0, DMA_CH2);

    // 配置DMA初始化结构体

    dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);  // 配置外设地址为SPI0数据寄存器地址

    dma_init_struct.memory_addr = (uint32_t)sram_buffer;      // 配置存储器地址为sram_buffer的地址

    dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;     // 配置传输方向为存储器到外设

    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;     // 配置存储器宽度为8位

    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; // 配置外设宽度为8位

    dma_init_struct.priority = DMA_PRIORITY_LOW;              // 配置DMA优先级为低

    dma_init_struct.number = sram_buffer_legth/2;               // 配置传输数据个数,这里应根据实际情况填写

    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; // 禁止外设地址增量

    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;  // 允许存储器地址增量

    // 初始化DMA0的DMA_CH2通道

    dma_init(DMA0, DMA_CH2, &dma_init_struct);

    // 配置DMA模式

    dma_circulation_disable(DMA0, DMA_CH2);      // 禁止循环模式

    dma_memory_to_memory_disable(DMA0, DMA_CH2); // 禁止内存到内存模式

}

第三步:配置DMA传输启动

在需要传输数据的时候调用此函数,此时DMA模块会自动的将数据传输完成,知道检测到DMA CH2通道传输完成。

u8_t hal_dma_spi0_start_transmit()

{

    /* SPI0_Tx DMA channel */

    dma_channel_enable(DMA0, DMA_CH2);

    spi_dma_enable(SPI0, SPI_DMA_TRANSMIT);

    /* wait DMA transmit completed */

    while (!dma_flag_get(DMA0, DMA_CH2, DMA_FLAG_FTF))

    {

    }

    return _SUCCESS;

}

完整程序关注微信公众号“软件喵”回复GD32F103SPIDMA

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

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

相关文章

vue2项目vue-qrcode-reader 扫一扫二维码插件

vue2项目 vue-qrcode-reader 扫一扫二维码插件 问题所在解决办法成功展示 问题所在 今天在引导师弟做扫二维码功能,发现通过npm install --save vue-qrcode-reade安装死活就是报错TypeError: Object...) is not a function 解决办法 百度了很多大牛的博客&#…

【深度学习目标检测】三、基于深度学习的人物摔倒检测(python,yolov8)

深度学习目标检测方法则是利用深度神经网络模型进行目标检测,主要有以下几种: R-CNN系列:包括R-CNN、Fast R-CNN、Faster R-CNN等,通过候选区域法生成候选目标区域,然后使用卷积神经网络提取特征,并通过分类…

【高效开发工具系列】DataGrip入门

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

数据分享 I 全国市级商品房屋销售数据,shp/excel格式,2005-2020年数据

基本信息. 数据名称: 全国市级商品房屋销售数据 数据格式: Shp、excel 数据时间: 2005-2020年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1spxse商品房销售额(亿元&#xf…

主卧卫生间门对着床,怎么设计才能让你好好睡觉呢?福州中宅装饰,福州装修

主卧卫生间门对着床,一抬眼就能和卫生间来一个对视,心里很膈应,那么怎么解决这个问题呢? 1️⃣门改方向 首先,你可以考虑把卫生间门的开门方向改一下。如果卫生间门是向外开的,你可以考虑把门换成向内开的…

吴恩达《机器学习》12-4-12-5:核函数 1、核函数 2

一、核函数 1 1. 多项式模型的局限性 在之前的学习中,了解到可以使用多项式模型来解决无法用直线进行分隔的分类问题。例如,对于判定边界的建模,可能会使用类似于以下形式的模型: 然而,这样的多项式模型在实际应用中…

ALV动态GUI标题

导语:快两个月没有分享内容了,积攒了一大堆,最近经历了一些变动,有些充实和忙碌,最近在做的客制化平台中,顾问需要在不同的按钮对应的ALV中,展示不同的GUI标题。 效果图: 实现方法&a…

大模型概述

文章目录 大模型语言大模型视觉大模型多模态大模型 大模型 所谓 大:模型结构大, 参数量大,训练数据量大 大模型包含数十亿个参数,模型大小可以达到数百GB甚至更大。这种巨大的模型规模为其提供了强大的表达能力和学习能力多任务…

网络安全——SQL注入实验

一、实验目的要求: 二、实验设备与环境: 三、实验原理: 四、实验步骤: 五、实验现象、结果记录及整理: 六、分析讨论与思考题解答: 七、实验截图: 一、实验目的要求: 1、…

【DC-DC】世微 AP9166 降压恒压芯片 18V 2A同步降压转换器

600KHz,18V,2A同步降压转换器 概述 AP9166是一款完全集成的效率2A同步整流降压转换器。AP9166运行在宽输出电流上以高效率 负载范围。此设备提供两个操作模式、PWM控制和PFM模式切换控制,允许更宽范围的高效率 负载AP9166至少需要现成标准的…

亲测好用的国内AI绘画工具TOP榜,中文输入,新手友好!

“如果不想被AI工具替代,那就先成为用好工具的人。” 最近AI绘画也是大火,上次给大家整理了9款国内实用的AI工具,很多小伙伴就私信我能不能整理一下关于国内可用的AI绘画工具,因为现在最火的AI绘画工具Midjourney和Stable Diffus…

换内核ubuntu

grep menuentry /boot/grub/grub.cfg我要使用第三个(索引从0开始,所以是第二个) 可以使用vi编辑(很麻烦) i变为插入模型 esc变为普通模型 :x删除单个字符,dd删除一行,:wq保存并退出 更新文件…

ArkTS 任务统计页面

我们继续学习使用ArkTS实现一个任务进度的统计功能。 1.公共的组件、样式 class Task{static id: number 1// 任务名称name: string 任务${Task.id}// 任务状态: 是否完成finished: boolean false }// 统计的卡片样式 Styles function card(){.width(95%).padding(20).backg…

c#按照时间进行数据存储(不用数据库)

概要介绍 按照日期生成文件夹,按照时间生成文件名,存储字符串。 可以用于简单数据记录(如果数据存储考虑格式文本,保存为csv格式) 实现效果 调用方法 SaveText.saveStr("测试字符串"DateTime.Now.ToStrin…

LeetCode 2132. 用邮票贴满网格图:二维前缀和 + 二维差分

【LetMeFly】2132.用邮票贴满网格图:二维前缀和 二维差分 力扣题目链接:https://leetcode.cn/problems/stamping-the-grid/ 给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据&…

关于git clone速度极慢的解决方法

!!!!前提条件:得有一个可靠且稳定的梯子,如果没有接下来的就不用看了 前言:我在写这篇文章前,也搜索过很多相关git clone速度很慢的解决方法,但是很多很麻烦&#xff0c…

系统规划与管理师和信息系统项目管理师哪个好考?

软考系统规划与管理师和信息系统项目管理师是软考中备受关注的两个证书。这两个证书的相关知识领域广泛,对于从事IT行业的人们来说,都具有相当的吸引力。那么,对于考生而言,究竟哪个证书更适合呢?接下来,我…

MQTT 介绍与学习 —— 筑梦之路

之前写过的相关文章: MQTT协议(转载)——筑梦之路_mqtt url-CSDN博客 k8s 部署mqtt —— 筑梦之路-CSDN博客 CentOS 7 搭建mqtt服务——筑梦之路_腾讯云宝塔搭 centos 7.9.2009 x86_64 建标准mqtt服务器-CSDN博客 mqtt简介 MQTT&#xff…

NV040D语音芯片应用于取暖桌:智能语音提高用户体验

科技与生活的结合,是科技发展的展示。天气的降温,取暖桌越来越取得用户的心,时至今日传统的取暖桌已经没有办法满足用户的需求,智能语音取暖桌给用户的生活带来了不一样的体验。 NV040D语音芯片是一款性能稳定的芯片,拥…

strtok()的用法及实现哦

1. 用法 1. 声明:char *strtok(char *str, const char *delim) str -- 要被分解成一组小字符串的字符串。第一次调用 strtok() 时,这个参数应该是你想要分割的字符串。随后的调用应该将此参数设置为NULL,以便继续从上次的位置分割。delim -- …