前言
SDRAM 配置
在开始此篇文章之前,首先要把 SDRAM 配置好,可以看我的上一篇文章:
【STM32H743IIT6 系列】将外部SDRAM作为内部RAM使用的超简单方法
没有将 SDRAM 作为内部 RAM 使用的朋友可以选择性看上面这篇文章。
屏幕
这里我使用的是正点原子的 800 * 480的 4.3寸 RGBLCD 屏幕,如下图所示:
CubeMX配置
引脚配置
首先要注意的就是 MCU 引脚对应屏幕接口的 LTDC 引脚是否正确,我使用的是反客的 H743,下面是引脚对应图:
(还有 LTDC_BL 背光引脚需要我们自己定义,设置为高电平开漏输出上拉模式即可)
LTDC 配置
为了节省资源,我们使用的是 RGB565 模式:
Parameter Settings
Layer Settings
NVIC Settings
测试代码
点击查看代码
/* USER CODE BEGIN 0 */uint16_t* fb_addr = (uint16_t*)((uint32_t)0xC0000000);
void LTDC_LCD_Fill(uint16_t* fb, uint16_t color, uint32_t length)
{uint16_t* tmp_fb = fb;for (uint32_t i = 0; i < length; i++) {*(tmp_fb + i) = color;}
}/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MPU Configuration--------------------------------------------------------*/MPU_Config();/* Enable the CPU Cache *//* Enable I-Cache---------------------------------------------------------*/SCB_EnableICache();/* Enable D-Cache---------------------------------------------------------*/SCB_EnableDCache();/* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_FMC_Init();MX_LTDC_Init();/* USER CODE BEGIN 2 */Set_Current_USART(USART1_IDX);printf("SDRAM 初始化通过!\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){SCB_CleanInvalidateDCache();while (!(LTDC->CDSR & LTDC_CDSR_VSYNCS));LTDC_LCD_Fill(fb_addr, (uint16_t)0xF800, (uint32_t)480 * 800 * 2);HAL_Delay(100);SCB_CleanInvalidateDCache();while (!(LTDC->CDSR & LTDC_CDSR_VSYNCS));LTDC_LCD_Fill(fb_addr, (uint16_t)0x07E0, (uint32_t)480 * 800 * 2);HAL_Delay(100);SCB_CleanInvalidateDCache();while (!(LTDC->CDSR & LTDC_CDSR_VSYNCS));LTDC_LCD_Fill(fb_addr, (uint16_t)0x001F, (uint32_t)480 * 800 * 2);HAL_Delay(100);SCB_CleanInvalidateDCache();while (!(LTDC->CDSR & LTDC_CDSR_VSYNCS));LTDC_LCD_Fill(fb_addr, (uint16_t)0xFFFF, (uint32_t)480 * 800 * 2);HAL_Delay(100);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}