新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2018-4-26
- 在线时间
- 16 小时
|
50金钱
屏幕撕裂问题:
显示屏分辨率为240x320,芯片为st7789v2;当使用指令0x36初始化屏幕默认方向(竖屏)时刷新界面不会出现撕裂问题,但初始化为横屏,刷新界面则会出现对角线撕裂情况。
LTDC初始化代码:
- /* USER CODE BEGIN 0 */
- #include "st7789.h"
- #if defined LCD_VER
- #define HSYNC ((uint16_t)10) /* Horizontal synchronization */
- #define HBP ((uint16_t)10) /* Horizontal back porch */
- #define HFP ((uint16_t)38) /* Horizontal front porch */
- #define VSYNC ((uint16_t)4) /* Vertical synchronization */
- #define VBP ((uint16_t)4) /* Vertical back porch */
- #define VFP ((uint16_t)8) /* Vertical front porch */
- #elif defined LCD_HOR
- #define HSYNC ((uint16_t)4) /* Horizontal synchronization */
- #define HBP ((uint16_t)4) /* Horizontal back porch */
- #define HFP ((uint16_t)8) /* Horizontal front porch */
- #define VSYNC ((uint16_t)10) /* Vertical synchronization */
- #define VBP ((uint16_t)10) /* Vertical back porch */
- #define VFP ((uint16_t)38) /* Vertical front porch */
- #endif
- #define TRIGGER_LINE (VSYNC + VBP + HEIGHT) //1
- /* USER CODE END 0 */
- LTDC_HandleTypeDef hltdc;
- /* LTDC init function */
- void MX_LTDC_Init(void)
- {
- /* USER CODE BEGIN LTDC_Init 0 */
- /* USER CODE END LTDC_Init 0 */
- LTDC_LayerCfgTypeDef pLayerCfg = {0};
- /* USER CODE BEGIN LTDC_Init 1 */
- /* USER CODE END LTDC_Init 1 */
- hltdc.Instance = LTDC;
- hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
- hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
- hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
- hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
-
- hltdc.Init.HorizontalSync = (HSYNC - 1);
- hltdc.Init.VerticalSync = (VSYNC - 1);
- hltdc.Init.AccumulatedHBP = (HSYNC + HBP - 1);
- hltdc.Init.AccumulatedVBP = (VSYNC + VBP - 1);
- hltdc.Init.AccumulatedActiveH = (HEIGHT + VSYNC + VBP - 1);
- hltdc.Init.AccumulatedActiveW = (WIDTH + HSYNC + HBP - 1);
- hltdc.Init.TotalHeigh = (HEIGHT + VSYNC + VBP + VFP - 1);
- hltdc.Init.TotalWidth = (WIDTH + HSYNC + HBP + HFP - 1);
- hltdc.Init.Backcolor.Blue = 0;
- hltdc.Init.Backcolor.Green = 0;
- hltdc.Init.Backcolor.Red = 0;
- if (HAL_LTDC_Init(&hltdc) != HAL_OK)
- {
- Error_Handler();
- }
- pLayerCfg.WindowX0 = 0;
- pLayerCfg.WindowX1 = WIDTH;
- pLayerCfg.WindowY0 = 0;
- pLayerCfg.WindowY1 = HEIGHT;
- pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
- pLayerCfg.Alpha = 255;
- pLayerCfg.Alpha0 = 0;
- pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
- pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
- pLayerCfg.FBStartAdress = LCD_FRAME_BUF_ADDR;
- pLayerCfg.ImageWidth = WIDTH;
- pLayerCfg.ImageHeight = HEIGHT;
- pLayerCfg.Backcolor.Blue = 0;
- pLayerCfg.Backcolor.Green = 0;
- pLayerCfg.Backcolor.Red = 0;
- if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN LTDC_Init 2 */
- HAL_LTDC_ProgramLineEvent(&hltdc, TRIGGER_LINE);
- __HAL_LTDC_ENABLE_IT(&hltdc, LTDC_IT_LI);
- /* USER CODE END LTDC_Init 2 */
- }
- void HAL_LTDC_MspInit(LTDC_HandleTypeDef* ltdcHandle)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
- if(ltdcHandle->Instance==LTDC)
- {
- /* USER CODE BEGIN LTDC_MspInit 0 */
- /* USER CODE END LTDC_MspInit 0 */
- /** Initializes the peripherals clock
- */
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
- PeriphClkInitStruct.PLL3.PLL3M = 2;
- PeriphClkInitStruct.PLL3.PLL3N = 30;
- PeriphClkInitStruct.PLL3.PLL3P = 2;
- PeriphClkInitStruct.PLL3.PLL3Q = 10;
- PeriphClkInitStruct.PLL3.PLL3R = 58;
- PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3;
- PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
- PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /* LTDC clock enable */
- __HAL_RCC_LTDC_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- /**LTDC GPIO Configuration
- PC0 ------> LTDC_R5
- PA3 ------> LTDC_B5
- PA4 ------> LTDC_VSYNC
- PA5 ------> LTDC_R4
- PA6 ------> LTDC_G2
- PB0 ------> LTDC_R3
- PB1 ------> LTDC_R6
- PE11 ------> LTDC_G3
- PE12 ------> LTDC_B4
- PE13 ------> LTDC_DE
- PE14 ------> LTDC_CLK
- PE15 ------> LTDC_R7
- PB10 ------> LTDC_G4
- PB11 ------> LTDC_G5
- PD10 ------> LTDC_B3
- PG8 ------> LTDC_G7
- PC6 ------> LTDC_HSYNC
- PC7 ------> LTDC_G6
- PB8 ------> LTDC_B6
- PB9 ------> LTDC_B7
- */
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_6|GPIO_PIN_7;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF9_LTDC;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
- |GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_8|GPIO_PIN_9;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_10;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_8;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
- HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
- /* LTDC interrupt Init */
- HAL_NVIC_SetPriority(LTDC_IRQn, 0x00, 0);
- HAL_NVIC_EnableIRQ(LTDC_IRQn);
- /* USER CODE BEGIN LTDC_MspInit 1 */
-
-
- /* USER CODE END LTDC_MspInit 1 */
- }
- }
- void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* ltdcHandle)
- {
- if(ltdcHandle->Instance==LTDC)
- {
- /* USER CODE BEGIN LTDC_MspDeInit 0 */
- /* USER CODE END LTDC_MspDeInit 0 */
- /* Peripheral clock disable */
- __HAL_RCC_LTDC_CLK_DISABLE();
- /**LTDC GPIO Configuration
- PC0 ------> LTDC_R5
- PA3 ------> LTDC_B5
- PA4 ------> LTDC_VSYNC
- PA5 ------> LTDC_R4
- PA6 ------> LTDC_G2
- PB0 ------> LTDC_R3
- PB1 ------> LTDC_R6
- PE11 ------> LTDC_G3
- PE12 ------> LTDC_B4
- PE13 ------> LTDC_DE
- PE14 ------> LTDC_CLK
- PE15 ------> LTDC_R7
- PB10 ------> LTDC_G4
- PB11 ------> LTDC_G5
- PD10 ------> LTDC_B3
- PG8 ------> LTDC_G7
- PC6 ------> LTDC_HSYNC
- PC7 ------> LTDC_G6
- PB8 ------> LTDC_B6
- PB9 ------> LTDC_B7
- */
- HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_6|GPIO_PIN_7);
- HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
- HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
- |GPIO_PIN_8|GPIO_PIN_9);
- HAL_GPIO_DeInit(GPIOE, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
- |GPIO_PIN_15);
- HAL_GPIO_DeInit(GPIOD, GPIO_PIN_10);
- HAL_GPIO_DeInit(GPIOG, GPIO_PIN_8);
- /* LTDC interrupt Deinit */
- HAL_NVIC_DisableIRQ(LTDC_IRQn);
- /* USER CODE BEGIN LTDC_MspDeInit 1 */
- /* USER CODE END LTDC_MspDeInit 1 */
- }
- }
- /* USER CODE BEGIN 1 */
- volatile uint16_t x_addr = 0, y_addr = 0;
- void HAL_LTDC_LineIRQ(void)
- {
- // if (hltdc.Instance->ISR & LTDC_ISR_LIF) {
- // x_addr = hltdc.Instance->CPSR >> 16;
- // y_addr = hltdc.Instance->CPSR & 0xFFFF;
- // LTDC->SRCR = LTDC_SRCR_VBR;
- // hltdc.Instance->ICR = LTDC_ICR_CLIF;
- // }
- // if (hltdc.Instance->ISR & LTDC_ISR_RRIF) {
- // if (frame_ready == 1) {
- // frame_ready = 0;
- // active_buf = pending_buf;
- // LTDC_Layer1->CFBAR = (uint32_t)&lcd_frame_buffer[active_buf][0];
- // LTDC->SRCR = LTDC_SRCR_IMR;
- // draw_buf ^= 1;
- // }
- // hltdc.Instance->ICR = LTDC_ICR_CRRIF;
- // }
- }
- void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc)
- {
- x_addr = hltdc->Instance->CPSR >> 16;
- y_addr = hltdc->Instance->CPSR & 0xFFFF;
- if ((frame_ready == 1) && (y_addr == TRIGGER_LINE)) { //
- LTDC_LAYER(hltdc, 0)->CFBAR = (uint32_t)&lcd_frame_buffer[pending_buf][0];
- hltdc->Instance->SRCR = LTDC_SRCR_IMR;
- frame_ready = 0;
- draw_buf ^= 1;
- HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_3);
- }
- __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_LI);
- }
- void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc)
- {
- __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_RR);
- }
- /* USER CODE END 1 */
复制代码 st7789.c代码
- #include "stm32h7xx_hal.h"
- #include "st7789.h"
- /*-------------------------------------config---------------------------------------------*/
- #define SET_SDIN_IN() {GPIOF->MODER &= 0xCFFFFFFF;}
- #define SET_SDIN_OUT() {GPIOF->MODER &= 0xCFFFFFFF; GPIOF->MODER |= 0x01<28;}
- #define SDIN_H HAL_GPIO_WritePin(GPIOF,GPIO_PIN_14,GPIO_PIN_SET)
- #define SDIN_L HAL_GPIO_WritePin(GPIOF,GPIO_PIN_14,GPIO_PIN_RESET)
- #define SDIN_IN (GPIOF->IDR & GPIO_PIN_14)
- #define CS_H HAL_GPIO_WritePin(GPIOG,GPIO_PIN_0,GPIO_PIN_SET)
- #define CS_L HAL_GPIO_WritePin(GPIOG,GPIO_PIN_0,GPIO_PIN_RESET)
- #define RST_H HAL_GPIO_WritePin(GPIOG,GPIO_PIN_1,GPIO_PIN_SET)
- #define RST_L HAL_GPIO_WritePin(GPIOG,GPIO_PIN_1,GPIO_PIN_RESET)
- #define SCL_H HAL_GPIO_WritePin(GPIOF,GPIO_PIN_15,GPIO_PIN_SET)
- #define SCL_L HAL_GPIO_WritePin(GPIOF,GPIO_PIN_15,GPIO_PIN_RESET)
- #define BL_CTRL_ON() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET)
- #define BL_CTRL_OFF() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_RESET)
- /*-----------------------------------------------------------------------------------------*/
- //刷新率 = LTDC CLK /((Width + HSYNC_W + HBP + HFP )*(Height + VSYNC_W + VBP +VFP ))
- // 344 *272
- #define PIXSIZE 2
- #define LCD_FRAME_BUF_SIZE (WIDTH*HEIGHT)
- //uint16_t lcd_buffer[LCD_FRAME_BUF_SIZE];
- //绑定到链接脚本的.lcd_frame_buf段,分配到0x24000000起始地址
- __attribute__((section(".lcd_frame_buf"), aligned(32))) uint16_t lcd_frame_buffer[2][LCD_FRAME_BUF_SIZE]; //
- volatile uint8_t pending_buf = 0; // 等待切换的缓冲区索引
- volatile uint8_t frame_ready = 0; // 后缓冲绘制完成标志
- uint8_t draw_buf = 1; // 当前绘制缓冲区索引
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 简单延时函数
- * 形 参: us 延时值
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void st7789_delay(uint16_t us)
- {
- int i,j;
- for(j=0;j<us;j++)
- for(i=0;i<60;i++);
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 毫秒延时函数
- * 形 参: ms 延时值
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void st7789_delay_ms(uint16_t ms)
- {
- HAL_Delay(ms);
- // osDelay(ms);
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 发送一个字节数据
- * 形 参: byte 字节数据
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void st7789_send_data(uint8_t byte)
- {
- int i;
- CS_L;
- SCL_L;
- SDIN_H;
- st7789_delay(10);
- SCL_H;
- st7789_delay(10);
- for(i=0;i<8;i++)
- {
- if(byte&0x80)
- {
- SDIN_H;
- }
- else
- {
- SDIN_L;
- }
- SCL_L;
- st7789_delay(10);
- SCL_H;
- st7789_delay(10);
- byte <<= 1;
- }
- CS_H;
- st7789_delay(1);
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 发送一个字节命令
- * 形 参: byte 字节数据
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void st7789_send_cmd(uint8_t byte)
- {
- int i;
- CS_L;
- SCL_L;
- SDIN_L;
- st7789_delay(10);
- SCL_H;
- st7789_delay(10);
- //SCL_L;
- for(i=0;i<8;i++)
- {
- if(byte&0x80)
- {
- SDIN_H;
- }
- else
- {
- SDIN_L;
- }
- SCL_L;
- st7789_delay(10);
- SCL_H;
- st7789_delay(10);
- byte <<= 1;
- }
- CS_H;
- st7789_delay(1);
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 发送一个字节命令
- * 形 参: byte 字节数据
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static uint8_t st7789_read_reg(uint8_t reg)
- {
- uint8_t res = 0;
- int i;
- CS_L;
- SCL_L;
- SDIN_L;
- st7789_delay(10);
- SCL_H;
- st7789_delay(10);
- //SCL_L;
- for(i=0;i<8;i++)
- {
- if(reg&0x80)
- {
- SDIN_H;
- }
- else
- {
- SDIN_L;
- }
- SCL_L;
- st7789_delay(10);
- SCL_H;
- st7789_delay(10);
- reg <<= 1;
- }
- st7789_delay(1);
- SET_SDIN_IN();
- for(i=0;i<8;i++)
- {
- SCL_L;
- st7789_delay(10);
- SCL_H;
- if(SDIN_IN)
- {
- res |= 0x01<<(7-i);
- }
- st7789_delay(10);
- }
- CS_H;
- SET_SDIN_OUT();
- return res;
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: IO初始化
- * 形 参: 无
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void st7789_gpio_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOF_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- __HAL_RCC_GPIOD_CLK_ENABLE();
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOF, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOG, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
- /*Configure GPIO pins : PF0 PF1 PF2 PF3
- PF4 */
- GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
- HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
- //背光控制
- GPIO_InitStruct.Pin = GPIO_PIN_14;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 设置显示窗口
- * 形 参: xstar:x开始位置;ystar:y开始位置
- * xend:x结束位置; yend:y结束位置
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_set_windows(uint16_t xstar, uint16_t ystar, uint16_t xend, uint16_t yend)
- {
- if ((xstar > (WIDTH - 1)) || (xend > (WIDTH - 1)) || (xend < xstar))
- return ;
- if ((ystar > (HEIGHT - 1)) || (yend > (HEIGHT - 1)) || (yend < ystar))
- return ;
- st7789_send_cmd(0x2a);
- st7789_send_data(xstar >> 8);
- st7789_send_data(0x00FF & xstar);
- st7789_send_data(xend >> 8);
- st7789_send_data(0x00FF & xend);
- st7789_send_cmd(0x2b);
- st7789_send_data(ystar >> 8);
- st7789_send_data(0x00FF & ystar);
- st7789_send_data(yend >> 8);
- st7789_send_data(0x00FF & yend);
- // st7789_send_cmd(0x2c);
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 设置屏幕
- * 形 参: w: 宽;h:高;dir 方向
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void st7789_set_screen(uint16_t w, uint16_t h, uint8_t dir)
- {
- st7789_send_cmd(0x36);
- st7789_send_data(dir);
- //设置显示窗口
- st7789_set_windows(0, 0, w - 1, h - 1);
-
- }
- #if 1
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 画点函数
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_draw_point(uint16_t sx, uint16_t sy, uint16_t color)
- {
- if (sx >= WIDTH) {
- sx = WIDTH - 1;
- }
- if (sy >= HEIGHT)
- sy = HEIGHT - 1;
- lcd_frame_buffer[0][sy*WIDTH + sx] = color;
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 画水平线
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_draw_hline(uint16_t sx, uint16_t sy, uint16_t len , uint16_t color)
- {
- uint16_t i;
-
- for (i = 0; i < len; i++)
- {
- st7789_draw_point(sx + i , sy , color);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 画垂直线
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_draw_vline(uint16_t sx, uint16_t sy, uint16_t len , uint16_t color)
- {
- uint16_t i;
-
- for (i = 0; i < len; i++)
- {
- st7789_draw_point(sx, sy + i, color);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 画矩形
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_draw_rect(uint16_t sx, uint16_t sy, uint16_t height, uint16_t width, uint16_t color)
- {
- /*
- ---------------->---
- |(sX,sY) |
- V V Height
- | |
- ---------------->---
- Width
- */
- st7789_draw_hline(sx, sy, width, color);
- st7789_draw_vline(sx + width - 1, sy, height, color);
- st7789_draw_hline(sx, sy + height - 1, width, color);
- st7789_draw_vline(sx, sy, height, color);
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 填充矩形
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_draw_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color)
- {
- uint16_t i,j;
-
- for (i = sy; i < ey; i++) {
- for (j = sx; j < ex; j++) {
- st7789_draw_point(j, i, color);
- }
- }
- }
- #endif
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: 背光控制
- * 形 参: sta: 0 关闭背光; 1 打开背光
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_backlight_ctrl(uint8_t sta)
- {
- if (sta) {
- BL_CTRL_ON();
- }
- else {
- BL_CTRL_OFF();
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明: st7789初始化
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void lcd_ex_st7789_reginit(void)
- {
- st7789_gpio_init();
-
- st7789_send_cmd(0x11);
- st7789_delay_ms(120);
- st7789_send_cmd(0x3A);
- st7789_send_data(0x55);
- st7789_send_cmd(0xB2);
- st7789_send_data(0x0C);
- st7789_send_data(0x0C);
- st7789_send_data(0x00);
- st7789_send_data(0x33);
- st7789_send_data(0x33);
- st7789_send_cmd(0xB7);
- st7789_send_data(0x35);
- st7789_send_cmd(0xBB); /* vcom */
- st7789_send_data(0x32); /* 32 */
-
- //------------------------------------RGB set-----------------------------------------//
- st7789_send_cmd(0xB0);
- st7789_send_data(0x11);
- st7789_send_data(0xf0);
-
- st7789_send_cmd(0xB1);
- st7789_send_data(0x40); //4
- st7789_send_data(0x14);
- st7789_send_data(0x14);
- st7789_send_cmd(0xC0);
- st7789_send_data(0x2C);
- #if 1
- st7789_send_cmd(0xC2);
- st7789_send_data(0x01);
- st7789_send_cmd(0xC3); /* vrh */
- st7789_send_data(0x10); /* 17 0D */
- st7789_send_cmd(0xC4); /* vdv */
- st7789_send_data(0x20); /* 20 */
- st7789_send_cmd(0xC6);
- st7789_send_data(0x0f);
- st7789_send_cmd(0xD0);
- st7789_send_data(0xA4);
- st7789_send_data(0xA1);
- st7789_send_cmd(0xE0); /* Set Gamma */
- st7789_send_data(0xd0);
- st7789_send_data(0x00);
- st7789_send_data(0x02);
- st7789_send_data(0x07);
- st7789_send_data(0x0a);
- st7789_send_data(0x28);
- st7789_send_data(0x32);
- st7789_send_data(0x44);
- st7789_send_data(0x42);
- st7789_send_data(0x06);
- st7789_send_data(0x0e);
- st7789_send_data(0x12);
- st7789_send_data(0x14);
- st7789_send_data(0x17);
- st7789_send_cmd(0xE1); /* Set Gamma */
- st7789_send_data(0xd0);
- st7789_send_data(0x00);
- st7789_send_data(0x02);
- st7789_send_data(0x07);
- st7789_send_data(0x0a);
- st7789_send_data(0x28);
- st7789_send_data(0x31);
- st7789_send_data(0x54);
- st7789_send_data(0x47);
- st7789_send_data(0x0e);
- st7789_send_data(0x1c);
- st7789_send_data(0x17);
- st7789_send_data(0x1b);
- st7789_send_data(0x1e);
- #endif
- st7789_set_screen(WIDTH, HEIGHT, DIR);
- st7789_send_cmd(0x29); /* display on */
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明:
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- uint8_t st7789_test_index = 0;
- uint16_t st7789_test_color = 0;
- void st7789_screen_test(void)
- {
- st7789_test_color = 0x00ff;
- st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
- //
- st7789_backlight_ctrl(1);
-
- while(1){
- switch(st7789_test_index) {
- case 1:
- st7789_test_index = 0;
- st7789_test_color = ~st7789_test_color;
- st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
- break;
- case 2:
- st7789_test_index = 0;
- st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
- break;
- case 3:
- st7789_test_index = 0;
- st7789_ltdc_fill(0, 0, 100, 50, st7789_test_color);
- break;
- case 4:
- st7789_test_index = 0;
- st7789_ltdc_fill(50, 50, 100, 100, st7789_test_color);
- break;
- case 5:
- st7789_test_index = 0;
- st7789_ltdc_fill(100, 100, 150, 150, st7789_test_color);
- break;
- case 6:
- st7789_test_index = 0;
- st7789_ltdc_fill(150, 150, 200, 200, st7789_test_color);
- break;
- case 7:
- st7789_test_index = 0;
- st7789_ltdc_fill(200, 200, 250, 239, st7789_test_color);
- break;
- case 8:
- st7789_test_color = ~st7789_test_color;
- st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
- break;
- case 9:
- st7789_ltdc_fill(100, 100, 150, 150, st7789_test_color);
- st7789_test_color += 100;
- break;
- }
- HAL_Delay(100);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名:
- * 功能说明:
- * 形 参:
- *
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void st7789_ltdc_fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color)
- {
- // 1. 边界检查:确保坐标在屏幕范围内
- if (sx >= WIDTH || sy >= HEIGHT || ex >= WIDTH || ey >= HEIGHT || ex < sx || ey < sy) {
- return;
- }
-
- uint32_t fill_width = ex - sx + 1;
- uint32_t fill_height = ey - sy + 1;
- uint32_t timeout = 0;
- uint16_t offline = WIDTH - fill_width; // 统一用 WIDTH 计算行偏移,适配横竖屏
- uint32_t frame_buf_addr = (uint32_t)&lcd_frame_buffer[draw_buf][0]; // 显存基地址 //draw_buf
-
- uint32_t dst_addr = frame_buf_addr + (sy * WIDTH + sx) * 2;
-
- while (!dma2d_get_tc_flag()) { // 或使用超时
- if (timeout++ > 1000)
- break;
- st7789_delay_ms(1);
- }
- dma2d_set_tc_flag(0);
-
- // 4. 停止并重置DMA2D
-
- DMA2D->CR &= ~DMA2D_CR_START;
- while (DMA2D->CR & DMA2D_CR_START); // 等待DMA2D停止
- DMA2D->IFCR = DMA2D_IFCR_CTCIF; // 清除所有标志
-
- // 5. 配置DMA2D(寄存器到存储器模式,填充纯色)
- DMA2D->CR = DMA2D_R2M | (1 << 9); // R2M=寄存器到存储器,BIT9=使能传输完成中断
- DMA2D->OCOLR = color; // 填充颜色(RGB565)
- DMA2D->OMAR = dst_addr; // 目标显存地址
- DMA2D->OOR = offline; // 行偏移(适配横竖屏)
- DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_RGB565; // 像素格式匹配
- DMA2D->NLR = (fill_height) | (fill_width << 16); // 行数 | 列数
-
- SCB_CleanDCache_by_Addr((uint32_t*)&lcd_frame_buffer[draw_buf][0], LCD_FRAME_BUF_SIZE*2);
- // 6. 启动DMA2D传输
- DMA2D->CR |= DMA2D_CR_START;
-
- }
复制代码 st7789.h
- #ifndef __ST7789_H
- #define __ST7789_H
- #include "stdint.h"
-
- #define MY 0x80
- #define MX 0x40
- #define MV 0x20
- #define ML 0x10
- #define RGB 0x08
- #define MH 0x04
- //#define LCD_VER
- #define LCD_HOR
- #if defined LCD_VER
- #define WIDTH ((uint16_t)240)//((uint16_t)320) /* LCD PIXEL WIDTH */
- #define HEIGHT ((uint16_t)320) //((uint16_t)240) /* LCD PIXEL HEIGHT */
- #define DIR 0
- #elif defined LCD_HOR
- #define WIDTH ((uint16_t)320) /* LCD PIXEL WIDTH */
- #define HEIGHT ((uint16_t)240) /* LCD PIXEL HEIGHT */
- #define DIR (MY|MV)//(MY|MV|ML|MH)
- #endif
- extern uint16_t lcd_frame_buffer[][WIDTH*HEIGHT]; //320*240
- #define LCD_FRAME_BUF_ADDR (uint32_t)&lcd_frame_buffer[0]
复制代码
|
-
竖屏刷新界面
-
横屏刷新界面
|