一、CubeMx配置选项
1.SPI配置
关于时钟和调试的配置就不写了,直接上SPI的配置图。
主要注意是是上面两个框框,这里选择了SPI只发送不接收,因为SPI驱动OLED只需要发送数据。片选选择硬件片选,这里也可以选择软件片选。在代码做调整即可。然后就是空闲时钟电平和数据沿的选择,具体可以了解SPI协议部分,注意不能错。
2.数据命令和复位引脚配置
具体的引脚配置根据自己的连线方式来进行选择。
二、代码修改
这里我选择了中景园提供的官方历程进行修改。
1.头文件和关键字修改
代码如下:
需要包含一下main.h头文件
#ifndef __OLED_H
#define __OLED_H
#include "main.h"
//替换一下官方程序的关键字,我这里使用notepad++进行了批量替换
uint8_t //替换u8
uint16_t //替换u16
uint32_t //替换u32
2.宏定义替换
代码如下:
GPIO函数替换为HAL库函数
#define OLED_RES_Clr() HAL_GPIO_WritePin(OLED_RES_GPIO_Port, OLED_RES_Pin, GPIO_PIN_RESET)//RES
#define OLED_RES_Set() HAL_GPIO_WritePin(OLED_RES_GPIO_Port, OLED_RES_Pin, GPIO_PIN_SET)
#define OLED_DC_Clr() HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_RESET)//DC
#define OLED_DC_Set() HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_SET)
//其余的时钟和信号和片选可以删除,因为我们使用了硬件SPI
3.OLED初始化和SPI函数替换
初始化函数修改
void OLED_Init(void)
{
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能A端口时钟
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
// GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_15);
MX_GPIO_Init();
MX_SPI1_Init();
...................
}
替换软件SPI为硬件SPI
//void OLED_WR_Byte(u8 dat,u8 cmd)
//{
// u8 i;
// if(cmd)
// OLED_DC_Set();
// else
// OLED_DC_Clr();
// OLED_CS_Clr();
// for(i=0;i<8;i++)
// {
// OLED_SCL_Clr();
// if(dat&0x80)
// OLED_SDA_Set();
// else
// OLED_SDA_Clr();
// OLED_SCL_Set();
// dat<<=1;
// }
// OLED_CS_Set();
// OLED_DC_Set();
//}
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
HAL_SPI_Transmit(&hspi1, &dat, 1, 0x00FF);
OLED_DC_Set();
}
三、主函数验证
主函数验证
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
OLED_ShowString(8,16,"ZHONGJINGYUAN",16,1);
OLED_Refresh();