调试笔记2:SPI+DMA

一、内容简介

说明:关于DMA,SPI的基本知识这里不做介绍。本文只讲述SPI+DMA的实现。这里仅实现从外设到内存。从内存到外设也可以参考修改。

目的:使用STM32作为SPI从机接收数据,使用DMA将SPI中接收的数据直接存入设置好的内存区。

外设:SPI。

DMA传输方向:外设到内存。

二、代码编写流程

1.SPI初始化函数

(1)先上代码:

 (2)代码编写说明

第一步,开启外设时钟,RCC_APB2PeriphClockCmd();

第二步,初始化对应IO口,GPIO_Init();

第三步,配置SPI中断的优先级,不使用可以不配置,我就没使用,忘删了(手动狗头)

第四步,SPI初始化

2.DMA初始化函数

(1)代码

 (2)说明

几个重要的,需要根据自己实际情况设置:外设基地址(spi就是这个dr寄存器地址)、内存基地址(想存在哪个数组,就粘过来)、数据传输方向、工作模式。其他的根据实际情况再说。

关于工作模式,如果只接收一次,可以选择单次模式。如果是多次且每次接收数据长度一致,可以用循环模式。如果是多次不定长,使用单次模式,每次接收完开启下一次接收并配置接收长度。

3.调用

配置完初始化函数便可以在轮询前调用他们。

 USER_SPI_Init();//SPI初始化

SPI_DMA_Config();//DMA初始化

SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE); //使能spi1 dma接收

DMA_Cmd(DMA1_Channel2, ENABLE);//使能dma1通道2

为什么是dma1通道2?见参考手册,自己去查。

到这里SPI+DMA已经可以工作了,只要从SPI接收到数据,DMA便可以将此存入内存。其他地方仅需访问该内存,便可获取SPI接收到的数据。

4.如何判断数据是否传输完成?

DMA_GetFlagStatus(DMA1_FLAG_TC2);

粘一个我轮询里用到的:

这个传输完成标志需要程序清除,不然第一次传输完成后便一直是传输完成。

库函数里也有传输过半标志,传输出错标志。我没有使用就不粘了,感兴趣自行测试。

刚刚上班,欢迎交流。

 

  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不做拖延王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值