STM32F103 驱动SPI的OLED屏

news/2025/2/7 15:13:45/文章来源:https://www.cnblogs.com/jeikerxiao/p/18702621

STM32F103C8T6 最小系统开发板驱动SPI OLED屏

1. 硬件设计

1.1 最小系统开发板

STM32F103C8T6是一个基于ARM Cortex-M3内核的32位微控制器,适合用于各种嵌入式应用。最小系统开发板将包括STM32F103C8T6芯片、基本电源和调试接口。为了驱动SPI协议的OLED显示屏,需要连接以下引脚:

STM32F103C8T6 引脚 OLED屏引脚 描述
PA5 SCK SPI时钟线
PA6 MISO SPI数据输入线
PA7 MOSI SPI数据输出线
PA4 CS SPI片选线
GND GND 地线
3.3V VCC 电源线

1.2 SPI协议原理

SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于短距离的高速数据传输。它通过四根线进行通信:

  1. SCK(Serial Clock):时钟信号,由主设备提供。
  2. MISO(Master In Slave Out):主设备接收数据的线。
  3. MOSI(Master Out Slave In):主设备发送数据的线。
  4. CS(Chip Select):选择目标设备,通常低电平激活。

OLED屏通过SPI协议与STM32F103C8T6通信,主设备(STM32)通过这些引脚与屏幕交换数据,控制其显示内容。

2. 软件设计

2.1 开发环境

  • 开发工具:STM32CubeMX、Keil uVision 5
  • 下载工具:ST-Link V2(用于将程序烧录到STM32开发板)
  • 固件库:STM32Cube HAL库

2.2 STM32CubeMX配置

  1. 打开STM32CubeMX,选择STM32F103C8T6芯片。
  2. 配置时钟、GPIO、SPI等外设:
    • 配置PA5为SPI时钟(SCK)。
    • 配置PA6为SPI数据输入(MISO)。
    • 配置PA7为SPI数据输出(MOSI)。
    • 配置PA4为SPI片选(CS)。
  3. 生成代码并打开Keil uVision 5。

2.3 驱动OLED屏的步骤

2.3.1 初始化SPI

main.c中,使用HAL库函数初始化SPI:

/* SPI初始化代码 */
SPI_HandleTypeDef hspi1;void SPI_Init(void)
{hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;HAL_SPI_Init(&hspi1);
}

2.3.2 OLED显示初始化

接下来,定义OLED屏幕的初始化命令并通过SPI发送。OLED通常使用128x64分辨率,初始化代码如下:

/* OLED屏初始化命令 */
void OLED_Init(void)
{OLED_SendCommand(0xAE);  // 关闭显示OLED_SendCommand(0xD5);  // 设置时钟分频OLED_SendCommand(0x80);  // 设置时钟分频值OLED_SendCommand(0xA8);  // 设置多重输出比OLED_SendCommand(0x3F);  // 设置输出比OLED_SendCommand(0xD3);  // 设置显示偏移OLED_SendCommand(0x00);  // 设置偏移值OLED_SendCommand(0x40);  // 设置显示开始行OLED_SendCommand(0xA1);  // 水平翻转OLED_SendCommand(0xC8);  // 垂直翻转OLED_SendCommand(0xDA);  // 设置COM引脚硬件配置OLED_SendCommand(0x12);  // 设置硬件配置值OLED_SendCommand(0x81);  // 设置对比度控制OLED_SendCommand(0x7F);  // 设置对比度值OLED_SendCommand(0xA4);  // 输出正常显示OLED_SendCommand(0xA6);  // 设置正常显示模式OLED_SendCommand(0xAF);  // 打开显示
}

2.3.3 发送命令和数据

为了通过SPI发送命令和数据,需要定义一个发送函数:

void OLED_SendCommand(uint8_t command)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);  // 选择OLEDHAL_SPI_Transmit(&hspi1, &command, 1, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);  // 取消选择
}void OLED_SendData(uint8_t data)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);  // 选择OLEDHAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);  // 取消选择
}

3. 示例代码

3.1 完整示例

#include "stm32f1xx_hal.h"
#include "main.h"SPI_HandleTypeDef hspi1;void SPI_Init(void);
void OLED_Init(void);
void OLED_SendCommand(uint8_t command);
void OLED_SendData(uint8_t data);int main(void)
{HAL_Init();SPI_Init();OLED_Init();while (1){OLED_SendData(0xFF);  // 发送数据以点亮OLED屏幕HAL_Delay(500);OLED_SendData(0x00);  // 发送数据以关闭OLED屏幕HAL_Delay(500);}
}

3.2 注释

  1. SPI初始化:通过HAL_SPI_Init初始化SPI硬件,设置为主模式,数据传输位宽8位。
  2. OLED初始化:配置OLED屏幕的各种参数,如时钟分频、显示偏移、输出比等。
  3. 发送命令/数据:通过SPI总线发送命令或数据来控制OLED屏幕的显示内容。

4. 下载工具

使用ST-Link V2将程序烧录到STM32F103C8T6开发板。连接ST-Link V2与开发板的调试接口,然后通过Keil的下载功能将程序烧录到MCU。

5. 结语

本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过SPI协议驱动OLED显示屏。通过详细的硬件连接、SPI协议原理、软件设计和示例代码,您可以轻松实现基本的OLED显示功能。

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

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

相关文章

EverEdit扩展脚本:在当前文件目录下新建同类型文件(增强)

1 扩展脚本:在当前文件目录下新建同类型文件(增强) 1.1 应用场景之前使用JS写了一个EverEdit的脚本,用于在当前打开的文档目录下新建一个同类型的文件,比如,在进行python语言学习时,做完练习,需要再开一个文件写代码,原脚本的不足是,每次弹出提示输入文件名的输入框,输…

Deepseek R1 + LMStudio 本地部署(windows)

DeepSeek-R1本地部署配置要求 Github地址:https://github.com/deepseek-ai/DeepSeek-R1?tab=readme-ov-file模型规模最低 GPU 显存推荐 GPU 型号纯 CPU 内存需求适用场景1.5B 4GB RTX 3050 8GB 个人学习7B、8B 16GB RTX 4090 32GB 小型项目14B 24GB A5000 x2 64GB 专业应用32…

GO指南之练习答案

GO指南之练习答案 Go指南 练习:循环与函数 为了练习函数与循环,我们来实现一个平方根函数:给定一个数 x,我们需要找到一个数 z 使得 z 尽可能地接近 x。 计算机通常使用循环来计算 x 的平方根。从某个猜测的值 z 开始,我们可以根据 z 与 x 的近似度来改进 z,产生一个更好…

第三轮easy~hard题目

题目1代码 #include<iostream> #include<queue> #include<string> using namespace std; int main() {priority_queue<int> s;string str;int a;str="0";while(str!="end"){cin>>str;if(str=="insert"){cin>&g…

通过Ollama本地部署DeepSeek R1以及简单使用

本文介绍了在Windows环境下,通过Ollama来本地部署DeepSeek R1。该问包含了Ollama的下载、安装、安装目录迁移、大模型存储位置修改、下载DeepSeek以及通过Web UI来对话等相关内容。1、下载Ollama 首先我们到Ollama官网去下载安装包,此处我们下载的是Windows版本的安装包,如下…

git删除gitee上传大文件转载

前言:在提交推送本地更改至仓库时,误将大文件给提交了,导致push时报错文件过大,因此需要将已经commit的大文件移除后再push 若已知要删除的文件或文件夹路径,则可以从第4步开始 1.对仓库进行gc操作 $ git gc 2.查询大文件 git verify-pack -v .git/objects/pack/pack-*.id…

Axure RP 9.0 软件安装、汉化

‌Axure RP9是一款专业的原型设计工具,主要用于快速创建交互式的高保真原型,帮助设计师和产品经理进行用户体验设计和界面设计‌。‌ 主要功能和应用场景‌原型设计‌:Axure RP9提供了丰富的交互组件和功能,如可交互的按钮、链接、表单元素等,用户可以模拟真实的应用程序或…

第八节 BERT实战

做下游分类任务,如何处理一句话的输入input_dis:输入哪些字 21128个汉字里编码 mask:输入的话有多长. 模型输入固定,不够的话用padding补上 Seq_ids:句子编码 segmentBERT输入token embedding 字编码(21128, 768) segment embedding 句子编码(2, 768) position embedding不用给…

linux X64函数参数传递过程研究

linux X64函数参数传递过程研究 - ZhaoKevin - 博客园 基础知识 函数传参存在两种方式,一种是通过栈,一种是通过寄存器。对于x64体系结构,如果函数参数不大于6个时,使用寄存器传参,对于函数参数大于6个的函数,前六个参数使用寄存器传递,后面的使用栈传递。参数传递的规律…

使用systemback封装Ubuntu系统iso镜像

25年小橘祝亲们钱财发发发,好运来来来。小橘初八就已经开工了,不知道家人们是不是也像小橘一样苦哈哈。今天给亲们分享使用systemback封装Ubuntu系统iso镜像。 一、环境部署 1.安装systembackecho "deb [arch=amd64] http://mirrors.bwbot.org/ stable main" > …

免费+数据安全!手把手教你在PC跑DeepSeek-R1大模型,小白也能秒变AI大神!

0 为啥本地部署? 在本地运行 AI 模型具有以下优势:隐私:你的数据保留在你的机器上 — — 不存在共享敏感信息的风险 成本: DeepSeek R1 可免费使用,无需订阅费或使用费 控制:无需外部依赖即可进行微调和实验1 使用Ollama 1.1 下载并运行应用程序 直达官网:1.2 选择你的平…

mkv和ass字幕文件合并

主要使用两种工具:ffmpeg和mkvmerge 操作系统:windows10及以上 ffmpeg下载:https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl-shared.zip mkvmerge下载:https://mkvtoolnix.download/windows/releases/89.0/mkvtoolnix-64-…