调试笔记2SPI+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);
粘一个我轮询里用到的:
这个传输完成标志需要程序清除,不然第一次传输完成后便一直是传输完成。
库函数里也有传输过半标志,传输出错标志。我没有使用就不粘了,感兴趣自行测试。
刚刚上班,欢迎交流。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgjkjik
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13