stm32 驱动st7789 代码
时间: 2023-08-03 20:07:40 浏览: 187
以下是一个简单的STM32驱动ST7789的代码示例,仅供参考:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_gpio.h"
#define ST7789_RST_Pin GPIO_Pin_8
#define ST7789_RST_GPIO_Port GPIOD
#define ST7789_DC_Pin GPIO_Pin_9
#define ST7789_DC_GPIO_Port GPIOD
#define ST7789_CS_Pin GPIO_Pin_10
#define ST7789_CS_GPIO_Port GPIOD
void ST7789_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
// 初始化GPIO
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStruct.GPIO_Pin = ST7789_RST_Pin | ST7789_DC_Pin | ST7789_CS_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStruct);
// 初始化SPI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_InitStruct.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
// 复位ST7789
GPIO_SetBits(ST7789_RST_GPIO_Port, ST7789_RST_Pin);
GPIO_ResetBits(ST7789_RST_GPIO_Port, ST7789_RST_Pin);
GPIO_SetBits(ST7789_RST_GPIO_Port, ST7789_RST_Pin);
// 初始化ST7789
GPIO_SetBits(ST7789_CS_GPIO_Port, ST7789_CS_Pin);
// 设置显示方向
ST7789_WriteCommand(0x36);
ST7789_WriteData(0x08);
// 设置列地址范围
ST7789_WriteCommand(0x2A);
ST7789_WriteData(0x00);
ST7789_WriteData(0x00);
ST7789_WriteData(0x00);
ST7789_WriteData(0x7F);
// 设置行地址范围
ST7789_WriteCommand(0x2B);
ST7789_WriteData(0x00);
ST7789_WriteData(0x00);
ST7789_WriteData(0x00);
ST7789_WriteData(0x9F);
// 设置像素格式
ST7789_WriteCommand(0x3A);
ST7789_WriteData(0x05);
// 设置显示开关
ST7789_WriteCommand(0x29);
}
void ST7789_WriteCommand(uint8_t cmd)
{
GPIO_ResetBits(ST7789_DC_GPIO_Port, ST7789_DC_Pin);
GPIO_ResetBits(ST7789_CS_GPIO_Port, ST7789_CS_Pin);
SPI_I2S_SendData(SPI1, cmd);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(ST7789_CS_GPIO_Port, ST7789_CS_Pin);
}
void ST7789_WriteData(uint8_t data)
{
GPIO_SetBits(ST7789_DC_GPIO_Port, ST7789_DC_Pin);
GPIO_ResetBits(ST7789_CS_GPIO_Port, ST7789_CS_Pin);
SPI_I2S_SendData(SPI1, data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
GPIO_SetBits(ST7789_CS_GPIO_Port, ST7789_CS_Pin);
}
int main(void)
{
ST7789_Init();
while(1)
{
// 在屏幕上显示一些内容
ST7789_WriteCommand(0x2C); // 写入显示数据
for(int i=0; i<240; i++)
{
for(int j=0; j<240; j++)
{
ST7789_WriteData(0xFF);
ST7789_WriteData(0x00);
ST7789_WriteData(0x00);
}
}
}
}
```
注意,这只是一个简单的示例代码,实际应用中可能需要更多的调试和优化。
阅读全文