最近被 ESP8266 的设计整崩溃了, 一个半的 串口 真的 坑。 为了让 我毕设中的 ESP8266 和 Stm32F4 单片机进行数据传输,我需要找到一种除了 串口意外的 通讯方式(吐槽一下,要是用串口的话 真的太简单啊) 最终我盯上了 SPI 的协议 所以就有这个博客。 这是我的 一个试验程序。
声明一下 这个博客中的主要代码不是我写的,是我在网上找到的 原作者是
在这里向原作者致敬,如果您不希望我写这个博客 那么请联系我。 我这里只是分享一下代码的思路(我的代码做了一定的自己的修改)
这是GPIO的 初始化部分,其中的PA4是NSS 引脚 这里我使用的是软件NSS所以就单独配置一下输出
手册中的引脚复用在这里
这一部分是SPI的参数设置,都是一些基本的参数就不去介绍了
这是实际测试的速度
这个是DMA 的配置部分也是整个程序的精华所在主要就是设置了一些 DMA 的基本参数,后面的注释是我跟据意思加的
这是DMA双工发送的代码同时进行收和发
这是原本的代码 相比我的多了一个设置 存储器地址的自增这部分应该是不需要的
写这篇博客主要是给自己以后一个参考, ESP8266 的 通讯还是不好解决的 。
如果用SPI 协议的话 还是需要一个主机 一个从机 而 ESP8266 做 从机比较难做
关键字:Stm32F407 SPI1 全双工 DMA 收发数据
引用地址:
Stm32F407 SPI1 全双工DMA 收发数据
推荐阅读最新更新时间:2024-11-13 10:26
STM32F407时钟设置
这里我们写一个RCC配置函数来说明各函数的用途,其中HSE = 8MHz。 /** * @说明 配置STM32F407的时钟系统 * @参数 无 * @返回 无 * @说明 void Clock_Config(void) 按如下表格配置时钟 * *================================================================== * Supported STM32F4xx device revision | Rev A *------------------------------------------------------------------
[单片机]
浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)
引子 STM32的硬件I2C很多人都对它望而却步。因为很多电工都说,STM32 硬件 I2C有BUG、不稳定、死机等等……最后都使用GPIO模拟I2C。 的确,模拟I2C好用。但是在我看来在一个72M的Cortex-M3的MCU上这样做非常不妥。一般来说I2C是一种慢速总线,就算工作在400kHz的快速模式上,I2C传送每个字节仍需要至少23us——还没有计算地址、起始信号和结束信号的发送。如果使用GPIO模拟的I2C,这23us的CPU时间都在空转中浪费了,而这23us已经可以做不少的事情了,所以在STM32上I2C还是使用硬件为佳——虽然它多多少少有点缺陷。 这篇文章不是给完全没有接触过STM32 硬件I2C的新手看的,看这篇
[单片机]
stm32 DMA 的 buffersize 意义与设置
总结一下: 我的理解是一次传输多个数据,不管你的数据是8位,16位还是32位,也就相当于你接收数据部分缓存的数据量。buf ,就是这个bufe_size。 1.看库函数中 DMAy_Channelx- CNDTR = DMA_InitStruct- DMA_BufferSize; 而CNDTR即数据传输数量 (Number of data to transfer) 数据传输数量为0至65535。这个寄存器只能在通道不工作(DMA_CCRx的EN=0)时写入。通 道开启后该寄存器变为只读,指示剩余的待传输字节数目。寄存器内容在每次DMA传输后递 减。 数据传输结束后,寄存器的内容或者变为0;或者当该通道配置为自
[单片机]
【stm32f407】SD协议(一)-SDIO
SDIO简介 1.SDIO主要功能及框图 STM32F4的SDIO控制器支持多媒体卡(MMC卡)、SD存储卡、SD I/O卡和CE-ATA设备等。SDIO的主要功能如下: 1)与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。 2)与较早的多媒体卡系统规格版本全兼容(向前兼容)。 3)与SD存储卡规格版本2.0全兼容。 4)与SD I/O卡规格版本2.0全兼容:支持良种不同的数据总线模式:1位(默认)和4位。 5)完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。 8位总线模式下数据传输速率可达48MHz(分频器旁路时)。 6)数据和命令输出使
[单片机]
stm32 dma方式发脉冲做位置控制
考虑到现有板子上没有fpga,对于dma方式发脉冲做位置控制设计如下 两个buff short buff1 ; short buff2 ; 里面都存放频率值,也就是说arp寄存器的值。 数组的长度为1000,是考虑到最高的脉冲频率,如果最大频率比较小,则可以适当减少数组的大小,之所以定义两个buff,是考虑到每个伺服周期计算填充一个buff,同时另一个buff就作为当前dma之用,每个伺服周期结束的时候会停止dma,然后统计已发脉冲数量,然后切换到刚刚填充好的buff,然后启动dma发脉冲。 因为dma发脉冲更新的寄存器是arp,对于ccr脉宽寄存器,则每个伺服周期开始的时候,程序自己填充即可。 上面的dma发送的方法,优点是
[单片机]
STM32f407学习------(2)定时中断+万年历
任务:利用定时器中断实验、TFT LCD显示实验、OLED显示实验和按键实验 实现在32板子的显示屏上显示万历表,能显示年月日时分秒及星期,同时要处理好闰年与平年。不同的按键按下,能使对应的时间数字精确地发生相应的变化。 参考资料:https://wenku.baidu.com/view/2a698426a21614791711288e.html 还没更新完 非常不好意思 下次补上 1:我所理解的定时器中断: 当计数器计数到所设定的值时,会产生一个中断。 2:定时器中断初始化函数 void TIM3_Int_Init( ) 3:定时器中断实现步骤: (1):使能定时器时钟(一般用到外设,都需要使能相应的时钟) (2
[单片机]
STM32的USART接收数据通过DMA传输所遇到的问题
出现的问题: 先使用USART中断函数接收数据,判断是否接收到每帧数据的起始标记字符。如果接收到就关闭USART中断,然后开启DMA用于后续串口数据的接收。但是出现一个问题是每帧数据的起始标记为:A5 4A 05 00 00 40 81 然后开启DMA传输后所接收收到的第一个数据为0x81,也就是起始标志字符的最后一个数据。 造成这样问题的原因是: 在USART初始化时使用了函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); 虽然此时DMA没有被使能,但是硬件上已经开始做DMA传输检测了。 解决办法: 将函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENA
[单片机]
用STM32F407玩控制—自适应模糊PID控制
自适应模糊PID控制的原理如图1所示,从图中可以看出对偏差和偏差变化率进行模糊推理,获得Δkp、Δki、Δkd,模糊控制器的PID参数实际值为:kp=kp0+qp*Δkp、ki=ki0+qi*Δki、kd=kd0+qd*Δkd,其中qp、qi、qd为比例因子,这是比较常见的一种计算方式,但在薛定宇的《控制数学问题的MATLAB求解》一书中讲了另外一种计算方式:kp(k)=kp(k-1)+γ(k)*Δkp、ki(k)=ki(k-1))+γ(k)*Δki、kd(k)=kd(k-1)+γ(k)*Δkd,显然这种计算方式更复杂,我们这里采用前者,为了进行模糊推理,需要确定模糊规则表和各个模糊变量的隶属度函数,常见的模糊规则表如图2所示,我
[单片机]