STM32CubeMX配置HAL库实现SPI-DMA的递归调用

这篇具有很好参考价值的文章主要介绍了STM32CubeMX配置HAL库实现SPI-DMA的递归调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对于快速入门STM32CubeMX,可以参考

【STM32】HAL库 STM32CubeMX系列学习教程

——————————

一、硬件参数与配置:

核心:STM32F407ZET6  

外设ADC:ADS1258   数量:3个 

 ※ 核心与3个ADC使用SPI总线 “一主多从” 方式连接,PCB布线的方式与下图一致。

※ 在电路板上STM32与三个ADS1258在同一直线上分布,STM32在一端,三个ADC依次排布。

※ 离STM32最远ADC的DRDY硬件管脚与STM32的EXTI line4 interrupt连接。

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

 

1.1 STM32CubeMX的设置 

1.1.1 时钟树配置如下: 

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

 1.1.2 ADC输入的CLK由STM32的定时器TIM4控制,时钟树中APB1 Timer Clock = 84MHz,由下图配置生成PWM来当作ADC输入的CLK,CLK的频率为84/8 = 10.5MHzhal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

1.1.3 使用STM32的SPI3通讯协议,SPI3_RX的DMA Request与DMA1 Stream0连接,SPI3_TX的DMA Request与DMA1 Stream0连接。由于ADS1258的Datasheet中对SPI速率的要求,确定了STM32与ADC之间的SPI通讯速率为5.25MBits/s,即SCLK = 5.25MBits/s

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

1.2 ADS1258的设置

1.2.1 在整个系统初始化时,STM32向ADS1258发送一系列寄存器指令,将ADS1258的采样模式设置为Auto-Scan Mode、在该模式下使能需要采样的模拟信号输入管脚(已使能管脚按ADS1258 datasheet中的Channel ID,自动转换至待采样的模拟信号输入管脚)。

1.2.2 ADS1258在Auto-Scan Mode的Data Rate的计算公式如下,初始化设置中fclk = 10.5MHz,DR = 10b,TD = 8,CHOP = 0,计算得Data Rate = 5043Hz,即每个ADC的每次采样完成后DRDY引脚输出的信号频率为5043Hz。

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

 二、运行逻辑

2.1 功能概述

在电路设计上,三个ADC的采样启停通过硬件连接由STM32的同步控制,且ADS1258的采样模式为Auto-Scan Mode,因此三个ADC能够同时将预定的输入模拟信号进行采样并转换为数字量,即在任一ADC的两个DRDY信号之间,三个ADC均在硬件上一一对应的模拟信号输入管脚进行采样。在两个DRDY之间,STM32需要通过SPI协议接收三组 4 Bytes 的数字量,为了在接收数据的同时不占用核心的处理,所以选择了非阻塞式的SPI-DMA传输,可以按照三个ADC的硬件摆放顺序,将三组数字量依次且完整接收。

2.2 功能实现

2.2.1 主要函数分析

使用EXTI line4 interrupt中断,离STM32最远ADC的DRDY管脚为中断信号源,在STM32的外部中断回调函数中,使用HAL库中的HAL_SPI_TransmitReceive_DMA函数,在两个DRDY信号之间(即下一次ADC采样完成前),通过类似递归的逻辑,将三个ADC的采样数据通过SPI协议传输至STM32。

HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)

使用 HAL_SPI_TransmitReceive_DMA函数,STM32需要发送1个字节的“通道数据读取指令”,紧接着便可接收4个字节ADC的采样数据,其中接收的第1个字节为状态字节,后3个字节为24位采样数据(通讯时序图见ADS1258的datasheet)。通过对HAL_SPI_TransmitReceive_DMA函数的源码、断点调试及相应寄存器的分析,确定了在stm32f4xx_it.c文件中的DMA1_Stream5_IRQHandler函数中用户可编辑代码段,可成功调用HAL_SPI_TransmitReceive_DMA函数。

void DMA1_Stream5_IRQHandler(void)

2.2.2 中断函数

相关中断的中断向量表如下图。

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

在HAL_SPI_TransmitReceive_DMA函数中会产生DMA1_Stream0_IRQHandler中断服务函数和DMA5_Stream0_IRQHandler中断服务函数的中断信号,即在外部中断服务函数执行完成后,会依次执行DMA1_Stream0_IRQHandler中断服务函数和DMA5_Stream0_IRQHandler中断服务函数。这两个中断服务函数中默认执行HAL_DMA_IRQHandler函数,其分别与SPI3_RX和SPI3_TX相应的&hdma_spi3_rx和&hdma_spi3_tx句柄绑定(下图为1.1.3 图表中设置生成的代码)。

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件

hal_spi_transmitreceive_dma,stm32,单片机,嵌入式硬件 

在HAL_DMA_IRQHandler(&hdma_spi3_rx)前加入延时,一是为了避免当HAL_SPI_TransmitReceive_DMA函数正在运行过程中再次调用该函数,而导致DMA相关寄存器未复位,最终导致硬件执行错误;二是为了避免STM32还未完整接收某一个ADC传输的数据时,紧邻的ADC就开始发送数据,而导致的数据冲突。

在HAL_DMA_IRQHandler(&hdma_spi3_tx)后加入上述程序,是当外部中断回调函数中的HAL_SPI_TransmitReceive_DMA函数成功执行后,即第一个ADC发送数据并被STM32完整接收后,开始准备接收第二个和第三个ADC的数据。adDataChannel变量是“递归”的条件判断,即当三个ADC的数据全部发送并被STM32完整接收后,开始准备下一轮的数据接收。文章来源地址https://www.toymoban.com/news/detail-615320.html

到了这里,关于STM32CubeMX配置HAL库实现SPI-DMA的递归调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【STM32】HAL库 STM32CubeMX——DMA (串口DMA发送接收)

    软件: STM32CubeMX KEIL5 mcuisp 串口通信助手 硬件: STM32F103C8Tx 杜邦线,面包板,USB转TTL DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道系统的运

    2024年02月12日
    浏览(22)
  • Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步)

    本文的初衷一方面是将我的一些关于STM32开发方面浅显的个人经验分享给初学者、并期望得到大佬的批评指正,另一方面是记录自己的实验过程便于回顾。 我预感应该要写很多,不过鉴于之前的数篇笔迹中,对于SPI/DMA/ADXL3XX系列加表的使用已经详细描述过了,所以这篇博客只

    2024年02月10日
    浏览(19)
  • STM32 HAL库 STM32CubeMX -- SPI

    SPI (Serial Peripheral Interface)协议,即串行外围设备接口,是一种高速全双工的通信总线。 它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合。 SPI 通讯使用3 条总线及片选线, 3 条总线分别为SCK、MOSI、MISO,片选线为SS(CS) ,它们的作用介绍如下: (1) SS( Slav

    2024年02月13日
    浏览(26)
  • 【STM32 CubeMX】SPI HAL库编程

    STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具,用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中,使用 CubeMX 可以大大简化初始化过程,并帮助开发者快速构建应用程序。其中,SPI(串行外设接口)是一种常用的通信协议,它在连接外部设备时非常

    2024年02月19日
    浏览(13)
  • [HAL]STM32 SPI+DMA驱动WS2812

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

    2024年02月09日
    浏览(20)
  • STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx

    本文主要讲解定时器触发ADC去采集交流信号,DMA把数据搬移到内存。 所需工具: 开发板:STM32F103C8T6 STM32CubeMX IDE: Keil-MDK 相关文章: STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx(二) STM32cubemx ADC+TIM+DMA超频采样 ADC+TIM+DMA采集交流信号是电赛中使用范围最为广泛的一个技术。这个模

    2024年02月03日
    浏览(20)
  • U8g2库的STM32硬件SPI(DMA)移植教程(HAL、OLED显示、四线SPI、DMA)

    本文教你把U8g2图形库移植到STM32上,基于STM32的硬件SPI、CubeMX U8g2库Github网址:https://github.com/olikraus/u8g2 U8g2库CSDN镜像网址:https://gitcode.net/mirrors/olikraus/u8g2?utm_source=csdn_github_accelerator 硬件准备:STM32C8T6(STM32系列芯片)、0.96寸OLED(128×64)、J-Link(或其他) 引脚连接: 出自此

    2024年02月09日
    浏览(25)
  • 7针0.96寸OLED的HAL库代码(硬件SPI/全代码/stm32f1/CubeMX配置/包含有正负浮点数/100%一次点亮)

    HC-SR04超声波模块的使用  编码电机以及双电机驱动 4针 0.96\\\'OLED的使用 更多有意思的文章点击“我的主页” --------😐 更多有意思的视频 ----- B站 @想要亿只独角兽 --------😐 之前发布了一篇硬件I2C的0.96\\\' OLED驱动代码,这次就添加一篇硬件SPI的驱动代码。 其实改动的代码不多,

    2024年02月16日
    浏览(21)
  • 【STM32】SPI与PS2手柄解码(CUBEMX+HAL库)

    本文工程文件以及ps2数据手册在这个链接,我设置成免费了 【免费】STM32PS2解码工程以及代码(CUBEMX+HAL库)资源-CSDN文库 目录   SPI简介 SPI引脚说明 一些参数的含义 通信的四种模式 通信过程简介 关于SPI的常用HAL库函数 PS2简介 ps2手柄 ps2接收器 PS2解码 CUBEMX工程配置 PS2解码

    2024年04月17日
    浏览(15)
  • 【STM32】HAL库中的SPI传输(可利用中断或DMA进行连续传输)

    【STM32】HAL库中的SPI传输(可利用中断或DMA进行连续传输) SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,

    2024年02月08日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包