HAL——SPI

学习目标

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

学习内容

需求

SPI配置

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

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

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

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

SPI编码

OLED驱动拷贝

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

OLED的GPIO初始化修改

OLED初始化函数

cpp 复制代码
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头文件修改

cpp 复制代码
#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读写定义

cpp 复制代码
/* USER CODE BEGIN Prototypes */
void SPI1_write(uint8_t data);
uint8_t SPI1_read();
/* USER CODE END Prototypes */

实现spi读写

spi.c读写实现

cpp 复制代码
/* 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库点亮屏幕
相关推荐
dozenyaoyida1 小时前
LSTM 自编码器原理详解:从三门结构到 STM32 端侧异常检测落地
人工智能·stm32·lstm
茯苓gao2 小时前
嵌入式开发笔记:工业机器人通信协议深度解析——从现场总线到工业以太网
笔记·嵌入式硬件·学习·机器人·信息与通信
hongmai6668882 小时前
GD5F1GM7REYIG存储芯片:1Gb SPI NAND Flash助力国产设备高效运行
网络·单片机·嵌入式硬件·物联网·智能家居
阿拉斯攀登4 小时前
平台设备驱动:platform bus 与设备树
linux·嵌入式硬件·嵌入式·linux驱动·字符设备驱动
三品吉他手会点灯4 小时前
嵌入式机器学习 - 学习笔记1.0.2 - 学习路线导览:从机器学习基础到 TinyML应用
人工智能·笔记·嵌入式硬件·学习·机器学习
阿拉斯攀登4 小时前
并发与同步:自旋锁、信号量、互斥锁
linux·网络·嵌入式硬件·linux驱动·字符设备驱动
纯音乐sjc4 小时前
51单片机入门Day1:从概念到第一个IO操作踩坑记录
单片机·嵌入式硬件·51单片机
阿乔外贸日记4 小时前
意大利进口主力产品及主要合作供应国
大数据·人工智能·物联网·搜索引擎·云计算
蓝奥声科技4 小时前
扩展式监控显示面板,实现更加灵活的智慧用电监测方案
物联网·智能插座·智能用电计量插座·扩展式监控显示面板
xu_wenming5 小时前
Zephyr上开发 BLE(低功耗蓝牙)入门应用
c语言·嵌入式硬件·物联网