STM32使用SPI+DMA(标准库)

这篇具有很好参考价值的文章主要介绍了STM32使用SPI+DMA(标准库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DMA

DMA原理

DMA通道资源分配

SPI+DMA配置

主函数编写如下


DMA原理

STM32使用SPI+DMA(标准库)

1.CPU配置好DMA。

2.SPI发出DMA请求。(在DMA_Mode_Normal模式下,该请求实际上需要CPU命令SPI发出请求)

3.若该通道有多个请求,DMA控制器通过仲裁器判断,根据配置的优先级,选择先回应该通道高优先级的请求,再回应低优先级的请求。(此过程不需要CPU参与)

4.DMA控制器回应请求后,自动根据配置,进行数据传输。(此过程不需要CPU参与)

DMA请求CPU释放总线,当DMA传输完成后,DMA归还总线给CPU


DMA通道资源分配

DMA1通道

STM32使用SPI+DMA(标准库)

 DMA2通道

STM32使用SPI+DMA(标准库)


SPI+DMA配置

既然使用的是SPI+DMA,必定要使能SPI,详细请参考

SPI配置

配置完SPI后,配置DMA,如下

void dma_init(unsigned int SendBuff,unsigned int buffer_size)
{
 
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_DeInit(DMA1_Channel3);
/*DMA配置*/

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
//SPI数据寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff; 
//内存地址(要传输的变量的指针)
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 
//方向(从内存到外设)
//DMA_DIR_PeripheralSRC为从外设到内存
DMA_InitStructure.DMA_BufferSize = buffer_size; 
//传输内容的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
//外设地址不增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 
//内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte ; 
//外设数据单位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte ; 
//内存数据单位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; 
//DMA模式:一次传输
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium ; 
//优先级:高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 
//禁止内存到内存的传输
 
DMA_Init(DMA1_Channel3, &DMA_InitStructure); 
//配置DMA1的3通道
DMA_Cmd(DMA1_Channel3, ENABLE);       //使能DMA
}

注意:DMA_PeripheralBaseAddr不是SPI外设的地址,而是SPI1->DR即SPI数据寄存器的地址

因为DMA_Mode_Normal模式使用一次后DMA_BufferSize会清零,如下代码用于重置DMA_BufferSize文章来源地址https://www.toymoban.com/news/detail-502081.html

void DMA_Buffercounter_reset(unsigned int buffer_size)
{ 
	DMA_Cmd(DMA1_Channel3, DISABLE );     
//失能DMA,使得DMA_SetCurrDataCounter能够使用
 	DMA_SetCurrDataCounter(DMA1_Channel3,buffer_size); 
//一次传输模式,DMA_BufferSize执行一次后会清零
//后续需要重复传输的时候,需要使用该函数再次设置DMA_BufferSize
 	DMA_Cmd(DMA1_Channel3, ENABLE);       
//使能DMA
}	

主函数编写如下

#define buff_size 256
unsigned char sendbuff[buff_size];

int mian(coid)
{
    dma_init((unsigned int)sendbuff,buff_size);
    while(1)
    {
        for(i=0 ;i<buff_size;i++)
		{
          sendbuff[i]=color;
		}
		for(i = 0 ; i<(32768/buff_size); i++)
		{
			
		  SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); 
          //SPI向DMA发出请求,DMA会通过仲裁器自动回应请求 
		  DMA_Buffercounter_reset(buff_size);
          //重置DMA_BufferSize,为下一次DMA传送做好准备
		
		    while(1)
			{
				if(DMA_GetFlagStatus(DMA1_FLAG_TC3)!=RESET)//判断DMA是否传输完成
						{
							DMA_ClearFlag(DMA1_FLAG_TC3);//DMA传输完成,清除标志位
							break; 
						}
			}
		} 
    }

}

到了这里,关于STM32使用SPI+DMA(标准库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32-单通道ADC采集(DMA读取)实验

    关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。 我们通过下表可以知道DMA1通道

    2024年02月16日
    浏览(56)
  • STM32CubeMX配置-ADC多通道配置(DMA) (STM32G070)

    一、写在前面         ADC通道采集数据的两种方式:         1)ADC轮询采集数据直接放到数组中;         2)采用中断方式,ADC采集完成进入中断,中断关闭ADC采集,取数据之后再打开ADC采集。 以下按第一种方式实现: 二、ADC多通道配置 1)配置通道及参数     如果要控

    2024年02月05日
    浏览(53)
  • STM32F407 ADC多通道采样+DMA

    我加入工作室参加的第一个比赛是第五届中国高校智能机器人创意大赛,我参加的赛项是开放部件组轮式自主格斗机器人。经历了没日没夜的调试,无数次欣赏凌晨四点半的夜晚,感受着每天就睡两三个小时伴随着疲惫的开心。在我和队友的共同努力之下,我们的成绩也很优

    2024年02月02日
    浏览(68)
  • 【正点原子STM32连载】第三十五章 多通道ADC采集(DMA读取)实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章介绍APM32E103的DMA进行多通道的ADC采集。通过本章的学习,读者将学习到DMA、ADC的使用。 本章分

    2024年01月24日
    浏览(52)
  • [HAL]STM32 SPI+DMA驱动WS2812

    该程序是纯手敲,非Cube生成!所有代码均注释。 源码在文章后面获取 Keyword: 单线通讯、归零码、Reset、RGB顺序 RGB一共有24bit位 -相当于驱动一个灯要24bit位 -驱动若干个灯要24* n bit位,通过Reset码决定数据终止(保持) 24bit位应该如何发送? 可见: 表示低电平需要 T0H和T0L的配

    2024年02月09日
    浏览(53)
  • STM32-微项目10-ADC多通道采集+DMA数据转移

    一、微项目实现目标: 由于ADC多通道采集在规则组中只有一个寄存器CR,实际上在多通道采集时刻,需要把每一个同都的数据及时传出,否则上一个通道的数据会被当前通道的数据给覆盖掉。 二、微项目硬件配置需求:  stm32F103C8T6核心板一块 0.96寸OLED显示,用于显示计数 三

    2024年02月16日
    浏览(65)
  • STM32初学入门笔记(3):STM32CubeMX配置STM32实现多通道ADC+DMA读取模拟量

    模拟信号的读取是我们在做很多项目是都要用到的,而模拟量的读取就要依赖于ADC数模转换器。对于初学者,学习使用ADC可以很大的帮助以后的STM32学习。 目录 ADC简介 : DMA简介:  工程开始: STM32CubeMX配置区: 配置外部时钟: 配置调试: 配置ADC: 配置DMA: 配置串口: 配

    2024年02月09日
    浏览(50)
  • STM32 硬件SPI+DMA实现快速刷TFT屏

    首先在TB上找一块SPI驱动的彩屏,下载商家提供的示例 例如我买的一款2.8寸SPI的TFT彩屏,商家提供的资料很齐全,模拟SPI和硬件SPI驱动的程序都有 打开硬件SPI驱动的工程,商家提供的代码是SPI2驱动,想换成其他的SPI可以到SPI.c文件中更改 打开main.c,测试一下简单颜色填充刷

    2024年04月15日
    浏览(63)
  • STM32CubeMx实现ADC多通道+DMA读取(HAL库)

    目录 一、实验结果  二、STM32CubeMx配置 三、main.c测试代码 1、RCC配置 (外部晶振选择8MHz。设置相应的分频器M=8,倍频器倍频系数N=336,分频器分频系数P=2,那么主PLL生成的第一个输出高速时钟PLLP为:168MHz)  2、SYS配置  3、ADC(规则)通道配置(独立模式,预分频4分频,1

    2024年02月15日
    浏览(55)
  • STM32学习笔记(九)丨DMA直接存储器存取(DMA数据转运、DMA+AD多通道转换)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包