stm32f103(移植HAL库)添加spi的OLED代码(含源码)
使用STM32CubeMX配置spi的OLDE代码,这里的oled代码是直接使用江协科技的oled驱动代码来移植的。先把spi的oled跑通,后面想改就很快,直接改引脚就行,文章结尾附源码和工程资料
目录
文章结尾附源码和工程资料
前言
使用STM32CubeMX配置spi的OLDE代码,这里的oled代码是直接使用江协科技的oled驱动代码来移植的。先把spi的oled跑通,后面想改就很快,直接改引脚就行,文章结尾附源码和工程资料
一. 准备环境
1.1 硬件连接部分
stm32f103c8t6,七针OLED屏,stlink下载器,面包板,杜邦线
这里是接线,直接连接起来就行(加上vcc和gnd一共7根线),参考上图先连接好
OLED_W_D0 PA5 (SPI时钟线)
OLED_W_D1 PA7 (SPI数据线)
OLED_W_RES PA6 (复位)
OLED_W_DC PA4 (spi数据/命令选择线)
OLED_W_CS PA3 (spi片选)
GND (电源地)
VCC (电源 3~5v)
1.2 软件部分
MDK 和 Stm32cubuMX ,使用Stm32cubuMX生成MKD工程,用MDK调试和编译烧录
1.3 OLED的SPI
OLED屏幕通常使用 SPI 或 I2C 接口进行通信。在 SPI 接口模式下,OLED屏幕的 D0 和 D1 引脚分别对应 SCK(时钟线)和 MOSI(主设备数据输出线)。这种配置的原因是 SPI 协议只需要一根时钟线和一根数据线来实现主设备到从设备的通信。
1.4 为什么只有 D0 和 D1
SPI 协议的简化:
SPI 协议通常需要四根线:SCK(时钟线)、MOSI(主设备数据输出线)、MISO(主设备数据输入线)和 CS(片选线)。但在许多应用场景中,尤其是单向通信(如从主设备到从设备的通信),MISO 线可以省略。
OLED屏幕通常只需要接收来自主设备(如微控制器)的数据,而不需要向主设备发送数据,因此可以省略 MISO 线。
引脚功能:
D0:在 SPI 通信中,D0 被用作 SCK(时钟线),用于同步数据传输。
D1:在 SPI 通信中,D1 被用作 MOSI(主设备数据输出线),用于将数据从主设备发送到 OLED 屏幕。
硬件设计:
OLED屏幕的硬件设计通常会根据实际需求进行简化,以减少引脚数量和复杂性。通过只使用 D0 和 D1,可以简化硬件设计,同时满足大多数应用场景的需求。
二. Stm32cubuMX 配置
2.1 选择MCU
这里选择stm32f103c8t6
2.2 配置时钟和debug
1.配置外部晶振 2.仅启用SWD调试接口
2.3 配置外部时钟
配置时钟:选择外部高速时钟,72MHZ
2.4 配置spi1模式
配置spi1 -> Transmit Only Master(仅发送主机信号) -> 分频器倍数:4
这里相当于配置 D0和D1
OLED_W_D0 PA5 (SPI时钟线)
OLED_W_D1 PA7 (SPI数据线)
2.5 配置RES DC CS
这里配置RES,DC,CS,这里都三根线都选择GPIO_Output
OLED_W_RES PA6 (复位)
OLED_W_DC PA4 (spi数据/命令选择线)
OLED_W_CS PA3 (spi片选)
2.6 生成MDK工程
设置:工程名和存放路径,选择MDK平台,选择版本我这里选v5.32,mdk版本低的选v5
生成MKD工程
直接点击Close关闭
点击关闭,接着打开MKD路径
三. MDK文件修改
3.1 打开工程观察
打开生成mkd的目录,点击.uvprojx结尾这个文件,即可进入MDK
接着在MDK中打开看一下文件目录,这里有main.c gpio.c等这些文件,这些文件是前面使用stm32cubemx配置生成的初始化代码,这里的文件目录后续还需手动添加一个文件夹,用来存放oled代码,后续有详细介绍。
3.2 MDK中文件与路径添加
3.2.1 打开mdk项目位置文件夹
注意:打开存放stm32cubemx生成的mdk项目的位置,在该目录下,新建Hardware文件夹,如下图。
3.2.2 复制oled驱动代码
打开江协科技资料中的OLED驱动代码
把模块里面的OLED.c OLED.h 和 OLED_Font.h共3个文件全部复制到新建的Hardware文件夹中
复制到mdk工程中新建的hardware文件夹位置里面
接着打开MDK软件,在同级目录新建一个文件夹,存放OLED的驱动代码。右键选择:Add Group。如下图右边:这里就新建了一个名为New Group的文件夹
接着右键选择刚刚新建的New Group文件夹,再添加OLED驱动代码
注意: 添加之前存放在Hardware中的oled驱动文件
添加成功后,在MDK中的New Group文件夹点击就可以直接显示,这样就是添加成功了,但还要添加头文件路径
3.2.3 添加路径
接着添加头文件路径,路径是之前存放oled代码的Hardware的文件夹
头文件添加后还需要:
接着在下图选项中输入--no-multibyte-chars ,不输入的话可能会遇到中文字符编码报错
--no-multibyte-chars
3.2.4 烧录设置
设置下载debug,我这里使用的是stlink下载器下载,选择烧录后立即执行
四. OLED驱动文件修改
4.1 oled.c添加和修改
修改oled.c文件:这里注释掉的是原来江科大的,因为配置的引脚和标准库改变了,这里oled的3个文件中,只需要修改OLED.c的部分就行,如下图
oled.c hal库头文件和引脚修改(这里改成hal库的gpio函数)
oled.c初始化修改,这里改成hal库的gpio初始化函数
oled.c修改的地方
//#include "stm32f10x.h" #include "stm32f1xx_hal.h" #include "OLED_Font.h" ///*引脚配置*/ //#define OLED_W_D0(x) GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)(x)) //#define OLED_W_D1(x) GPIO_WriteBit(GPIOB, GPIO_Pin_13, (BitAction)(x)) //#define OLED_W_RES(x) GPIO_WriteBit(GPIOB, GPIO_Pin_14, (BitAction)(x)) //#define OLED_W_DC(x) GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(x)) //#define OLED_W_CS(x) GPIO_WriteBit(GPIOA, GPIO_Pin_8, (BitAction)(x)) /*引脚配置*/ #define OLED_W_D0(x) HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,(GPIO_PinState)(x)) #define OLED_W_D1(x) HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,(GPIO_PinState)(x)) #define OLED_W_RES(x) HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,(GPIO_PinState)(x)) #define OLED_W_DC(x) HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,(GPIO_PinState)(x)) #define OLED_W_CS(x) HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,(GPIO_PinState)(x)) /*引脚初始化*/ void OLED_SPI_Init(void) { // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // // GPIO_InitTypeDef GPIO_InitStructure; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; // GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // GPIO_Init(GPIOA, &GPIO_InitStructure); // 启用GPIOA和GPIOB的时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); //__HAL_RCC_GPIOB_CLK_ENABLE(); // 配置GPIOB的引脚12、13、14、15 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); OLED_W_D0(0); OLED_W_D1(1); OLED_W_RES(1); OLED_W_DC(1); OLED_W_CS(1); }
4.2 main.c修改
main.c修改的地方
main.c文件中这里添加 #include "oled.h"
main.c文件中添加oled的初始化和oled显示函数,
如下
/* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "spi.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "oled.h" /* USER CODE END Includes */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI1_Init(); /* USER CODE BEGIN 2 */ OLED_Init(); OLED_Clear(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { OLED_ShowString(1,1,"yesyesyes"); OLED_ShowString(2,1,"nononono"); HAL_Delay(500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
五. OLED显示效果
编译下载后,这样就可以了
源代码附件:https://download.csdn.net/download/weixin_61125362/92121778
本文章快速配置内容参考:b站博主锟锟0409_:连接如下https://www.bilibili.com/video/BV1PZ42177GM/?spm_id_from=333.1387.favlist.content.click&vd_source=ddd10a5e1227824a60d03b78a47ce68e
由于新项目需要SPI部分,我需要使用stm32快速配置,测试,跑通HAL库的SPI。参考B站该博主的视频添加测试OLED,我快速的配置,跑通SPI部分。
因为我拿vscode打开这个项目文件夹报红,所以往其他项目里面复制了个.vscode文件夹过来,解决插件报红问题。不影响使用
更多推荐




































所有评论(0)