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的时钟分频,哪位懂的大佬带带我。