#include "SWM221.h" #include "ST7789.h" /****************************************************************************************************************************************** * 函数名称: ST7789_Init() * 功能说明: TFT液晶屏初始化,TFT使用ST7789驱动,分辨率320*240,使用 ZJY320P1600TG11 测试 * 输 入: 无 * 输 出: 无 * 注意事项: 无 ******************************************************************************************************************************************/ void ST7789_Init(void) { MPU_InitStructure MPU_initStruct; PORT_Init(PORTA, PIN8, PORTA_PIN8_MPU_D0, 1); PORT_Init(PORTA, PIN9, PORTA_PIN9_MPU_D1, 1); PORT_Init(PORTA, PIN10, PORTA_PIN10_MPU_D2, 1); PORT_Init(PORTA, PIN11, PORTA_PIN11_MPU_D3, 1); PORT_Init(PORTA, PIN12, PORTA_PIN12_MPU_D4, 1); PORT_Init(PORTA, PIN13, PORTA_PIN13_MPU_D5, 1); PORT_Init(PORTA, PIN14, PORTA_PIN14_MPU_D6, 1); PORT_Init(PORTA, PIN0, PORTA_PIN0_MPU_D7, 1); PORT_Init(PORTB, PIN4, PORTB_PIN4_MPU_CS, 0); PORT_Init(PORTB, PIN5, PORTB_PIN5_MPU_RS, 0); PORT_Init(PORTB, PIN6, PORTB_PIN6_MPU_WR, 0); PORT_Init(PORTB, PIN9, PORTB_PIN9_MPU_RD, 0); MPU_initStruct.ByteOrder = MPU_BIG_ENDIAN; MPU_initStruct.RDHoldTime = 2; MPU_initStruct.WRHoldTime = 2; MPU_initStruct.CSFall_WRFall = 1; MPU_initStruct.WRRise_CSRise = 1; MPU_initStruct.RDCSRise_Fall = 2; MPU_initStruct.WRCSRise_Fall = 2; MPU_Init(MPU, &MPU_initStruct); GPIO_Init(GPIOB, PIN2, 1, 0, 0, 0); //屏幕背光 GPIO_SetBit(GPIOB, PIN2); GPIO_Init(GPIOB, PIN3, 1, 0, 0, 0); //屏幕复位 GPIO_ClrBit(GPIOB, PIN3); for(int i = 0; i < 1000000; i++) __NOP(); GPIO_SetBit(GPIOB, PIN3); for(int i = 0; i < 1000000; i++) __NOP(); uint32_t id = MPU_ReadReg(MPU, 0x04); // dummy read id = MPU->DRB << 16; id |= MPU->DRB << 8; id |= MPU->DRB << 0; if(id != 0x858552) { printf("ID = %06X, not ST7789V\n", id); } MPU_WR_REG8(MPU, 0x11); // Sleep out MPU_WR_REG8(MPU, 0x36); // Memory Access Control MPU_WR_DATA8(MPU, 0x00); MPU_WR_REG8(MPU, 0x3A); // Interface pixel format MPU_WR_DATA8(MPU, 0x05); //--------------------------------ST7789S Frame rate setting------------------------- MPU_WR_REG8(MPU, 0xb2); MPU_WR_DATA8(MPU, 0x0c); MPU_WR_DATA8(MPU, 0x0c); MPU_WR_DATA8(MPU, 0x00); MPU_WR_DATA8(MPU, 0x33); MPU_WR_DATA8(MPU, 0x33); MPU_WR_REG8(MPU, 0xb7); MPU_WR_DATA8(MPU, 0x35); //---------------------------------ST7789S Power setting----------------------------- MPU_WR_REG8(MPU, 0xbb); MPU_WR_DATA8(MPU, 0x20); MPU_WR_REG8(MPU, 0xc0); MPU_WR_DATA8(MPU, 0x2c); MPU_WR_REG8(MPU,0xc2); MPU_WR_DATA8(MPU, 0x01); MPU_WR_REG8(MPU, 0xc3); MPU_WR_DATA8(MPU, 0x0b); MPU_WR_REG8(MPU, 0xc4); MPU_WR_DATA8(MPU, 0x20); MPU_WR_REG8(MPU, 0xc6); MPU_WR_DATA8(MPU, 0x0f); MPU_WR_REG8(MPU, 0xd0); MPU_WR_DATA8(MPU, 0xa4); MPU_WR_DATA8(MPU, 0xa1); //--------------------------------ST7789S Gamma setting------------------------------ MPU_WR_REG8(MPU, 0xe0); MPU_WR_DATA8(MPU, 0xd0); MPU_WR_DATA8(MPU, 0x03); MPU_WR_DATA8(MPU, 0x09); MPU_WR_DATA8(MPU, 0x0e); MPU_WR_DATA8(MPU, 0x11); MPU_WR_DATA8(MPU, 0x3d); MPU_WR_DATA8(MPU, 0x47); MPU_WR_DATA8(MPU, 0x55); MPU_WR_DATA8(MPU, 0x53); MPU_WR_DATA8(MPU, 0X1A); MPU_WR_DATA8(MPU, 0x16); MPU_WR_DATA8(MPU, 0x14); MPU_WR_DATA8(MPU, 0x1F); MPU_WR_DATA8(MPU, 0x22); MPU_WR_REG8(MPU, 0xe1); MPU_WR_DATA8(MPU, 0xd0); MPU_WR_DATA8(MPU, 0x02); MPU_WR_DATA8(MPU, 0x08); MPU_WR_DATA8(MPU, 0x0D); MPU_WR_DATA8(MPU, 0x12); MPU_WR_DATA8(MPU, 0x2c); MPU_WR_DATA8(MPU, 0x43); MPU_WR_DATA8(MPU, 0x55); MPU_WR_DATA8(MPU, 0x53); MPU_WR_DATA8(MPU, 0x1E); MPU_WR_DATA8(MPU, 0x1B); MPU_WR_DATA8(MPU, 0x19); MPU_WR_DATA8(MPU, 0x20); MPU_WR_DATA8(MPU, 0x22); MPU_WR_REG8(MPU, 0x29); } /****************************************************************************************************************************************** * 函数名称: ST7789_SetCursor() * 功能说明: * 输 入: * 输 出: * 注意事项: ******************************************************************************************************************************************/ void ST7789_SetCursor(uint16_t x, uint16_t y) { MPU_WR_REG8(MPU, 0x2A); MPU_WR_DATA16(MPU, x); MPU_WR_REG8(MPU, 0x2B); MPU_WR_DATA16(MPU, y); } /****************************************************************************************************************************************** * 函数名称: ST7789_DrawPoint() * 功能说明: * 输 入: * 输 出: * 注意事项: ******************************************************************************************************************************************/ void ST7789_DrawPoint(uint16_t x, uint16_t y, uint16_t rgb) { ST7789_SetCursor(x, y); MPU_WR_REG8(MPU, 0x2C); MPU_WR_DATA16(MPU, rgb); } /****************************************************************************************************************************************** * 函数名称: ST7789_Clear() * 功能说明: * 输 入: * 输 出: * 注意事项: ******************************************************************************************************************************************/ void ST7789_Clear(uint16_t rgb) { uint32_t i, j; ST7789_SetCursor(0, 0); MPU_WR_REG8(MPU, 0x2C); for(i = 0; i < LCD_VPIX; i++) { for(j = 0; j < LCD_HPIX; j++) { MPU_WR_DATA16(MPU, rgb); } } } static uint32_t MPUDMA_Color; /****************************************************************************************************************************************** * 函数名称: ST7789_DMAClear() * 功能说明: 从坐标 x, y 处开始,以颜色 rgb 填充 n_rgb 个像素点 * 输 入: * 输 出: * 注意事项: 由于 DMA 最多搬运 65535 个数据,无法一次清除整屏屏幕,只能一块、一块清屏 ******************************************************************************************************************************************/ void ST7789_DMAClear(uint16_t x, uint16_t y, uint16_t rgb, uint16_t n_rgb) { DMA_InitStructure DMA_initStruct; MPUDMA_Color = rgb; ST7789_SetCursor(x, y); DMA_initStruct.Mode = DMA_MODE_SINGLE; DMA_initStruct.Unit = DMA_UNIT_HALFWORD; DMA_initStruct.Count = n_rgb; DMA_initStruct.MemoryAddr = (uint32_t)&MPUDMA_Color; DMA_initStruct.MemoryAddrInc = 0; DMA_initStruct.PeripheralAddr = (uint32_t)&MPU->DRH; DMA_initStruct.PeripheralAddrInc = 0; DMA_initStruct.Handshake = DMA_CH1_MPUTX; DMA_initStruct.Priority = DMA_PRI_LOW; DMA_initStruct.INTEn = 0; DMA_CH_Init(DMA_CH1, &DMA_initStruct); DMA_CH_Open(DMA_CH1); MPU->SR |= MPU_SR_DMAEN_Msk; MPU->IRB = 0x2C; } uint32_t ST7789_DMADone(void) { if(DMA_CH_INTStat(DMA_CH1, DMA_IT_DONE)) { DMA_CH_INTClr(DMA_CH1, DMA_IT_DONE); MPU->SR &= ~MPU_SR_DMAEN_Msk; return 1; } else { return 0; } }