【STM32】HAL库在7针脚0.96寸OLED屏上的移植---硬件SPI(一)


前期准备:

  1. STM32CubeMX
  2. STM32C8T6核心板
  3. IDE Keil(MDK-ARM)
  4. 杜邦线×7
  5. 0.96寸OLED屏(7针脚)

SPI背景和接线

1.什么是SPI

SPI英文缩写“Serial Peripheral Interface”,是一种串行外设接口,是一种四线制同步串行通信接口,用来连接MCU、传感器、存储设备
SPI是全双工且SPI没有定义速度限制,通常能达到甚至超过10 Mbps,这也是为什么SPI被广泛使用的原因

而SPI分为软件SPI和硬件SPI,因为SPI是一种需要时序的工作方式,所以当你细究SPI的原理时,你会发现每根信号线的工作时序有条有理,工作顺序前后清晰,严格按照时序进行工作

  1. 软件SPI:通过软件编写代码控制管脚按照SPI的原理进行工作,模拟SPI就是软件SPI
  2. 硬件SPI:有些单片机的管脚复用功能有SPI,即这些单片机内部集成了专门用于SPI工作的芯片,即硬件SPI

2.如何接线

在这里插入图片描述

单片机OLED屏
电源地GND
电源3.3V~5VV
SPI_CLKD0 / SCK
SPI_MOSID1 / SDA
单片机任意IORST
单片机任意IODC
单片机任意IOCS

STM32CubeMX部分

1.配置时钟

选择STM32F103C8Tx系列芯片,配置时钟的同时会自动配置IO口引脚
在这里插入图片描述
将HCLK设置为最大频率72MHz
在这里插入图片描述

2.配置SPI

选择SPI1——>Transmission Only Master(仅主机传输)——>Hardware NSS Singnal(取消硬件片选)——>SPI的时钟4分频
在这里插入图片描述

  1. 这里的从机是OLED,只需要单片机发数据给OLED,无需OLED返回数据(而且也返回不了),所以选择Transmission Only Master(仅主机传输)
  2. 这里的从机只有OLED一个,所以选择Hardware NSS Singnal(取消硬件片选),如果有多个从机,那就要开启。
    主机片选从机的条件是CS脚的电平拉低,如果只有一个从机的时候,可以将CS脚直接接地,将代码中所有关于CS脚的函数删掉即可,这样可以节省一个IO口
  3. 因为SPI是时序工作方式,需要时钟,通过单片机的时钟分频而来,这里4分频就已经够用了

接着再任选3个IO口选定为Output模式,作为SPI的RST、DC、CS
在这里插入图片描述

3.工程生成

在这里插入图片描述

在这里插入图片描述
工程管理依旧是这几个选项,然后GENERATE CODE,STM32CubeMX部分完成

MDK 5 部分

1.移植OLED文件

文末有工程链接

将oled文件放在如图位置
在这里插入图片描述
打开MDK 5 ,点击如图
在这里插入图片描述
添加oled.c文件
在这里插入图片描述
添加oled.h文件路径
在这里插入图片描述

2.修改引脚

在oled.h文件修改自定义的引脚
在这里插入图片描述

3.修改main函数

  1. 添加头文件 #include "oled.h"
    在这里插入图片描述
  2. OLED初始化
    在这里插入图片描述
  3. while(1)函数
    在这里插入图片描述

编译下载时需要选择相对应的下载器,勾选以下
在这里插入图片描述

效果如图

在这里插入图片描述




本期工程文档——>Gitee

在这里插入图片描述

### STC15 单片机 SPI OLED 显示驱动教程 对于STC15单片机而言,虽然官方文档更倾向于介绍其IIC通信能力[^2],但实际上也可以利用软件模拟SPI协议来控制OLED幕。下面将详细介绍如何配置并编写程序使能该功能。 #### 初始化设置 为了确保能够正确初始化SPI通信,在开始之前需要定义些必要的宏以及函数用于操作GPIO端口: ```c sbit OLED_SCLK = P3^7; // 定义SCLK引脚为P3.7 sbit OLED_SDIN = P3^6; // 定义SDIN引脚为P3.6 sbit OLED_DC = P3^5; // 数据/命令选择引脚DC连接到P3.5 sbit OLED_CS = P3^4; // 片选信号CS连接至P3.4 sbit OLED_RST = P3^3; // 复位信号RST接到P3.3 ``` 接着是对这些IO口的状态进行设定,通常是在`main()`函数前完成这步骤: ```c void Init_OLED(void){ OLED_RST=0; delay_ms(1); // 延迟段时间让复位生效 OLED_RST=1; OLED_CS=1; OLED_DC=0; } ``` 以上代码片段完成了对OLED显示器的基础硬件初始化工作[^1]。 #### 发送数据给OLED显示模块 当准备向OLED发送指令或图像数据时,可以调用如下两个辅助方法之来进行传输: - **写入命令** ```c void WriteCommand(unsigned char cmd){ OLED_CS=0; OLED_DC=0; for(bit i=0;i<8;i++){ OLED_SCLK=0; if(cmd&0x80) OLED_SDIN=1; else OLED_SDIN=0; OLED_SCLK=1; cmd<<=1; } OLED_CS=1; } ``` 此部分实现了通过移位寄存器逐位输出命令字节的功能[^3]。 - **写入数据** ```c void WriteData(unsigned char dat){ OLED_CS=0; OLED_DC=1; for(bit i=0;i<8;i++){ OLED_SCLK=0; if(dat&0x80) OLED_SDIN=1; else OLED_SDIN=0; OLED_SCLK=1; dat<<=1; } OLED_CS=1; } ``` 这段逻辑几乎与上述相同,唯的区别在于设置了不同的电平值以区分是命令还是实际的数据流。 #### 幕点亮及基本图形绘制 最后,为了让OLED正常运作起来还需要执行系列特定的初始化序列,并开启显示面板电源供应: ```c WriteCommand(0xAE); // 关闭显示 // ...其他初始化参数... WriteCommand(0xAF); // 开启显示 ``` 此外,还可以进步扩展实现简单的绘图功能,比如画点、线段或是矩形框等基础几何形状。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值