使用STM32F4芯片验证SPI功能的问题分析

发布者:Tapir最新更新时间:2024-09-12 来源: elecfans关键字:STM32F4芯片  SPI功能  中断方式 手机看文章 扫描二维码
随时随地手机看文章

有人使用STM32F4芯片验证SPI功能。当使用片内两个SPI模块基于中断方式进行收发时,发现总是出现接收数据丢失的情况,貌似总丢失末尾2个数据。代码使用HAL库提供的API函数。这是怎么回事呢?


我拿STM32F407开发板进行验证测试。使用SPI1做发送,SPI3做接收,都使用中断方式。

c695b4fe-9759-11ee-8b88-92fbcf53809c.png

很快重现了问题现象,即发生接收数据丢失的情形。见下图验证结果,发了8个数据,只收到6个数据。

c6a88070-9759-11ee-8b88-92fbcf53809c.png

现在是同一颗芯片,即同一CPU基于中断方式完成收发。怀疑会不会是不同SPI收发模块中断优先级的安排不合理导致的问题。如果二者优先级一样的话,这里的发送中断往往先于接收中断的产生,势必会出现接收不及时的情形。通过对代码跟踪调试,也的确发现了SPI接收溢出的现象,即接收数据提取不及时。

c6bbc234-9759-11ee-8b88-92fbcf53809c.png

这样分析下来,感觉数据丢失应该跟通信速率有关,丢失数据的多少不应该固定。于是,我大幅度提升SPI通信速率再行测试,果真丢失的数据更多了。见下图测试结果,发8个数据只收到1个数据。【前面测试时SPI波特率是5.25Mb/s,现在改为21Mb/s了】

c6cd652a-9759-11ee-8b88-92fbcf53809c.png

我将SPI3接收中断的优先级调得比SPI1发送中断的还高,如下图所示。

c6e43552-9759-11ee-8b88-92fbcf53809c.png

基于重新调整中断优先级后的代码再做测试,结果就完全正常了。

c6fd7378-9759-11ee-8b88-92fbcf53809c.png

当然,我们还可以有其它灵活处理的办法。比方发送用中断,接收用DMA,或者发送用轮训,接收用中断或DMA,或者都用DMA方式也行。


这里的核心问题是中断优先级没有合理安排好。STM32ARM核中断的内容不多,不过内容不多的东西往往意味着使用上更为灵活。好,今天的话题就分享到这里。


关键字:STM32F4芯片  SPI功能  中断方式 引用地址:使用STM32F4芯片验证SPI功能的问题分析

上一篇:请问一下STM32管脚重映射支持任意组合吗?
下一篇:STM32F0系列MCU硬件电路供电设计

推荐阅读最新更新时间:2024-11-16 21:21

从LCD电极读数的单片机接口技术
   摘要 以测量仪表中常见的时分割驱动法驱动的段式LCD显示器为例,分析LCD显示器的电极连接结构和驱动信号波形;介绍单片机读取仪表LCD读数的接口电路。此接口电路应用于笔者开发的自动血压监控仪的研制及临床应用项目中,由8031单片机读取血压计的收缩压、舒张压、心率以及充气和放气时瞬时压强。实验证明,此接口电路工作稳定、可靠。   通过测量仪表拾取被测信号是单片机前向通道设计中常用的数据采集方式。通常,接口电路从仪表电路中取得相关的模拟信号,经过A/D转换或V/F 转换送入单片机;或者取得一个频率信号,经整形后送入单片机 。然而,有些测量仪表电路中可能找不到这样的信号。以电容式压力传感器血压计为例,尽管从其振荡电路中可以取得一
[单片机]
STC8单片机OLED通过SPI硬件中断方式驱动(上)
说明一点直接就是怎么用没有重点讲SPI原理,很多博主已经把原理讲的很好了这里就不提了,后面会补上。 第一点为啥要用中断方式进行,而不用轮询? 目前很多博主都是用轮询的方式进行SPI通信,但是这样的效率比较低,浪费单片机的算力,再加上STC8A8K64S4A12没有硬件DMA,所以选择中断方式。 第一我们先看说明书上咋说的 驱动一块OLED那肯定是单主单从方式,然后再看看应该配置的寄存器 根据说明书SPSTAT寄存器那就很好配置了,再void SPI_Init()初始化函数中就直接全部写0,那就是SPSTAT = 0X00; 再看看第二个应该配置的 看到这里有些刚刚学SPI肯定一脸懵逼,我们接着看说明
[单片机]
STC8单片机OLED通过<font color='red'>SPI</font>硬件<font color='red'>中断</font><font color='red'>方式</font>驱动(上)
stm32f407】外部中断实现按键中断方式
.外部中断 STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F407的22个外部中断为: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB OTG FS唤醒事件。 EXTI线19:连接到以太网唤醒事件。 EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。 EXTI线21:连接到RTC入侵和时间戳事件。
[单片机]
【<font color='red'>stm32f4</font>07】外部<font color='red'>中断</font>实现按键<font color='red'>中断</font><font color='red'>方式</font>
浅谈 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 硬件I2C的使用 (<font color='red'>中断</font><font color='red'>方式</font> 无DMA 无最高优先级)
M20 中断、定时器与程序存储方式
void main() //主程序 不同单片机写法基本一致 { } interrupt() //不同单片机 中断程序写法不同 { } 多个中断类似于多个中断车道的车行进,如果都来抢占红色小车的主车道,会造成红车行进缓慢。 所以中断程序写最简短的代码,尽量少的占用主车道的时间。 以上提到了四个关键名词: 中断 定时器 主程序 中断程序 书籍会给一个名词简短一两句话,作为解释或者定义,实际上大部分名词很难用一句话说明。很多同学学习过程中感觉越学越困难,越来越看不懂,实际上,关键问题就是很多名词需要一本书1000页打底的书来解释才行,我们把自己限定到仅看课本或者一两本关联度很少的书,这样自然是越学越累。因为这
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved