基于stm32的spi从机实验HAL库编程

目录

  • 基于stm32的spi从机实验HAL库编程
    • 前言
    • 业务场景
    • 硬件设计接线
    • 配置swd接口
    • 配置spi
    • 配置DMA
    • 配置中断
    • 配置系统时钟
    • 配置工程
    • 生成代码
    • 写点从机代码
    • 上机现象
    • 后记
    • 本文使用的测试工程

基于stm32的spi从机实验HAL库编程

前言

在微控制器的世界中,串行外设接口(SPI)是一种广泛使用的接口,它允许设备之间进行快速通信。在这篇文章中,我将介绍如何使用STM32的硬件抽象层(HAL)库来编程一个SPI从机。我们将通过一个实验来理解SPI在实际应用中的运作方式,并且深入了解STM32的编程方法。

业务场景

假设有一个板子A作为主机端,通过一个接口的方式向外通讯交互,我们有一个板子B作为从机,用作接收端,现在按照主机端的协议来跟主机进行交互。

硬件设计接线

在这里插入图片描述

在我的这个硬件中,手头有一个stm32g0f6p6的板子,所以我以这个板子用作从机端进行设计。

打开STM32CubeMX进行操作

配置swd接口

在这里插入图片描述

配置spi

在这里插入图片描述

圈起来的参数要迎合主机端,不然通讯交互会出错,不知道主机端是什么配置时,则需要根据主机端底层通讯展示出来的波形来配置,用一个逻辑分析仪抓取分析一下,以我的这个场景为例,我的底层通讯呈现如下的波形:

在这里插入图片描述

按照我这里的展示,数据线1是对应MOSI,数据线2对应MISO,可以看到主机端时钟空闲电平是高电平,所以参数CPOL选择High参数,可以观察到数据1在交互时在第二边沿时电平很稳定,所以我这里CPHA的参数选择第一个边沿。至于是LSB先发,还是MSB先发,这个得双方进行约定,我这里以MSB先发为例。

配置DMA

在这里插入图片描述

配置中断

在这里插入图片描述

配置系统时钟

在这里插入图片描述

配置工程

在这里插入图片描述

在这里插入图片描述

生成代码

在这里插入图片描述

写点从机代码

在我的这个场景中,主机端每隔4ms发来一次数据,主机的数据格式如下:

在这里插入图片描述

在这里插入图片描述

从机端的代码如下:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */

  HAL_SPI_TransmitReceive_DMA(&hspi1,g_tx_buff,g_rx_buff,4);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

从机使用DMA的方式进行接收,接收完成之后会进入一个回调函数,在回调函数里面我重新开启DMA接收,这是因为不是使用DMA的循环模式,循环模式自己用得不是很熟,这里是收完一次在重新打开。

void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi->Instance == SPI1)
	{
		HAL_SPI_TransmitReceive_DMA(&hspi1,g_tx_buff,g_rx_buff,4);
	}
}

至于这个回调函数在哪里,可以在对应的.h中看到相关的声明,我们把对应的函数拿出来用就行了。

在这里插入图片描述

上机现象

在这里插入图片描述

在这里插入图片描述

可以看到,从机端在正常接收数据,在回调函数里面把数据摘取出来,就可以进行下一步的数据控制了。

后记

这里我只是进行简单的交互实验,实际工程中,数据交互会按照协议来进行设计,哪些字节表示命令,哪些字节表示校验,哪些字节表示长度,哪些字节表示参数,这些字节是什么含义,只有熟悉整个系统的设计者知道。

本文记录到此,算是自己工程的一次实践,希望这篇文章能帮助到你,本文完!!感谢阅读,感谢关注。

本文使用的测试工程

https://download.csdn.net/download/weixin_44317448/89286989

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/607289.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java面向对象实现文字格斗游戏细节完善版

为了完善上一篇的文字格斗游戏的细节,所以加了些代码,使得交互更加的具体有趣! 效果 大家可以多运行几次代码,得到不同的战况!! 代码实现 1.bean类 import java.util.Random;public class TextGame {private Strin…

ardupilot的固定翼飞行模式

飞行模式 APM所有的飞行模式都在对应的机型的文件夹下的mode.h里面有定义,针对于不同的模型,功能函数在基类中Mode中都是以纯虚函数实现了, 然后在继承的子类中重新实现它,以实现多态。 takeoff模式 参见网址在 ArduPlane 4.0 及更高版本中,自动起飞本身也是一种模式(…

文件操作

前言: 文件内容属性 要向访问文件就要打开文件——>用进程来打开——>要把文件先加载到内存中——> 一个进程可以打开多个文件,OS中也有可能多个进程打开了多个文件 文件以多,就需要进行管理,——先描述再组织 没有被打开…

【图文教程】PyCharm安装配置PyQt5+QtDesigner+PyUic+PyRcc

这里写目录标题 PyQt5、Qt Designer、PyUic、PyRcc简介(1)下载安装PyQt5(2)打开designer.exe所在位置(3)在PyCharm中配置QtDesigner(4)验证QtDesigner是否配置成功(5&…

thinkphp6使用layui分页组件做分页效果

博主用的是layui2.9.8的版本,但这个版本的分页组件是动态效果的,但我需要的是静态分页,所以我自己封装了一个生成layui的分页代码生成代码。代码如下: 1、先创建文件,路径是extent/layui/LayuiPage.php,加…

HashMap前世今生

概述 HashMap是我们常用的一种数据结构,他是一个key-value结构。我们来深入了解一下。 1.8之前用的数组加链表 1.8之后用的数组加链表加红黑树,当链表数量大于8时,将链表转为红黑树。当红黑书节点小于6又会转为链表。 浅析HashMap的put()方…

达梦数据库限制用户登录IP测试

达梦数据库创建用户时可以限制登录ip和时间段。 创建测试测试用户 create user test1 identified by Test_1234 ALLOW_IP "192.168.100.101"; 限定该用户只能通过192.168.100.101地址登录数据库 连接测试 上图可见,192.168.100.101客户端可以连接上19…

纯血鸿蒙APP实战开发——Grid和List内拖拽交换子组件位置

Grid和List内拖拽交换子组件位置 介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明: 拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子…

搭建产品帮助体系指南干货在这里

产品的成功不仅需要它的功能强大,还要让用户对产品有一个良好的体验。一个完善全面的产品帮助体系,能够很大程度地提升用户体验,帮助用户更好地理解和使用产品。如何搭建一个高效、实用的产品帮助体系呢?下面,我将为你…

Tomcat安装与配置(详细教程)

一、安装Tomcat服务器 1.下载地址(Tomcat官网)http://tomcat.apache.org/ 2.将下载的zip文件解压到指定的目录(例如:D盘,目录不要有中文) D:\apache-tomcat-9.0.43 二、配置Tomcat环境变量 (…

鸿蒙UI复用

鸿蒙UI复用 简介BuilderBuilder的使用方式一Builder的使用方式二Builder的使用方式三 Component使用Component复用UI 简介 在页面开发过程中,会遇到有UI相似的结构,如果每个UI都单独声明一份,会产生大量冗余代码,不利于阅读。遇到…

ai可以做思维导图吗?当然是可以的!

ai可以做思维导图吗?在快节奏的现代生活中,思维导图作为一种高效的信息组织和表达工具,越来越受到人们的青睐。随着人工智能(AI)技术的不断发展,AI思维导图软件也应运而生,它们不仅能够帮助用户…

软件接口测试规范流程

1、需求分析 1.1 确认测试目的和测试对象: 了解需求并明确测试目的,如测试一个本地 API 还是跨网站的远程 API。 1.2 确认测试的基本条件: 确定测试所需的测试数据,测试环境以及测试团队中的角色和职责。 1.3. 对接口文档进行验证&#xf…

兄弟DCP-7057激光打印机报错误代码EC检修及分析

故障描述: 兄弟DCP-7057激光打印机屏幕显示无法打印EC关闭电源,然后重新打开打印机。 故障检修及分析: 1、定影单元风扇的插线连接不良 检查定影单元风扇的插线连接并重新连接; 2、定影单元风扇故障 更换定影单元风扇&#xff1b…

Segmentation fault (core dumped)排查

先泼盆冷水,这个问题比较棘手,有的能通过重装opencv相关包修复,有的可能还是直接换一个没问题的环境比较快…… 我最后是没有解决的,折腾了几个小时后,还是听同事的话,把docker镜像重启了,幸好…

day04—java基础之方法详解

方法概述 方法是具有特定功能的代码集合,由于我们是把重复的代码写到方法当中,以后要用直接调用方法即可,不需要再写一遍了。代码相当于只写了一遍。所以可以提高代码的复用性。如果要修改代码,我们也只要修改一处即可&#xff0…

JavaSwing技术实现一个电子表程序

使用JavaSwing技术实现一个简单的电子表盘,如下所示。 下载链接 有兴趣的读者可以点击链接下载,博主承诺绝对真实有效。

bert-NER 转化成 onnx 模型

保存模型 加载模型 from transformers import AutoTokenizer, AutoModel, AutoConfigNER_MODEL_PATH ./save_model ner_tokenizer AutoTokenizer.from_pretrained(NER_MODEL_PATH) ner_config AutoConfig.from_pretrained(NER_MODEL_PATH) ner_model AutoModelForTokenCl…

VIsualGDB : 快速入门系列

《VisualGDB : 解决编码导致的编译错误》 《VisualGDB : 在windows上开发和调试Linux代码(一)》 《VisualGDB:为Linux项目添加系统依赖库》 《VisualGDB:Linux动态库项目创建、编译及库的使用》 《VisualGD…

Web3空投入门:如何增加空投成功的几率

今天分享空投如何避免限制以提高效率,增加成功几率,首先我们来了解什么是空投加密,有哪些空投类型。 一、什么是空投加密? 加密货币空投是一种营销策略,包括向用户的钱包地址发送免费的硬币或代币。 加密货币项目使用…
最新文章