HAL库开发--SPI的配置方式和读写操作

知不足而奋进 望远山而前行


目录

文章目录

前言

目标

内容

需求

SPI配置

SPI编码

OLED驱动拷贝

OLED的GPIO初始化修改

实现SPI的读写

总结


前言

SPI(Serial Peripheral Interface)是一种常见的串行通信协议,在嵌入式系统中被广泛应用于外设间的高速数据传输。本文将介绍如何在STM32开发板上配置和操作SPI接口,特别是在全双工模式下使用,以实现稳定和高效的数据交换。我们还将探讨如何集成OLED显示屏驱动,通过SPI接口实现数据传输和控制,从而在嵌入式应用中实现图形和文本的显示功能。


目标

  1. 掌握SPI配置方式
  2. 掌握SPI读写操作

内容

需求

SPI配置

打开SPI1,选中全双工模式。观察下方自动生成的引脚,是否和自己开发板引脚对应。

可以根据需要修改引脚,来动右侧芯片引脚视图,找到开发板对应引脚,进行修改。

修改SPI参数,目前当前业务只需要修改速率,通过修改分频得到。

SPI编码

OLED驱动拷贝

将原有OLED驱动拷贝到项目中

OLED的GPIO初始化修改

GPIO_InitTypeDef GPIO_InitStruct = {0};	
//cs1: 屏幕的片选
CS1_PORT_RCC();
GPIO_InitStruct.Pin = CS1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(CS1_PORT, &GPIO_InitStruct);
//	
//cs2: 字库的片选
CS2_PORT_RCC();
GPIO_InitStruct.Pin = CS2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(CS2_PORT, &GPIO_InitStruct);//dc: 是屏幕自己独有的命名控制引脚,和spi无关
DC_PORT_RCC();
GPIO_InitStruct.Pin = DC_PIN;
HAL_GPIO_Init(DC_PORT, &GPIO_InitStruct);
#include "stm32f4xx_hal.h"
#include "spi.h"#ifndef u8
#define u8 uint8_t
#endif#ifndef u16
#define u16 uint16_t
#endif#ifndef u32
#define u32 uint32_t
#endif/// CS1 
#define CS1_PORT_RCC() 	__HAL_RCC_GPIOA_CLK_ENABLE()
#define CS1_PORT				GPIOA
#define CS1_PIN					GPIO_PIN_2/// CS2
#define CS2_PORT_RCC() 	__HAL_RCC_GPIOA_CLK_ENABLE()
#define CS2_PORT				GPIOA
#define CS2_PIN					GPIO_PIN_3/// DC
#define DC_PORT_RCC() 	__HAL_RCC_GPIOC_CLK_ENABLE()
#define DC_PORT					GPIOB
#define DC_PIN					GPIO_PIN_5//-----------------OLED端口定义---------------- #define OLED_DC_Clr()  HAL_GPIO_WritePin(DC_PORT,DC_PIN, GPIO_PIN_RESET)//DC
#define OLED_DC_Set()  HAL_GPIO_WritePin(DC_PORT,DC_PIN, GPIO_PIN_SET)#define OLED_CS_Clr()  HAL_GPIO_WritePin(CS1_PORT,CS1_PIN, GPIO_PIN_RESET)//CS1
#define OLED_CS_Set()  HAL_GPIO_WritePin(CS1_PORT,CS1_PIN, GPIO_PIN_SET)#define OLED_ROM_CS_Clr()  HAL_GPIO_WritePin(CS2_PORT,CS2_PIN, GPIO_PIN_RESET)//CS2
#define OLED_ROM_CS_Set()  HAL_GPIO_WritePin(CS2_PORT,CS2_PIN, GPIO_PIN_SET)
  • 将引入改为#include "stm32f4xx_hal.h"
  • 引入生成的spi.h
实现SPI的读写

定义头

/* USER CODE BEGIN Prototypes */
void SPI1_write(uint8_t data);
uint8_t SPI1_read();
/* USER CODE END Prototypes */

实现spi读写

/* USER CODE BEGIN 1 */
void SPI1_write(uint8_t data) {HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
}
uint8_t SPI1_read() {uint8_t data;HAL_SPI_Receive(&hspi1, &data, 1, HAL_MAX_DELAY);return data;
}
/* USER CODE END 1 */

总结

本文详细介绍了在STM32微控制器上配置和使用SPI接口的方法,以及与OLED显示屏驱动的集成。首先,我们通过HAL库选择并配置了SPI1通道,确保其在全双工模式下能够正确地与外设通信。接着,我们修改了SPI参数,特别是时钟分频,以满足当前业务需求。随后,我们将现有的OLED驱动代码集成到项目中,并修改了GPIO初始化设置,确保CS1、CS2和DC引脚正确地与SPI和OLED通信相关的控制信号相连。

在代码实现中,我们定义并实现了简单的SPI写(SPI1_write)和读(SPI1_read)函数,利用HAL库提供的API来进行数据传输。这些功能不仅使得STM32能够与OLED显示屏无缝通信,还为开发人员提供了一个可靠的解决方案,用于实现图形界面和文本显示的嵌入式应用程序。

通过学习本文中的步骤和方法,开发人员不仅能够掌握SPI接口的基本配置和操作,还能够扩展到更复杂的外设集成和应用开发。SPI作为一种高效的串行通信协议,为嵌入式系统提供了强大的数据交换能力,特别适用于需要高速和可靠通信的应用场景。

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

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

相关文章

记录一次root过程

设备: Redmi k40s 第一步, 解锁BL(会重置手机系统!!!所有数据都会没有!!!) 由于更新了澎湃OS系统, 解锁BL很麻烦, 需要社区5级以上还要答题。 但是,这个手机…

Java基础——网络编程(一)

初识网络编程 网络编程:在网络通信协议下,不同计算机上运行的程序,进行的数据传输 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件…… BS架构的优缺点: 1、不需要开发客户端,只需要页面服务端 2、…

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础,想要拥有一个基本美观的大屏,就得考虑页面整体模块的宽高自适应,我们自然就会想到具有强大灵活性flex布局,再借助百分比布局来辅助。至此,大屏页面布局问题即可得到解决。 写在前面&#x…

Java高级技术探索:深入理解JVM内存分区与GC机制

文章目录 引言JVM内存分区概览垃圾回收机制(GC)GC算法基础常见垃圾回收器ParNew /Serial old 收集器运行示意图 优化实践结语 引言 Java作为一门广泛应用于企业级开发的编程语言,其背后的Java虚拟机(JVM)扮演着至关重…

机器人建模、运动学与动力学仿真分析(importrobot,loadrobot,smimport)

机器人建模、运动学与动力学仿真分析是机器人设计和开发过程中的关键步骤。 一、机器人建模 机器人建模是描述机器人物理结构和运动特性的过程。其中,URDF(Unified Robot Description Format)是一种常用的机器人模型描述方法。通过URDF&…

植物大战僵尸杂交版全新版v2.1解决全屏问题

文章目录 🚋一、植物大战僵尸杂交版❤️1. 游戏介绍💥2. 如何下载《植物大战僵尸杂交版》 🚀二、解决最新2.1版的全屏问题🌈三、画质增强以及减少闪退 🚋一、植物大战僵尸杂交版 《植物大战僵尸杂交版》是一款在原版《…

代码随想录-Day31

455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都…

Vue32-挂载流程

一、init阶段 生命周期本质是函数。 1-1、beforeCreate函数 注意: 此时vue没有_data,即:data中的数据没有收到。 1-2、create函数 二、生成虚拟DOM阶段 注意: 因为没有template选项,所以,整个div root都…

第3章 Unity 3D着色器系统

3.1 从一个外观着色器程序谈起 新建名为basic_diffuse.shader的文件,被一个名为basic_diffuse.mat的材质文件所引用,而basic_diffuse.mat文件则被场景中名为Sphere的game object的MeshRenderer组件所使用。 basic_diffuse.shader代码文件的内容如下所示…

C# WPF入门学习主线篇(二十一)—— 静态资源和动态资源

C# WPF入门学习主线篇(二十一)—— 静态资源和动态资源 欢迎来到C# WPF入门学习系列的第二十一篇。在上一章中,我们介绍了WPF中的资源和样式。本篇文章将深入探讨静态资源(StaticResource)和动态资源(Dynam…

运算符分为哪几类?哪些运算符常用作判断?简述运算符的优先级

运算符包含6大类:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元(目)运算符。 逻辑运算符常用作布尔判断 typeof 运算符: typeof 运算符用于确定变量或表达式的数据类型,并返回一个表示类型的字符串。 typeof …

Fegin如何传参form-data文件

Form-data传输file参数,这个大家都比较清楚,那么针对于Fegin参数file参数该如何操作呢!下面截图来找到对应的参数关系。 一、之前我们在postMan中是这种传参的,那么如果使用Feigin来传输文件File 二、在Fegin中传form-data参数&a…

Wall国内开源程序照片墙,支持VR全景及安装教程

下载 GitHub官网:https://github.com/zhang-tong-yao/wall 软件下载:https://github.com/zhang-tong-yao/wall/releases,推荐下载最新的版本。 演示效果 目前支持PC端和移动端自适应。 演示地址:https://demo-wall.ityao.cn …

OpenGL-ES 学习(6)---- Ubuntu OES 环境搭建

OpenGL-ES Ubuntu 环境搭建 此的方法在 ubuntu 和 deepin 上验证都可以成功搭建 目录 OpenGL-ES Ubuntu 环境搭建软件包安装第一个三角形基于 glfw 实现基于 X11 实现 软件包安装 sudo apt install libx11-dev sudo apt install libglfw3 libglfw3-dev sudo apt-get install…

新旧torch中傅里叶变换实现(fft)

由泰勒级数我们知道,一个函数可以被分解成无穷个幂函数叠加的形式,于是同样地,一个周期函数也可以被分解成多个周期函数叠加,于是自然而然地,三角函数符合这个需求,由傅里叶级数我们可以将周期函数分解成无…

unity 简易异步socket

1.unity 同步socket 改异步 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using UnityEngine.UI; using System.Threading; using System;public class Echo : MonoBehaviour {//定义套接字Socket socket;//UG…

ubuntu的home内存不足的解决办法(win和ubuntu双系统)

这种解决办法前提是windows和ubuntu双系统 首先在windows系统上创建一个空的硬盘分区 然后在ubuntu系统上把这个空的硬盘放在主目录里 然后可以把东西存在这个文件夹中 如下图,但实际主目录的内存没有变,以后存东西就在这个文件夹里面就好了 具体操作…

在typora中利用正则表达式,批量处理图片

一,png格式 在 Typora 中批量将 HTML 图片标签转换为简化的 Markdown 图片链接,且忽略 alt 和 style 属性,可以按照以下步骤操作: 打开 Typora 并加载你的文档。按下 Ctrl H(在 Windows/Linux 上)或 Cmd…

大数据与人工智能在保险行业数字化转型中的应用

随着科技的快速发展,大数据和人工智能(AI)技术在保险行业中扮演着越来越重要的角色,推动了保险行业的数字化转型。通过收集和分析海量的用户数据,利用先进的人工智能算法,保险公司能够更准确地评估风险&…

JavaScript算法实现dfs查找省市区路径

需求 存在如下数组,实现一个算法通过输入区名,返回省->市->区格式的路径,例如输入西湖区,返回浙江省->杭州市->西湖区。 // 定义省市区的嵌套数组 const data [{name: "浙江省",children: [{name: "…