基于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.mzph.cn/news/834352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2 1、 for i in range(5):Dev.step(9 - i * 2)Dev.turnLeft()2、 for i in range(3):Spaceship.step(i 1)Spaceship.turnRight()Spaceship.step(i 1)Spaceship.turnLeft()3、 for i in range(4):Dev.step(10 - i…

接口测试必备技能

接口测试,其实并没有那么可怕,但是作为测试人员也是必不可少的技能。 接口分为:内部接口和外部接口。 内部接口:是浏览器与服务器的接口。这个很容易理解,web开发一般分前端和后端,前端开发人员用html/css…

vue管理系统导航中添加新的iconfont的图标

1.在官网上将需要的图标,加入项目中,下载 2.下载的压缩包中,可以选择这两个,复制到项目目录中 3.如果和之前的iconfont有重复,那么就重新命名 4.将这里的.ttf文件,也重命名为自己的 5.在main文件中导入 6.在…

【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解

一、线程概念 线程是进程的一个执行分支,是在进程内部运行的一个执行流。下面将从是什么、为什么、怎么办三个角度来解释线程。 1、什么是线程 上面是一张用户级页表,我们都知道可执行程序在磁盘中无非就是代码或数据,更准确点表述&#xff0…

第十六课 美化表格

美化表格 利用“图表工具/格式”选项卡可分别对图表的图表区、绘图区、图表标题、坐标轴标题、图例项、数据系列等组成元素进行格式设置,如使用系统提供的形状样式快速设置,或单独设置填充颜色、边框颜色和字体等,从而美化图表。【例如&…

AI 绘画神器 Fooocus 本地部署指南:简介、硬件要求、部署步骤、界面介绍

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 随着人工智能技术的飞速发展,AI 绘画逐渐成为创意领域的新宠。Fooocus 作为一款免费开源的 AI 绘画工具&am…

Git之revert的使用

问题场景: 提交代码都是以merge request的形式合并到主分支master的。 由于有一个merge request被误merge了,这期间又有同时merge了其它内容。 如何快速将这个被误merge的request从master上revert呢? 实例演示: 下面是最近的5…

别再观望!2024年必做的项目:视频号无货源

大家好,我是电商花花。 现在做项目,更喜欢的是一个能稳定出单,稳定发展的一个创业项目,一个好的项目就是能长期稳定的发展,如果只追求短平快收益的项目,这样的项目也并不适合我们。 对于越来越火爆的视频…

冒泡排序----深刻理解版本

前面虽然向大家介绍了冒泡排序,但是表达的不是很清楚,这次我带着更深刻的理解向大家介绍以下冒泡排序。 1.冒泡排序 冒泡排序其实是一种排序算法,通过数据之间的相互比较将一堆混乱的数据按照升序或者降序的顺序排列。 2.解题思路 解题思…

数据存储-SQLite

一般使用到数据库存储,涉及到的数据量都较大,采用文件存储也能完成,但是文件操作复杂,效率低,大量结构化数据通常采用关系型数据库存储较为合适。Android中已经嵌入了轻量级的关系型数据库SQLite,直接按照数…

信号处理SCI期刊,中科院2区,专业性强,审稿速度快!

一、期刊名称 Signal Processing 二、期刊简介概况 期刊类型:SCI 学科领域:信号处理 影响因子:4.4 中科院分区:2区 出版方式:订阅模式/开放出版 版面费:选择开放出版需支付$3300 三、期刊征稿范围 …

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件,位于应用与操作系统、数据库之间,主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题,是分布式环境下支撑应用开发、运…

【多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势,整合市面上主流陪玩app应用功能,自主开发了多客陪玩系统源码,并可为客户提供全部原生陪玩源码,进行二次开发,打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

Macbook pnpm 安装 node-sass 报错(node-gyp)

换了 Macbook M3 Pro 后安装项目依赖时报错,提示 node-sass 安装出错。 (此外,ValueError: invalid mode: rU while trying to load binding.gyp 也是类似原因。只需要确保 node-gyp 运行条件就可以) 原因是 node-gyp 运行环境缺…

IntelliJ IDEA安装教程

IntelliJ IDEA-安装 解锁编程新境界,IntelliJ IDEA —— Java开发者梦寐以求的智慧之选! 在代码的海洋里航行,你需要的不仅仅是一艘船,而是一位智勇双全的领航员。IntelliJ IDEA,这款被全球数百万程序员热烈追捧的Ja…

JAVA(三)常用类和API

目录 常用类与基础API---String String的内存结构 构造器和常用方法 字符串构建 String与其他结构间的转换 String的常用API 系列1:常用方法 系列2:查找 系列3:字符串截取 系列4:和字符/字符数组相关 系列5:开头…

数据库加密数据模糊匹配查询技术方案

文章目录 前言沙雕方案内存加载解密密文映射表 常规做法实现数据库加密算法参考 分词组合加密(推荐) 超神方案总结个人简介 前言 在数据安全性和查询效率之间找到平衡是许多数据管理系统所面临的挑战之一。特别是在涉及加密数据的情况下,如何…

vue3+ts--实际开发之--table表格打印或者保存

vue3实现指定区域打印(导出)功能-主要是解决分页内容分割问题 一、 问题页面效果二、 Print.js相关属性 和使用1. 介绍2. 安装引入3. PrintJS参数配置表 三 、解决关于分页文字或者表格被分割问题,解决后如下:1. 设置一个自定义ta…

c4d云渲染怎么操作?怎么使用?一文带你了解

Cinema 4D (C4D) 不仅是众多设计师所青睐的卓越三维软件,其自带的高效渲染器以及对云渲染农场的支持,都极大地拓宽了创意和生产的边界。通过利用强大的云计算资源,C4D能够帮助用户轻松克服渲染速度缓慢的难题,从而实现更加流畅和高…