HAL——SPI

news/2025/3/15 11:54:58/

学习目标

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

学习内容

需求

SPI配置

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

修改引脚,来动右侧芯片引脚视图,找到开发板对应引脚,进行修改。

观察修改后的引脚,是否和开发板对应:

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

SPI编码

OLED驱动拷贝

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

OLED的GPIO初始化修改

OLED初始化函数

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);

oled头文件修改

#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_15/// CS2
#define CS2_PORT_RCC() 	__HAL_RCC_GPIOA_CLK_ENABLE()
#define CS2_PORT				GPIOA
#define CS2_PIN					GPIO_PIN_4/// DC
#define DC_PORT_RCC() 	__HAL_RCC_GPIOB_CLK_ENABLE()
#define DC_PORT					GPIOB
#define DC_PIN					GPIO_PIN_8//-----------------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的读写

定义头

spi.h读写定义

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

实现spi读写

spi.c读写实现

/* 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 */

练习

  1. 使用HAL库点亮屏幕


http://www.ppmy.cn/news/1294945.html

相关文章

Android 车联网——多屏多用户(十五)

前面几篇文章介绍了多用户和多屏相关的 Manager 和 Service。上一篇文章最后虽然车内乘员都根据配置有自己的对应屏幕,但默认情况下,所有车内乘员依然使用的是当前主用户(司机用户),这一篇我们继续放下看一下用户的创建与分配。 一、用户创建分配 1、创建用户 对于创建用…

用HTML的原生语法实现两个div子元素在同一行中排列

代码如下&#xff1a; <div id"level1" style"display: flex;"><div id"level2-1" style"display: inline-block; padding: 10px; border: 1px solid #ccc; margin: 5px;">这是第一个元素。</div><div id"…

C++完成Query执行sql语句的接口封装和测试

1、在LXMysql.h 创建Query执行函数 //封装 执行sql语句 if sqllen 0 strlen获取字符长度bool Query(const char*sql,unsigned long sqllen0); 2、在LXMysql.cpp编写函数 bool LXMysql::Query(const char* sql, unsigned long sqllen){if (!mysql)//如果mysql没有初始化好{c…

Qt 的流式布局 FlowLayout

一直苦寻于一个比较智能的布局方式&#xff0c;能够满足软件界面进行resize的时候&#xff0c;对已经存在的布局进行重新布局。能够合理的判断界面的size,在界面放大的时候&#xff0c;显示的item的行数减少&#xff0c;相反&#xff0c;界面缩小的时候&#xff0c;显示的 item…

三、Qt核心与Qt类库

一、Qt核心&#xff1a;元对象系统 1、Qt核心特点 Qt对标准C进行了扩展&#xff0c;引入了一些新的概念和功能元对象编译器&#xff08;MOC&#xff09;是一个预处理器&#xff0c;先将Qt的特性程序转为标准C程序&#xff0c;再由标准C编译器进行编译Qt为C语言增加的特性在Qt…

详解Keras:keras.preprocessing.image

keras.preprocessing.image Keras 库中的一个模块&#xff0c;用于处理和增强图像数据&#xff0c;它提供了一些实用的函数&#xff0c;如图像的加载、预处理、增强等。 常用函数 1、load_img 用于加载图像文件&#xff0c;并返回一个 NumPy 数组表示该图像 示例 from ker…

【已解决】Invalid bound statement (not found)

报错讯息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.casey.mapper.SysRoleMapper.getUserRoleCode at org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . < i n i t > ( M a p p e r M e t h o d . j a v a :…

2023我的编程之旅-地质人的山和水

引言 大家好&#xff0c;我是搞地质的。外行人有的说我们游山玩水&#xff0c;有的说我们灰头土脸&#xff0c;也有的说我们不是科学。 而我说&#xff0c;这是一门穷极一生青春&#xff0c;值得奉献的行业。这是一门贴近民生&#xff0c;又拥抱自然的学科。他的真理性在于探…