目录

前言

一. 准备环境

1.1 硬件连接部分

1.2 软件部分

1.3 OLED的SPI

1.4 为什么只有 D0 和 D1

 二. Stm32cubuMX 配置

2.1 选择MCU

2.2 配置时钟和debug

2.3 配置外部时钟

2.4 配置spi1模式

2.5 配置gpio三根线

2.6 生成mdk工程

 三. MDK文件修改

3.1 打开工程观察

3.2 MDK中文件与路径添加

3.2.1 打开mdk项目位置文件夹

3.2.2 复制oled驱动代码

3.2.3 添加路径

3.2.4 烧录设置

四. OLED驱动文件修改

4.1 oled.c添加和修改

4.2 main.c修改

五. 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屏幕通常使用 SPII2C 接口进行通信。在 SPI 接口模式下,OLED屏幕的 D0D1 引脚分别对应 SCK(时钟线)和 MOSI(主设备数据输出线)。这种配置的原因是 SPI 协议只需要一根时钟线和一根数据线来实现主设备到从设备的通信。

1.4 为什么只有 D0 和 D1
  1. SPI 协议的简化

    • SPI 协议通常需要四根线:SCK(时钟线)、MOSI(主设备数据输出线)、MISO(主设备数据输入线)和 CS(片选线)。但在许多应用场景中,尤其是单向通信(如从主设备到从设备的通信),MISO 线可以省略。

    • OLED屏幕通常只需要接收来自主设备(如微控制器)的数据,而不需要向主设备发送数据,因此可以省略 MISO 线。

  2. 引脚功能

    • D0:在 SPI 通信中,D0 被用作 SCK(时钟线),用于同步数据传输。

    • D1:在 SPI 通信中,D1 被用作 MOSI(主设备数据输出线),用于将数据从主设备发送到 OLED 屏幕。

  3. 硬件设计

    OLED屏幕的硬件设计通常会根据实际需求进行简化,以减少引脚数量和复杂性。通过只使用 D0D1,可以简化硬件设计,同时满足大多数应用场景的需求。

 二. 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文件夹过来,解决插件报红问题。不影响使用

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐