STMF103C8T6、cubemx配置硬件spi驱动 ST7789中景园电子屏幕

前言

本文记录了我移植厂家的ST7789的历程,由于厂家是用标准库写、软件模拟SPI的,现在我使用HAL库,以及硬件SPI来完成实验,使用的芯片是STM32F103C8T6,以免以后忘记。

1.cubemx配置

2.程序改写

#define LCD_RES_Clr()  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET)//RES
#define LCD_RES_Set()  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2.GPIO_PIN_SET)


#define LCD_DC_Clr()   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET)//DC
#define LCD_DC_Set()   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET)
 		     
#define LCD_CS_Clr()   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)//CS
#define LCD_CS_Set()   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)

#define LCD_BLK_Clr()  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET)//BLK
#define LCD_BLK_Set()  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET)

 

void LCD_Writ_Bus(u8 dat) 
{	
	LCD_CS_Clr();
	while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);//检查接收标志位
	HAL_SPI_Transmit(&hspi1, &dat, sizeof(dat), HAL_MAX_DELAY);
	LCD_CS_Set();
}

 

3.引脚连线

 PA1-->BLK

PA2-->RES

PA3-->DC

PA4-->CS

GND-->GND

VCC->3V3

4.实验现象

5.总结

更改代码的部分最主要的是把lcd_init.c中的LCD_Writ_Bus()函数改写成HAL库的形式,硬件SPI能加快数据的传输,我下次将实现硬件SPI+DMA的方式。

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要连接你的 OLED 显示屏到 STM32F103C8T6 开发板上。接下来,你需要进行以下步骤: 1. 配置 SPI 接口的时钟和引脚 ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; // SCK 和 MOSI 引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // OLED 的片选引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); ``` 2. 编写 OLED 显示函数 ```c void OLED_init(void) { OLED_write_cmd(0xAE);//--display off OLED_write_cmd(0x00);//---set low column address OLED_write_cmd(0x10);//---set high column address OLED_write_cmd(0x40);//--set start line address OLED_write_cmd(0xB0);//--set page address OLED_write_cmd(0x81);// contract control OLED_write_cmd(0xFF);//--128 OLED_write_cmd(0xA1);//set segment remap OLED_write_cmd(0xA6);//--normal / reverse OLED_write_cmd(0xA8);//--set multiplex ratio(1 to 64) OLED_write_cmd(0x3F);//--1/64 duty OLED_write_cmd(0xC8);//Com scan direction OLED_write_cmd(0xD3);//-set display offset OLED_write_cmd(0x00);// OLED_write_cmd(0xD5);//set osc division OLED_write_cmd(0x80); OLED_write_cmd(0xD9);//set pre-charge period OLED_write_cmd(0xF1); OLED_write_cmd(0xDA);//set com pins hardware configuration OLED_write_cmd(0x12); OLED_write_cmd(0xDB);//--set vcomh OLED_write_cmd(0x40); OLED_write_cmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02) OLED_write_cmd(0x02);// OLED_write_cmd(0xAF);//--turn on oled panel } ``` 3. 写 OLED 写数据函数 ```c void OLED_write_data(uint8_t data) { GPIO_ResetBits(GPIOA, GPIO_Pin_4); // 使能 OLED SPI_I2S_SendData(SPI1, data); // 发送数据 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送完毕 GPIO_SetBits(GPIOA, GPIO_Pin_4); // 禁能 OLED } ``` 4. 写 OLED 写命令函数 ```c void OLED_write_cmd(uint8_t cmd) { GPIO_ResetBits(GPIOA, GPIO_Pin_4); // 使能 OLED SPI_I2S_SendData(SPI1, 0x00); // 发送命令 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送完毕 SPI_I2S_SendData(SPI1, cmd); // 发送命令 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送完毕 GPIO_SetBits(GPIOA, GPIO_Pin_4); // 禁能 OLED } ``` 5. 编写主函数 ```c int main(void) { OLED_init(); // 初始化 OLED OLED_write_cmd(0xAF); // 打开 OLED while(1) { // 在这里写你的代码 } } ``` 以上就是使用 STM32F103C8T6 驱动 SPI 协议的 OLED 显示屏的基本步骤。需要注意的是,以上代码仅供参考,具体的实现方式可能会因为硬件和软件环境的不同而有所变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值