1、拷贝厂家提供的stm32f103的例程到工程中:

2、LCD屏的驱动,如果用模拟SPI那就需要用到SCK、MOSI这两个IO,还有就DC用来表示是数据还是命令,还有RST在屏初始化是需要拉低几百毫秒然后高电平。CS的话如果是单独享用这个SPI通道,那也可不用初始化,直接把屏的CS接地就行了。我这里先定义好这几个驱动的IO,用宏定义如下:
//-----------------测试LED端口定义----------------
#define OLED_PORT GPIOA
#define OLED_SCL_PIN GPIO_Pin_5
#define OLED_SDA_PIN GPIO_Pin_7
#define OLED_RES_PIN GPIO_Pin_2
#define OLED_DC_PIN GPIO_Pin_3
#define OLED_CS_PIN GPIO_Pin_4
复制代码#define OLED_SCL_Clr() OLED_PORT->BRR = OLED_SCL_PIN //SCL
#define OLED_SCL_Set() OLED_PORT->BSRR = OLED_SCL_PIN
#define OLED_SDA_Clr() OLED_PORT->BRR = OLED_SDA_PIN //SDA
#define OLED_SDA_Set() OLED_PORT->BSRR = OLED_SDA_PIN
#define OLED_RES_Clr() OLED_PORT->BRR = OLED_RES_PIN //RES
#define OLED_RES_Set() OLED_PORT->BSRR = OLED_RES_PIN
#define OLED_DC_Clr() OLED_PORT->BRR = OLED_DC_PIN //DC
#define OLED_DC_Set() OLED_PORT->BSRR = OLED_DC_PIN
#define OLED_CS_Clr() OLED_PORT->BRR = OLED_CS_PIN //CS
#define OLED_CS_Set() OLED_PORT->BSRR = OLED_CS_PIN
4、对使用的端口进行初始化,我直接把这几个IO配置为高速输模式,代码如下:
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_Init(OLED_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = OLED_SCL_PIN | OLED_SDA_PIN | OLED_RES_PIN | OLED_DC_PIN | OLED_CS_PIN ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(OLED_PORT, &GPIO_InitStruct);
复制代码5、修改发送一个字节的函数如下:
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{
uint8_t 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();
delay_us();
OLED_SCL_Set();
delay_us();
dat<<=1;
}
OLED_CS_Set();
OLED_DC_Set();
}
复制代码最后在主程 序里添回测试代码:
int main(void)
{
PLATFORM_Init();
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
OLED_ShowPicture(0,0,128,64,BMP1,1);
OLED_Refresh();
while (1)
{
}
}
复制代码
【提示】
昨天我用官方的驱动进行了移植,结果一直跑不起来,今天找到原因,因为没有添回合适的延时,导至SCK时钟太快与屏不匹配。今天才调整好,我的100M的逻辑分析仪都 没有抓出对的时序,这是因为本MCU时钟为180M,没有去研究时钟,所以不会配置GPIO的时钟分频,哪位懂的大佬带带我。