Просмотр исходного кода

Merge pull request #2215 from SummerGGift/add_stm32_new_framework

[bsp][stm32] optimize docs && add lcd driver for f4 series bsp
Bernard Xiong 6 лет назад
Родитель
Сommit
1acb6418f6
28 измененных файлов с 1802 добавлено и 441 удалено
  1. 8 8
      bsp/stm32/docs/STM32系列BSP制作教程.md
  2. 1 1
      bsp/stm32/docs/STM32系列BSP外设驱动使用教程.md
  3. 1 1
      bsp/stm32/docs/STM32系列外设驱动添加指南.md
  4. BIN
      bsp/stm32/docs/figures/board_h.png
  5. 3 0
      bsp/stm32/libraries/HAL_Drivers/SConscript
  6. 398 0
      bsp/stm32/libraries/HAL_Drivers/drv_lcd.c
  7. 1 1
      bsp/stm32/libraries/HAL_Drivers/drv_sdram.c
  8. 9 2
      bsp/stm32/libraries/STM32F4xx_HAL/SConscript
  9. 3 0
      bsp/stm32/stm32f429-armfly-v6/.config
  10. 2 2
      bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/.mxproject
  11. 223 120
      bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/CubeMX_Config.ioc
  12. 3 3
      bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h
  13. 139 5
      bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/Src/main.c
  14. 195 0
      bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c
  15. 19 4
      bsp/stm32/stm32f429-armfly-v6/board/Kconfig
  16. 54 51
      bsp/stm32/stm32f429-armfly-v6/board/board.c
  17. 33 0
      bsp/stm32/stm32f429-armfly-v6/board/ports/lcd_port.h
  18. 1 0
      bsp/stm32/stm32f429-armfly-v6/rtconfig.h
  19. 4 0
      bsp/stm32/stm32f429-atk-apollo/board/Kconfig
  20. 3 0
      bsp/stm32/stm32f429-fire-challenger/.config
  21. 2 2
      bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/.mxproject
  22. 199 109
      bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/CubeMX_Config.ioc
  23. 3 3
      bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h
  24. 134 39
      bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/main.c
  25. 266 42
      bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c
  26. 14 0
      bsp/stm32/stm32f429-fire-challenger/board/Kconfig
  27. 51 48
      bsp/stm32/stm32f429-fire-challenger/board/board.c
  28. 33 0
      bsp/stm32/stm32f429-fire-challenger/board/ports/lcd_port.h

+ 8 - 8
bsp/stm32/docs/STM32系列BSP制作教程.md

@@ -204,9 +204,9 @@ BSP 的制作过程分为如下五个步骤:
 
 重新生成工程需要使用 env 工具。
 
-#### 3.5.1 重新生成 rt_config.h 文件
+#### 3.5.1 重新生成 rtconfig.h 文件
 
-在 env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rt_config.h 文件。如下图所示:
+在 env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rtconfig.h 文件。如下图所示:
 
 ![输入menuconfig进入配置界面](./figures/menuconfig_1.png)
 
@@ -243,8 +243,7 @@ STM32 BSP 的制作规范主要分为 3 个方面:工程配置,ENV 配置和
 
 - 遵从RT-Thread 编码规范,代码注释风格统一
 - main 函数功能保持一致
-  - 如果有 LED 的话,main 函数里只放一个 LED 1HZ 闪烁的程序
-  - LED_PIN 定义在 board.h,初始化在 board.c 完成
+  - 如果有 LED 的话,main 函数里**只放一个**  LED 1HZ 闪烁的程序
 - 在 `rt_hw_board_init` 中需要完成堆的初始化:调用 `rt_system_heap_init`
 - 默认只初始化 GPIO 驱动和 FinSH 对应的串口驱动,不使用 DMA
 - 当使能板载外设驱动时,应做到不需要修改代码就能编译下载使用
@@ -271,10 +270,11 @@ STM32 BSP 的制作规范主要分为 3 个方面:工程配置,ENV 配置和
 
 ### 2. BSP 提交规范
 
-- 基础 BSP 和驱动应该分开提交
-- 基础 BSP 包括串口驱动和 GPIO 驱动,能运行 FinSH 控制台
-- 不同的驱动也要分开提交,方便 review 和合并
-- 只提交 BSP 必要的文件,删除无关的中间文件
+- 提交前请认真修改 BSP 的 README.md 文件,README.md 文件的外设支持表单只填写 BSP 支持的外设,可参考其他 BSP 填写。查看文档[《STM32系列驱动介绍》](./STM32系列驱动介绍.md)了解驱动分类。
+- 提交 BSP 分为 2 个阶段提交:
+  - 第一阶段:基础 BSP 包括串口驱动和 GPIO 驱动,能运行 FinSH 控制台。完成 MDK4、MDK5 、IAR 和 GCC 编译器支持,如果芯片不支持某款编译器(比如MDK4)可以不用做。 BSP 的 README.md 文件需要填写第二阶段要完成的驱动。
+  - 第二阶段:完成板载外设驱动支持,所有板载外设使用 menuconfig 配置后就能直接使用。若开发板没有板载外设,则此阶段可以不用完成。不同的驱动也要分开提交,方便 review 和合并。
+- 只提交 BSP 必要的文件,删除无关的中间文件,能够提交的文件请对照其他 BSP。
 - 提交 stm32 不同系列的 Library 库时,请参考 f1/f4 系列的 HAL 库,删除多余库文件
 - 提交前要对 BSP 进行编译测试,确保在不同编译器下编译正常
 - 提交前要对 BSP 进行功能测试,确保 BSP 的在提交前符合工程配置章节中的要求

+ 1 - 1
bsp/stm32/docs/STM32系列BSP外设驱动使用教程.md

@@ -1,4 +1,4 @@
-# BSP 进阶使用指南
+# BSP 外设驱动使用教程
 
 ## 简介
 

+ 1 - 1
bsp/stm32/docs/STM32系列外设驱动添加指南.md

@@ -37,7 +37,7 @@
 
 > 为 BSP 添加驱动时,STM32CubeMX 工具可以快速的完成**使能外设**和**配置管脚**的工作。而外设初始化,中断配置,DMA配置等等则由 RT-Thread 提供的驱动文件来完成。也就是说,虽然 STM32CubeMX 生成了多个文件用来初始化外设,但 RT-Thread 只使用了 STM32CubeMX  生成的 `stm32fxx_hal_msp.c` 文件和 `stm32fxx_hal_conf.h` 文件。
 >
-> 对于不同的外设驱动,通过 STM32CubeMX 工具配置的内容也不一样。开发者可以参考本文档的附录 [CubeMX配置说明]() 章节来了解不同外设的配置方法。
+> 对于不同的外设驱动,通过 STM32CubeMX 工具配置的内容也不一样。开发者可以参考本文档的附录 CubeMX 配置说明章节来了解不同外设的配置方法。
 
 ### 3)修改 Kconfig 文件
 

BIN
bsp/stm32/docs/figures/board_h.png


+ 3 - 0
bsp/stm32/libraries/HAL_Drivers/SConscript

@@ -41,6 +41,9 @@ if GetDepend(['RT_USING_ADC']):
 if GetDepend('BSP_USING_SDRAM'):
     src += ['drv_sdram.c']
 
+if GetDepend('BSP_USING_LCD'):
+    src += ['drv_lcd.c']
+
 if GetDepend('BSP_USING_ONCHIP_RTC'):
     src += ['drv_rtc.c']
 

+ 398 - 0
bsp/stm32/libraries/HAL_Drivers/drv_lcd.c

@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2019-01-08     zylx         first version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+#include <board.h>
+
+#ifdef BSP_USING_LCD
+#include <lcd_port.h>
+#include <string.h>
+#include "drv_gpio.h"
+
+//#define DRV_DEBUG
+#define LOG_TAG             "drv.lcd"
+#include <drv_log.h>
+
+#define LCD_DEVICE(dev)     (struct drv_lcd_device*)(dev)
+
+static LTDC_HandleTypeDef LtdcHandle = {0};
+
+struct drv_lcd_device
+{
+    struct rt_device parent;
+
+    struct rt_device_graphic_info lcd_info;
+
+    struct rt_semaphore lcd_lock;
+
+    /* 0:front_buf is being used 1: back_buf is being used*/
+    rt_uint8_t cur_buf;
+    rt_uint8_t *front_buf;
+    rt_uint8_t *back_buf;
+};
+
+struct drv_lcd_device _lcd;
+
+static rt_err_t drv_lcd_init(struct rt_device *device)
+{
+    struct drv_lcd_device *lcd = LCD_DEVICE(device);
+    /* nothing, right now */
+    lcd = lcd;
+    return RT_EOK;
+}
+
+static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args)
+{
+    struct drv_lcd_device *lcd = LCD_DEVICE(device);
+
+    switch (cmd)
+    {
+    case RTGRAPHIC_CTRL_RECT_UPDATE:
+    {
+        /* update */
+        if (_lcd.cur_buf)
+        {
+            /* back_buf is being used */
+            memcpy(_lcd.front_buf, _lcd.lcd_info.framebuffer, LCD_BUF_SIZE);
+            /* Configure the color frame buffer start address */
+            LTDC_LAYER(&LtdcHandle, 0)->CFBAR &= ~(LTDC_LxCFBAR_CFBADD);
+            LTDC_LAYER(&LtdcHandle, 0)->CFBAR = (uint32_t)(_lcd.front_buf);
+            _lcd.cur_buf = 0;
+        }
+        else
+        {
+            /* front_buf is being used */
+            memcpy(_lcd.back_buf, _lcd.lcd_info.framebuffer, LCD_BUF_SIZE);
+            /* Configure the color frame buffer start address */
+            LTDC_LAYER(&LtdcHandle, 0)->CFBAR &= ~(LTDC_LxCFBAR_CFBADD);
+            LTDC_LAYER(&LtdcHandle, 0)->CFBAR = (uint32_t)(_lcd.back_buf);
+            _lcd.cur_buf = 1;
+        }
+        rt_sem_take(&_lcd.lcd_lock, RT_TICK_PER_SECOND / 20);
+        HAL_LTDC_Relaod(&LtdcHandle, LTDC_SRCR_VBR);
+    }
+    break;
+
+    case RTGRAPHIC_CTRL_GET_INFO:
+    {
+        struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args;
+
+        RT_ASSERT(info != RT_NULL);
+        info->pixel_format  = lcd->lcd_info.pixel_format;
+        info->bits_per_pixel = 16;
+        info->width         = lcd->lcd_info.width;
+        info->height        = lcd->lcd_info.height;
+        info->framebuffer   = lcd->lcd_info.framebuffer;
+    }
+    break;
+    }
+
+    return RT_EOK;
+}
+
+void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc)
+{
+    /* emable line interupt */
+    __HAL_LTDC_ENABLE_IT(&LtdcHandle, LTDC_IER_LIE);
+}
+
+void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc)
+{
+    rt_sem_release(&_lcd.lcd_lock);
+}
+
+void LTDC_IRQHandler(void)
+{
+    rt_enter_critical();
+
+    HAL_LTDC_IRQHandler(&LtdcHandle);
+
+    rt_exit_critical();
+}
+
+rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd)
+{
+    LTDC_LayerCfgTypeDef pLayerCfg = {0};
+
+    /* LTDC Initialization -------------------------------------------------------*/
+
+    /* Polarity configuration */
+    /* Initialize the horizontal synchronization polarity as active low */
+    LtdcHandle.Init.HSPolarity = LTDC_HSPOLARITY_AL;
+    /* Initialize the vertical synchronization polarity as active low */
+    LtdcHandle.Init.VSPolarity = LTDC_VSPOLARITY_AL;
+    /* Initialize the data enable polarity as active low */
+    LtdcHandle.Init.DEPolarity = LTDC_DEPOLARITY_AL;
+    /* Initialize the pixel clock polarity as input pixel clock */
+    LtdcHandle.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
+
+    /* Timing configuration */
+    /* Horizontal synchronization width = Hsync - 1 */
+    LtdcHandle.Init.HorizontalSync = LCD_HSYNC_WIDTH - 1;
+    /* Vertical synchronization height = Vsync - 1 */
+    LtdcHandle.Init.VerticalSync = LCD_VSYNC_HEIGHT - 1;
+    /* Accumulated horizontal back porch = Hsync + HBP - 1 */
+    LtdcHandle.Init.AccumulatedHBP = LCD_HSYNC_WIDTH + LCD_HBP - 1;
+    /* Accumulated vertical back porch = Vsync + VBP - 1 */
+    LtdcHandle.Init.AccumulatedVBP = LCD_VSYNC_HEIGHT + LCD_VBP - 1;
+    /* Accumulated active width = Hsync + HBP + Active Width - 1 */
+    LtdcHandle.Init.AccumulatedActiveW = LCD_HSYNC_WIDTH + LCD_HBP + lcd->lcd_info.width - 1 ;
+    /* Accumulated active height = Vsync + VBP + Active Heigh - 1 */
+    LtdcHandle.Init.AccumulatedActiveH = LCD_VSYNC_HEIGHT + LCD_VBP + lcd->lcd_info.height - 1;
+    /* Total height = Vsync + VBP + Active Heigh + VFP - 1 */
+    LtdcHandle.Init.TotalHeigh = LtdcHandle.Init.AccumulatedActiveH + LCD_VFP;
+    /* Total width = Hsync + HBP + Active Width + HFP - 1 */
+    LtdcHandle.Init.TotalWidth = LtdcHandle.Init.AccumulatedActiveW + LCD_HFP;
+
+    /* Configure R,G,B component values for LCD background color */
+    LtdcHandle.Init.Backcolor.Blue = 0;
+    LtdcHandle.Init.Backcolor.Green = 0;
+    LtdcHandle.Init.Backcolor.Red = 0;
+
+    LtdcHandle.Instance = LTDC;
+
+    /* Layer1 Configuration ------------------------------------------------------*/
+
+    /* Windowing configuration */
+    pLayerCfg.WindowX0 = 0;
+    pLayerCfg.WindowX1 = lcd->lcd_info.width;
+    pLayerCfg.WindowY0 = 0;
+    pLayerCfg.WindowY1 = lcd->lcd_info.height;
+
+    /* Pixel Format configuration*/
+    if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_RGB565)
+    {
+        pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
+    }
+    else if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_ARGB888)
+    {
+        pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
+    }
+    else if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_RGB888)
+    {
+        pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
+    }
+    else if (lcd->lcd_info.pixel_format == RTGRAPHIC_PIXEL_FORMAT_RGB888)
+    {
+        pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
+    }
+    else
+    {
+        LOG_E("unsupported pixel format");
+        return -RT_ERROR;
+    }
+
+    /* Start Address configuration : frame buffer is located at FLASH memory */
+    pLayerCfg.FBStartAdress = (uint32_t)lcd->front_buf;
+
+    /* Alpha constant (255 totally opaque) */
+    pLayerCfg.Alpha = 255;
+
+    /* Default Color configuration (configure A,R,G,B component values) */
+    pLayerCfg.Alpha0 = 255;
+    pLayerCfg.Backcolor.Blue = 0;
+    pLayerCfg.Backcolor.Green = 0;
+    pLayerCfg.Backcolor.Red = 0;
+
+    /* Configure blending factors */
+    /* Constant Alpha value:  pLayerCfg.Alpha / 255
+       C: Current Layer Color
+       Cs: Background color
+       BC = Constant Alpha x C + (1 - Constant Alpha ) x Cs */
+    /* BlendingFactor1: Pixel Alpha x Constant Alpha */
+    pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
+    /* BlendingFactor2: 1 - (Pixel Alpha x Constant Alpha) */
+    pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
+
+    /* Configure the number of lines and number of pixels per line */
+    pLayerCfg.ImageWidth = lcd->lcd_info.width;
+    pLayerCfg.ImageHeight = lcd->lcd_info.height;
+
+    /* Configure the LTDC */
+    if (HAL_LTDC_Init(&LtdcHandle) != HAL_OK)
+    {
+        LOG_E("LTDC init failed");
+        return -RT_ERROR;
+    }
+
+    /* Configure the Background Layer*/
+    if (HAL_LTDC_ConfigLayer(&LtdcHandle, &pLayerCfg, 0) != HAL_OK)
+    {
+        LOG_E("LTDC layer init failed");
+        return -RT_ERROR;
+    }
+    else
+    {
+        /* enable LTDC interrupt */
+        HAL_NVIC_SetPriority(LTDC_IRQn, 1, 0);
+        HAL_NVIC_EnableIRQ(LTDC_IRQn);
+        LOG_D("LTDC init success");
+        return RT_EOK;
+    }
+}
+#if defined(LCD_BACKLIGHT_USING_PWM)
+void turn_on_lcd_backlight(void)
+{
+    struct rt_device_pwm *pwm_dev;
+
+    /* turn on the LCD backlight */
+    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
+    /* pwm frequency:100K = 10000ns */
+    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, 10000, 10000);
+    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
+}
+#elif defined(LCD_BACKLIGHT_USING_GPIO)
+void turn_on_lcd_backlight(void)
+{
+    rt_pin_mode(LCD_BL_GPIO_NUM, PIN_MODE_OUTPUT);
+    rt_pin_mode(LCD_DISP_GPIO_NUM, PIN_MODE_OUTPUT);
+
+    rt_pin_write(LCD_DISP_GPIO_NUM, PIN_HIGH);
+    rt_pin_write(LCD_BL_GPIO_NUM, PIN_HIGH);
+}
+#endif
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops lcd_ops =
+{
+    drv_lcd_init,
+    RT_NULL,
+    RT_NULL,
+    RT_NULL,
+    RT_NULL,
+    drv_lcd_control
+};
+#endif
+
+int drv_lcd_hw_init(void)
+{
+    rt_err_t result = RT_EOK;
+    struct rt_device *device = &_lcd.parent;
+
+    /* memset _lcd to zero */
+    memset(&_lcd, 0x00, sizeof(_lcd));
+
+    /* init lcd_lock semaphore */
+    result = rt_sem_init(&_lcd.lcd_lock, "lcd_lock", 0, RT_IPC_FLAG_FIFO);
+    if (result != RT_EOK)
+    {
+        LOG_E("init semaphore failed!\n");
+        result = -RT_ENOMEM;
+        goto __exit;
+    }
+
+    /* config LCD dev info */
+    _lcd.lcd_info.height = LCD_HEIGHT;
+    _lcd.lcd_info.width = LCD_WIDTH;
+    _lcd.lcd_info.bits_per_pixel = LCD_BITS_PER_PIXEL;
+    _lcd.lcd_info.pixel_format = LCD_PIXEL_FORMAT;
+
+    /* malloc memory for Triple Buffering */
+    _lcd.lcd_info.framebuffer = rt_malloc(LCD_BUF_SIZE);
+    _lcd.back_buf = rt_malloc(LCD_BUF_SIZE);
+    _lcd.front_buf = rt_malloc(LCD_BUF_SIZE);
+    if (_lcd.lcd_info.framebuffer == RT_NULL || _lcd.back_buf == RT_NULL || _lcd.front_buf == RT_NULL)
+    {
+        LOG_E("init frame buffer failed!\n");
+        result = -RT_ENOMEM;
+        goto __exit;
+    }
+
+    /* memset buff to 0xFF */
+    memset(_lcd.lcd_info.framebuffer, 0xFF, LCD_BUF_SIZE);
+    memset(_lcd.back_buf, 0xFF, LCD_BUF_SIZE);
+    memset(_lcd.front_buf, 0xFF, LCD_BUF_SIZE);
+
+    device->type    = RT_Device_Class_Graphic;
+#ifdef RT_USING_DEVICE_OPS
+    device->ops     = &lcd_ops;
+#else
+    device->init    = drv_lcd_init;
+    device->control = drv_lcd_control;
+#endif
+
+    /* register lcd device */
+    rt_device_register(device, "lcd", RT_DEVICE_FLAG_RDWR);
+
+    /* init stm32 LTDC */
+    if (stm32_lcd_init(&_lcd) != RT_EOK)
+    {
+        result = -RT_ERROR;
+        goto __exit;
+    }
+    else
+    {
+        turn_on_lcd_backlight();
+    }
+
+__exit:
+    if (result != RT_EOK)
+    {
+        rt_sem_delete(&_lcd.lcd_lock);
+
+        if (_lcd.lcd_info.framebuffer)
+        {
+            rt_free(_lcd.lcd_info.framebuffer);
+        }
+
+        if (_lcd.back_buf)
+        {
+            rt_free(_lcd.back_buf);
+        }
+
+        if (_lcd.front_buf)
+        {
+            rt_free(_lcd.front_buf);
+        }
+    }
+    return result;
+}
+INIT_DEVICE_EXPORT(drv_lcd_hw_init);
+
+#ifdef DRV_DEBUG
+#ifdef FINSH_USING_MSH
+int lcd_test()
+{
+    struct drv_lcd_device *lcd;
+    lcd = (struct drv_lcd_device *)rt_device_find("lcd");
+
+    while (1)
+    {
+        /* red */
+        for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+        {
+            lcd->lcd_info.framebuffer[2 * i] = 0x00;
+            lcd->lcd_info.framebuffer[2 * i + 1] = 0xF8;
+        }
+        lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
+        rt_thread_mdelay(1000);
+        /* green */
+        for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+        {
+            lcd->lcd_info.framebuffer[2 * i] = 0xE0;
+            lcd->lcd_info.framebuffer[2 * i + 1] = 0x07;
+        }
+        lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
+        rt_thread_mdelay(1000);
+        /* blue */
+        for (int i = 0; i < LCD_BUF_SIZE / 2; i++)
+        {
+            lcd->lcd_info.framebuffer[2 * i] = 0x1F;
+            lcd->lcd_info.framebuffer[2 * i + 1] = 0x00;
+        }
+        lcd->parent.control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL);
+        rt_thread_mdelay(1000);
+    }
+}
+MSH_CMD_EXPORT(lcd_test, lcd_test);
+#endif /* FINSH_USING_MSH */
+#endif /* DRV_DEBUG */
+#endif /* BSP_USING_LCD */

+ 1 - 1
bsp/stm32/libraries/HAL_Drivers/drv_sdram.c

@@ -5,7 +5,7 @@
  *
  * Change Logs:
  * Date           Author       Notes
- * 2018-12-04     zylx         The first version for STM32F4xx
+ * 2018-12-04     zylx         first version
  */
 
 #include <rtthread.h>

+ 9 - 2
bsp/stm32/libraries/STM32F4xx_HAL/SConscript

@@ -84,13 +84,14 @@ if GetDepend(['RT_USING_MTD_NOR']):
 if GetDepend(['RT_USING_MTD_NAND']):
     src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c']
 
-if GetDepend(['BSP_USING_SDRAM']):
+if GetDepend(['BSP_USING_FMC']):
     src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c']
     src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c']
+
+if GetDepend(['BSP_USING_SDRAM']):
     src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c']
 
 if GetDepend(['BSP_USING_EXT_FMC_IO']):
-    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c']
     src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c']
 
 if GetDepend(['BSP_USING_ON_CHIP_FLASH']):
@@ -98,6 +99,12 @@ if GetDepend(['BSP_USING_ON_CHIP_FLASH']):
     src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c']
     src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c']
 
+if GetDepend(['BSP_USING_LTDC']):
+    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c']
+    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c']
+    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c']
+    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma2d.c']
+
 path = [cwd + '/STM32F4xx_HAL_Driver/Inc',
     cwd + '/CMSIS/Device/ST/STM32F4xx/Include',
     cwd + '/CMSIS/Include']

+ 3 - 0
bsp/stm32/stm32f429-armfly-v6/.config

@@ -340,6 +340,7 @@ CONFIG_BSP_USING_EXT_FMC_IO=y
 # CONFIG_BSP_USING_SPI_FLASH is not set
 # CONFIG_BSP_USING_SDCARD is not set
 # CONFIG_BSP_USING_ETH is not set
+# CONFIG_BSP_USING_LCD is not set
 # CONFIG_BSP_USING_MPU6050 is not set
 
 #
@@ -358,6 +359,8 @@ CONFIG_BSP_USING_UART1=y
 # CONFIG_BSP_USING_ONCHIP_RTC is not set
 # CONFIG_BSP_USING_WDT is not set
 # CONFIG_BSP_USING_SDIO is not set
+CONFIG_BSP_USING_FMC=y
+# CONFIG_BSP_USING_LTDC is not set
 
 #
 # Board extended module Drivers

Разница между файлами не показана из-за своего большого размера
+ 2 - 2
bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/.mxproject


+ 223 - 120
bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/CubeMX_Config.ioc

@@ -11,120 +11,151 @@ File.Version=6
 KeepUserPlacement=false
 Mcu.Family=STM32F4
 Mcu.IP0=ADC1
-Mcu.IP1=ETH
-Mcu.IP10=TIM2
-Mcu.IP11=TIM11
-Mcu.IP12=TIM13
-Mcu.IP13=TIM14
-Mcu.IP14=USART1
-Mcu.IP2=FMC
-Mcu.IP3=IWDG
-Mcu.IP4=NVIC
-Mcu.IP5=RCC
-Mcu.IP6=RTC
-Mcu.IP7=SDIO
-Mcu.IP8=SPI3
-Mcu.IP9=SYS
-Mcu.IPNb=15
+Mcu.IP1=DMA2D
+Mcu.IP10=SPI3
+Mcu.IP11=SYS
+Mcu.IP12=TIM2
+Mcu.IP13=TIM11
+Mcu.IP14=TIM13
+Mcu.IP15=TIM14
+Mcu.IP16=USART1
+Mcu.IP2=ETH
+Mcu.IP3=FMC
+Mcu.IP4=IWDG
+Mcu.IP5=LTDC
+Mcu.IP6=NVIC
+Mcu.IP7=RCC
+Mcu.IP8=RTC
+Mcu.IP9=SDIO
+Mcu.IPNb=17
 Mcu.Name=STM32F429B(E-G-I)Tx
 Mcu.Package=LQFP208
 Mcu.Pin0=PE2
 Mcu.Pin1=PC14/OSC32_IN
-Mcu.Pin10=PF5
-Mcu.Pin11=PH0/OSC_IN
-Mcu.Pin12=PH1/OSC_OUT
-Mcu.Pin13=PC0
-Mcu.Pin14=PC1
-Mcu.Pin15=PC3
-Mcu.Pin16=PA0/WKUP
-Mcu.Pin17=PA1
-Mcu.Pin18=PA2
-Mcu.Pin19=PH2
+Mcu.Pin10=PI14
+Mcu.Pin100=PG11
+Mcu.Pin101=PG13
+Mcu.Pin102=PK3
+Mcu.Pin103=PK4
+Mcu.Pin104=PK5
+Mcu.Pin105=PK6
+Mcu.Pin106=PK7
+Mcu.Pin107=PG15
+Mcu.Pin108=PB3
+Mcu.Pin109=PB4
+Mcu.Pin11=PF3
+Mcu.Pin110=PB5
+Mcu.Pin111=PE0
+Mcu.Pin112=PE1
+Mcu.Pin113=PI4
+Mcu.Pin114=PI5
+Mcu.Pin115=PI6
+Mcu.Pin116=PI7
+Mcu.Pin117=VP_DMA2D_VS_DMA2D
+Mcu.Pin118=VP_IWDG_VS_IWDG
+Mcu.Pin119=VP_RTC_VS_RTC_Activate
+Mcu.Pin12=PF4
+Mcu.Pin120=VP_SYS_VS_Systick
+Mcu.Pin121=VP_TIM2_VS_ClockSourceINT
+Mcu.Pin122=VP_TIM11_VS_ClockSourceINT
+Mcu.Pin123=VP_TIM13_VS_ClockSourceINT
+Mcu.Pin124=VP_TIM14_VS_ClockSourceINT
+Mcu.Pin13=PF5
+Mcu.Pin14=PH0/OSC_IN
+Mcu.Pin15=PH1/OSC_OUT
+Mcu.Pin16=PC0
+Mcu.Pin17=PC1
+Mcu.Pin18=PC3
+Mcu.Pin19=PA0/WKUP
 Mcu.Pin2=PC15/OSC32_OUT
-Mcu.Pin20=PH3
-Mcu.Pin21=PH5
-Mcu.Pin22=PA7
-Mcu.Pin23=PC4
-Mcu.Pin24=PC5
-Mcu.Pin25=PF11
-Mcu.Pin26=PF12
-Mcu.Pin27=PF13
-Mcu.Pin28=PF14
-Mcu.Pin29=PF15
+Mcu.Pin20=PA1
+Mcu.Pin21=PA2
+Mcu.Pin22=PH2
+Mcu.Pin23=PH3
+Mcu.Pin24=PH5
+Mcu.Pin25=PA7
+Mcu.Pin26=PC4
+Mcu.Pin27=PC5
+Mcu.Pin28=PI15
+Mcu.Pin29=PJ0
 Mcu.Pin3=PI9
-Mcu.Pin30=PG0
-Mcu.Pin31=PG1
-Mcu.Pin32=PE7
-Mcu.Pin33=PE8
-Mcu.Pin34=PE9
-Mcu.Pin35=PE10
-Mcu.Pin36=PE11
-Mcu.Pin37=PE12
-Mcu.Pin38=PE13
-Mcu.Pin39=PE14
+Mcu.Pin30=PJ1
+Mcu.Pin31=PJ2
+Mcu.Pin32=PJ3
+Mcu.Pin33=PJ4
+Mcu.Pin34=PF11
+Mcu.Pin35=PF12
+Mcu.Pin36=PF13
+Mcu.Pin37=PF14
+Mcu.Pin38=PF15
+Mcu.Pin39=PG0
 Mcu.Pin4=PI10
-Mcu.Pin40=PE15
-Mcu.Pin41=PH8
-Mcu.Pin42=PH9
-Mcu.Pin43=PH10
-Mcu.Pin44=PH11
-Mcu.Pin45=PH12
-Mcu.Pin46=PB13
-Mcu.Pin47=PD8
-Mcu.Pin48=PD9
-Mcu.Pin49=PD10
+Mcu.Pin40=PG1
+Mcu.Pin41=PE7
+Mcu.Pin42=PE8
+Mcu.Pin43=PE9
+Mcu.Pin44=PE10
+Mcu.Pin45=PE11
+Mcu.Pin46=PE12
+Mcu.Pin47=PE13
+Mcu.Pin48=PE14
+Mcu.Pin49=PE15
 Mcu.Pin5=PF0
-Mcu.Pin50=PD14
-Mcu.Pin51=PD15
-Mcu.Pin52=PG4
-Mcu.Pin53=PG5
-Mcu.Pin54=PG8
-Mcu.Pin55=PC8
-Mcu.Pin56=PC9
-Mcu.Pin57=PA9
-Mcu.Pin58=PA10
-Mcu.Pin59=PA13
+Mcu.Pin50=PJ5
+Mcu.Pin51=PH8
+Mcu.Pin52=PH9
+Mcu.Pin53=PH10
+Mcu.Pin54=PH11
+Mcu.Pin55=PH12
+Mcu.Pin56=PB13
+Mcu.Pin57=PD8
+Mcu.Pin58=PD9
+Mcu.Pin59=PD10
 Mcu.Pin6=PF1
-Mcu.Pin60=PH13
-Mcu.Pin61=PH14
-Mcu.Pin62=PH15
-Mcu.Pin63=PI0
-Mcu.Pin64=PI1
-Mcu.Pin65=PI2
-Mcu.Pin66=PI3
-Mcu.Pin67=PA14
-Mcu.Pin68=PC10
-Mcu.Pin69=PC11
+Mcu.Pin60=PD14
+Mcu.Pin61=PD15
+Mcu.Pin62=PJ6
+Mcu.Pin63=PJ7
+Mcu.Pin64=PJ8
+Mcu.Pin65=PJ9
+Mcu.Pin66=PJ10
+Mcu.Pin67=PJ11
+Mcu.Pin68=PK0
+Mcu.Pin69=PK1
 Mcu.Pin7=PF2
-Mcu.Pin70=PC12
-Mcu.Pin71=PD0
-Mcu.Pin72=PD1
-Mcu.Pin73=PD2
-Mcu.Pin74=PD4
-Mcu.Pin75=PD5
-Mcu.Pin76=PG9
-Mcu.Pin77=PG11
-Mcu.Pin78=PG13
-Mcu.Pin79=PG15
-Mcu.Pin8=PF3
-Mcu.Pin80=PB3
-Mcu.Pin81=PB4
-Mcu.Pin82=PB5
-Mcu.Pin83=PE0
-Mcu.Pin84=PE1
-Mcu.Pin85=PI4
-Mcu.Pin86=PI5
-Mcu.Pin87=PI6
-Mcu.Pin88=PI7
-Mcu.Pin89=VP_IWDG_VS_IWDG
-Mcu.Pin9=PF4
-Mcu.Pin90=VP_RTC_VS_RTC_Activate
-Mcu.Pin91=VP_SYS_VS_Systick
-Mcu.Pin92=VP_TIM2_VS_ClockSourceINT
-Mcu.Pin93=VP_TIM11_VS_ClockSourceINT
-Mcu.Pin94=VP_TIM13_VS_ClockSourceINT
-Mcu.Pin95=VP_TIM14_VS_ClockSourceINT
-Mcu.PinsNb=96
+Mcu.Pin70=PK2
+Mcu.Pin71=PG4
+Mcu.Pin72=PG5
+Mcu.Pin73=PG8
+Mcu.Pin74=PC8
+Mcu.Pin75=PC9
+Mcu.Pin76=PA9
+Mcu.Pin77=PA10
+Mcu.Pin78=PA13
+Mcu.Pin79=PH13
+Mcu.Pin8=PI12
+Mcu.Pin80=PH14
+Mcu.Pin81=PH15
+Mcu.Pin82=PI0
+Mcu.Pin83=PI1
+Mcu.Pin84=PI2
+Mcu.Pin85=PI3
+Mcu.Pin86=PA14
+Mcu.Pin87=PC10
+Mcu.Pin88=PC11
+Mcu.Pin89=PC12
+Mcu.Pin9=PI13
+Mcu.Pin90=PD0
+Mcu.Pin91=PD1
+Mcu.Pin92=PD2
+Mcu.Pin93=PD4
+Mcu.Pin94=PD5
+Mcu.Pin95=PJ12
+Mcu.Pin96=PJ13
+Mcu.Pin97=PJ14
+Mcu.Pin98=PJ15
+Mcu.Pin99=PG9
+Mcu.PinsNb=125
 Mcu.ThirdPartyNb=0
 Mcu.UserConstants=
 Mcu.UserName=STM32F429BITx
@@ -272,6 +303,14 @@ PH9.Signal=FMC_D17
 PI0.Signal=FMC_D24
 PI1.Signal=FMC_D25
 PI10.Signal=FMC_D31
+PI12.Mode=RGB888
+PI12.Signal=LTDC_HSYNC
+PI13.Mode=RGB888
+PI13.Signal=LTDC_VSYNC
+PI14.Mode=RGB888
+PI14.Signal=LTDC_CLK
+PI15.Mode=RGB888
+PI15.Signal=LTDC_R0
 PI2.Signal=FMC_D26
 PI3.Signal=FMC_D27
 PI4.Signal=FMC_NBL2
@@ -279,6 +318,66 @@ PI5.Signal=FMC_NBL3
 PI6.Signal=FMC_D28
 PI7.Signal=FMC_D29
 PI9.Signal=FMC_D30
+PJ0.Mode=RGB888
+PJ0.Signal=LTDC_R1
+PJ1.Mode=RGB888
+PJ1.Signal=LTDC_R2
+PJ10.Mode=RGB888
+PJ10.Signal=LTDC_G3
+PJ11.Locked=true
+PJ11.Mode=RGB888
+PJ11.Signal=LTDC_G4
+PJ12.Locked=true
+PJ12.Mode=RGB888
+PJ12.Signal=LTDC_B0
+PJ13.Mode=RGB888
+PJ13.Signal=LTDC_B1
+PJ14.Locked=true
+PJ14.Mode=RGB888
+PJ14.Signal=LTDC_B2
+PJ15.Mode=RGB888
+PJ15.Signal=LTDC_B3
+PJ2.Locked=true
+PJ2.Mode=RGB888
+PJ2.Signal=LTDC_R3
+PJ3.Mode=RGB888
+PJ3.Signal=LTDC_R4
+PJ4.Mode=RGB888
+PJ4.Signal=LTDC_R5
+PJ5.Locked=true
+PJ5.Mode=RGB888
+PJ5.Signal=LTDC_R6
+PJ6.Mode=RGB888
+PJ6.Signal=LTDC_R7
+PJ7.Locked=true
+PJ7.Mode=RGB888
+PJ7.Signal=LTDC_G0
+PJ8.Locked=true
+PJ8.Mode=RGB888
+PJ8.Signal=LTDC_G1
+PJ9.Locked=true
+PJ9.Mode=RGB888
+PJ9.Signal=LTDC_G2
+PK0.Locked=true
+PK0.Mode=RGB888
+PK0.Signal=LTDC_G5
+PK1.Mode=RGB888
+PK1.Signal=LTDC_G6
+PK2.Mode=RGB888
+PK2.Signal=LTDC_G7
+PK3.Locked=true
+PK3.Mode=RGB888
+PK3.Signal=LTDC_B4
+PK4.Locked=true
+PK4.Mode=RGB888
+PK4.Signal=LTDC_B5
+PK5.Mode=RGB888
+PK5.Signal=LTDC_B6
+PK6.Mode=RGB888
+PK6.Signal=LTDC_B7
+PK7.Locked=true
+PK7.Mode=RGB888
+PK7.Signal=LTDC_DE
 PinOutPanel.RotationAngle=0
 ProjectManager.AskForMigrate=true
 ProjectManager.BackupPrevious=false
@@ -306,7 +405,7 @@ ProjectManager.StackSize=0x400
 ProjectManager.TargetToolchain=EWARM V8
 ProjectManager.ToolChainLocation=
 ProjectManager.UnderRoot=false
-ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_FMC_Init-FMC-false-HAL-true,5-MX_SPI3_Init-SPI3-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_SDIO_SD_Init-SDIO-false-HAL-true,8-MX_IWDG_Init-IWDG-false-HAL-true,9-MX_ADC1_Init-ADC1-false-HAL-true,10-MX_RTC_Init-RTC-false-HAL-true,11-MX_TIM14_Init-TIM14-false-HAL-true,12-MX_TIM13_Init-TIM13-false-HAL-true,13-MX_TIM11_Init-TIM11-false-HAL-true,14-MX_ETH_Init-ETH-false-HAL-true
+ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_FMC_Init-FMC-false-HAL-true,5-MX_SPI3_Init-SPI3-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_SDIO_SD_Init-SDIO-false-HAL-true,8-MX_IWDG_Init-IWDG-false-HAL-true,9-MX_ADC1_Init-ADC1-false-HAL-true,10-MX_RTC_Init-RTC-false-HAL-true,11-MX_TIM14_Init-TIM14-false-HAL-true,12-MX_TIM13_Init-TIM13-false-HAL-true,13-MX_TIM11_Init-TIM11-false-HAL-true,14-MX_ETH_Init-ETH-false-HAL-true,15-MX_LTDC_Init-LTDC-false-HAL-true,16-MX_DMA2D_Init-DMA2D-false-HAL-true
 RCC.48MHZClocksFreq_Value=45000000
 RCC.AHBFreq_Value=180000000
 RCC.APB1CLKDivider=RCC_HCLK_DIV4
@@ -322,31 +421,33 @@ RCC.FamilyName=M
 RCC.HCLKFreq_Value=180000000
 RCC.HSE_VALUE=8000000
 RCC.HSI_VALUE=16000000
-RCC.I2SClocksFreq_Value=153600000
-RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ
-RCC.LCDTFTFreq_Value=19600000
+RCC.I2SClocksFreq_Value=192000000
+RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSAIN,PLLSourceVirtual,RCC_RTC_Clock_Source,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ
+RCC.LCDTFTFreq_Value=25000000
 RCC.LSI_VALUE=32000
 RCC.MCO2PinFreq_Value=180000000
 RCC.PLLCLKFreq_Value=180000000
-RCC.PLLM=5
-RCC.PLLN=225
+RCC.PLLM=4
+RCC.PLLN=180
 RCC.PLLQ=8
 RCC.PLLQCLKFreq_Value=45000000
+RCC.PLLSAIN=50
 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
-RCC.RTCFreq_Value=32000
+RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE
+RCC.RTCFreq_Value=32768
 RCC.RTCHSEDivFreq_Value=4000000
-RCC.SAI_AClocksFreq_Value=19600000
-RCC.SAI_BClocksFreq_Value=19600000
+RCC.SAI_AClocksFreq_Value=25000000
+RCC.SAI_BClocksFreq_Value=25000000
 RCC.SYSCLKFreq_VALUE=180000000
 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
-RCC.VCOI2SOutputFreq_Value=307200000
-RCC.VCOInputFreq_Value=1600000
+RCC.VCOI2SOutputFreq_Value=384000000
+RCC.VCOInputFreq_Value=2000000
 RCC.VCOOutputFreq_Value=360000000
-RCC.VCOSAIOutputFreq_Value=78400000
-RCC.VCOSAIOutputFreq_ValueQ=19600000
-RCC.VCOSAIOutputFreq_ValueR=39200000
-RCC.VcooutputI2S=153600000
-RCC.VcooutputI2SQ=153600000
+RCC.VCOSAIOutputFreq_Value=100000000
+RCC.VCOSAIOutputFreq_ValueQ=25000000
+RCC.VCOSAIOutputFreq_ValueR=50000000
+RCC.VcooutputI2S=192000000
+RCC.VcooutputI2SQ=192000000
 SH.ADCx_IN10.0=ADC1_IN10,IN10
 SH.ADCx_IN10.ConfNb=1
 SH.ADCx_IN13.0=ADC1_IN13,IN13
@@ -512,6 +613,8 @@ TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
 TIM2.IPParameters=Channel-PWM Generation1 CH1
 USART1.IPParameters=VirtualMode
 USART1.VirtualMode=VM_ASYNC
+VP_DMA2D_VS_DMA2D.Mode=DMA2D_Activate
+VP_DMA2D_VS_DMA2D.Signal=DMA2D_VS_DMA2D
 VP_IWDG_VS_IWDG.Mode=IWDG_Activate
 VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG
 VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled

+ 3 - 3
bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h

@@ -5,7 +5,7 @@
   ******************************************************************************
   * @attention
   *
-  * <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
+  * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
   *
   * Redistribution and use in source and binary forms, with or without modification,
   * are permitted provided that the following conditions are met:
@@ -56,7 +56,7 @@
 /* #define HAL_CRYP_MODULE_ENABLED   */
 /* #define HAL_DAC_MODULE_ENABLED   */
 /* #define HAL_DCMI_MODULE_ENABLED   */
-/* #define HAL_DMA2D_MODULE_ENABLED   */
+#define HAL_DMA2D_MODULE_ENABLED
 #define HAL_ETH_MODULE_ENABLED
 /* #define HAL_NAND_MODULE_ENABLED   */
 /* #define HAL_NOR_MODULE_ENABLED   */
@@ -67,7 +67,7 @@
 /* #define HAL_I2C_MODULE_ENABLED   */
 /* #define HAL_I2S_MODULE_ENABLED   */
 #define HAL_IWDG_MODULE_ENABLED
-/* #define HAL_LTDC_MODULE_ENABLED   */
+#define HAL_LTDC_MODULE_ENABLED
 /* #define HAL_RNG_MODULE_ENABLED   */
 #define HAL_RTC_MODULE_ENABLED
 /* #define HAL_SAI_MODULE_ENABLED   */

+ 139 - 5
bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/Src/main.c

@@ -64,10 +64,14 @@
 /* Private variables ---------------------------------------------------------*/
 ADC_HandleTypeDef hadc1;
 
+DMA2D_HandleTypeDef hdma2d;
+
 ETH_HandleTypeDef heth;
 
 IWDG_HandleTypeDef hiwdg;
 
+LTDC_HandleTypeDef hltdc;
+
 RTC_HandleTypeDef hrtc;
 
 SD_HandleTypeDef hsd;
@@ -103,6 +107,8 @@ static void MX_TIM14_Init(void);
 static void MX_TIM13_Init(void);
 static void MX_TIM11_Init(void);
 static void MX_ETH_Init(void);
+static void MX_LTDC_Init(void);
+static void MX_DMA2D_Init(void);
 /* USER CODE BEGIN PFP */
 
 /* USER CODE END PFP */
@@ -152,6 +158,8 @@ int main(void)
   MX_TIM13_Init();
   MX_TIM11_Init();
   MX_ETH_Init();
+  MX_LTDC_Init();
+  MX_DMA2D_Init();
   /* USER CODE BEGIN 2 */
 
   /* USER CODE END 2 */
@@ -183,13 +191,15 @@ void SystemClock_Config(void)
   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
   /**Initializes the CPU, AHB and APB busses clocks 
   */
-  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
+  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE
+                              |RCC_OSCILLATORTYPE_LSE;
   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
   RCC_OscInitStruct.LSIState = RCC_LSI_ON;
   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
-  RCC_OscInitStruct.PLL.PLLM = 5;
-  RCC_OscInitStruct.PLL.PLLN = 225;
+  RCC_OscInitStruct.PLL.PLLM = 4;
+  RCC_OscInitStruct.PLL.PLLN = 180;
   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
   RCC_OscInitStruct.PLL.PLLQ = 8;
   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
@@ -215,8 +225,11 @@ void SystemClock_Config(void)
   {
     Error_Handler();
   }
-  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
-  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
+  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_RTC;
+  PeriphClkInitStruct.PLLSAI.PLLSAIN = 50;
+  PeriphClkInitStruct.PLLSAI.PLLSAIR = 2;
+  PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;
+  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
   {
     Error_Handler();
@@ -273,6 +286,43 @@ static void MX_ADC1_Init(void)
 
 }
 
+/**
+  * @brief DMA2D Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_DMA2D_Init(void)
+{
+
+  /* USER CODE BEGIN DMA2D_Init 0 */
+
+  /* USER CODE END DMA2D_Init 0 */
+
+  /* USER CODE BEGIN DMA2D_Init 1 */
+
+  /* USER CODE END DMA2D_Init 1 */
+  hdma2d.Instance = DMA2D;
+  hdma2d.Init.Mode = DMA2D_M2M;
+  hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
+  hdma2d.Init.OutputOffset = 0;
+  hdma2d.LayerCfg[1].InputOffset = 0;
+  hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888;
+  hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+  hdma2d.LayerCfg[1].InputAlpha = 0;
+  if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN DMA2D_Init 2 */
+
+  /* USER CODE END DMA2D_Init 2 */
+
+}
+
 /**
   * @brief ETH Initialization Function
   * @param None
@@ -346,6 +396,88 @@ static void MX_IWDG_Init(void)
 
 }
 
+/**
+  * @brief LTDC Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_LTDC_Init(void)
+{
+
+  /* USER CODE BEGIN LTDC_Init 0 */
+
+  /* USER CODE END LTDC_Init 0 */
+
+  LTDC_LayerCfgTypeDef pLayerCfg = {0};
+  LTDC_LayerCfgTypeDef pLayerCfg1 = {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 = 7;
+  hltdc.Init.VerticalSync = 3;
+  hltdc.Init.AccumulatedHBP = 14;
+  hltdc.Init.AccumulatedVBP = 5;
+  hltdc.Init.AccumulatedActiveW = 654;
+  hltdc.Init.AccumulatedActiveH = 485;
+  hltdc.Init.TotalWidth = 660;
+  hltdc.Init.TotalHeigh = 487;
+  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 = 0;
+  pLayerCfg.WindowY0 = 0;
+  pLayerCfg.WindowY1 = 0;
+  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
+  pLayerCfg.Alpha = 0;
+  pLayerCfg.Alpha0 = 0;
+  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
+  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
+  pLayerCfg.FBStartAdress = 0;
+  pLayerCfg.ImageWidth = 0;
+  pLayerCfg.ImageHeight = 0;
+  pLayerCfg.Backcolor.Blue = 0;
+  pLayerCfg.Backcolor.Green = 0;
+  pLayerCfg.Backcolor.Red = 0;
+  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  pLayerCfg1.WindowX0 = 0;
+  pLayerCfg1.WindowX1 = 0;
+  pLayerCfg1.WindowY0 = 0;
+  pLayerCfg1.WindowY1 = 0;
+  pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
+  pLayerCfg1.Alpha = 0;
+  pLayerCfg1.Alpha0 = 0;
+  pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
+  pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
+  pLayerCfg1.FBStartAdress = 0;
+  pLayerCfg1.ImageWidth = 0;
+  pLayerCfg1.ImageHeight = 0;
+  pLayerCfg1.Backcolor.Blue = 0;
+  pLayerCfg1.Backcolor.Green = 0;
+  pLayerCfg1.Backcolor.Red = 0;
+  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, 1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN LTDC_Init 2 */
+
+  /* USER CODE END LTDC_Init 2 */
+
+}
+
 /**
   * @brief RTC Initialization Function
   * @param None
@@ -722,9 +854,11 @@ static void MX_GPIO_Init(void)
   __HAL_RCC_GPIOF_CLK_ENABLE();
   __HAL_RCC_GPIOH_CLK_ENABLE();
   __HAL_RCC_GPIOA_CLK_ENABLE();
+  __HAL_RCC_GPIOJ_CLK_ENABLE();
   __HAL_RCC_GPIOG_CLK_ENABLE();
   __HAL_RCC_GPIOB_CLK_ENABLE();
   __HAL_RCC_GPIOD_CLK_ENABLE();
+  __HAL_RCC_GPIOK_CLK_ENABLE();
 
   /*Configure GPIO pin : PE2 */
   GPIO_InitStruct.Pin = GPIO_PIN_2;

+ 195 - 0
bsp/stm32/stm32f429-armfly-v6/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c

@@ -165,6 +165,53 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
 
 }
 
+/**
+* @brief DMA2D MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hdma2d: DMA2D handle pointer
+* @retval None
+*/
+void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d)
+{
+
+  if(hdma2d->Instance==DMA2D)
+  {
+  /* USER CODE BEGIN DMA2D_MspInit 0 */
+
+  /* USER CODE END DMA2D_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_DMA2D_CLK_ENABLE();
+  /* USER CODE BEGIN DMA2D_MspInit 1 */
+
+  /* USER CODE END DMA2D_MspInit 1 */
+  }
+
+}
+
+/**
+* @brief DMA2D MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hdma2d: DMA2D handle pointer
+* @retval None
+*/
+
+void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d)
+{
+
+  if(hdma2d->Instance==DMA2D)
+  {
+  /* USER CODE BEGIN DMA2D_MspDeInit 0 */
+
+  /* USER CODE END DMA2D_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_DMA2D_CLK_DISABLE();
+  /* USER CODE BEGIN DMA2D_MspDeInit 1 */
+
+  /* USER CODE END DMA2D_MspDeInit 1 */
+  }
+
+}
+
 /**
 * @brief ETH MSP Initialization
 * This function configures the hardware resources used in this example
@@ -277,6 +324,154 @@ void HAL_ETH_MspDeInit(ETH_HandleTypeDef* heth)
 
 }
 
+/**
+* @brief LTDC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hltdc: LTDC handle pointer
+* @retval None
+*/
+void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc)
+{
+
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(hltdc->Instance==LTDC)
+  {
+  /* USER CODE BEGIN LTDC_MspInit 0 */
+
+  /* USER CODE END LTDC_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_LTDC_CLK_ENABLE();
+  
+    __HAL_RCC_GPIOI_CLK_ENABLE();
+    __HAL_RCC_GPIOJ_CLK_ENABLE();
+    __HAL_RCC_GPIOK_CLK_ENABLE();
+    /**LTDC GPIO Configuration    
+    PI12     ------> LTDC_HSYNC
+    PI13     ------> LTDC_VSYNC
+    PI14     ------> LTDC_CLK
+    PI15     ------> LTDC_R0
+    PJ0     ------> LTDC_R1
+    PJ1     ------> LTDC_R2
+    PJ2     ------> LTDC_R3
+    PJ3     ------> LTDC_R4
+    PJ4     ------> LTDC_R5
+    PJ5     ------> LTDC_R6
+    PJ6     ------> LTDC_R7
+    PJ7     ------> LTDC_G0
+    PJ8     ------> LTDC_G1
+    PJ9     ------> LTDC_G2
+    PJ10     ------> LTDC_G3
+    PJ11     ------> LTDC_G4
+    PK0     ------> LTDC_G5
+    PK1     ------> LTDC_G6
+    PK2     ------> LTDC_G7
+    PJ12     ------> LTDC_B0
+    PJ13     ------> LTDC_B1
+    PJ14     ------> LTDC_B2
+    PJ15     ------> LTDC_B3
+    PK3     ------> LTDC_B4
+    PK4     ------> LTDC_B5
+    PK5     ------> LTDC_B6
+    PK6     ------> LTDC_B7
+    PK7     ------> LTDC_DE 
+    */
+    GPIO_InitStruct.Pin = 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_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
+                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 
+                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|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_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOJ, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
+                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOK, &GPIO_InitStruct);
+
+  /* USER CODE BEGIN LTDC_MspInit 1 */
+
+  /* USER CODE END LTDC_MspInit 1 */
+  }
+
+}
+
+/**
+* @brief LTDC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hltdc: LTDC handle pointer
+* @retval None
+*/
+
+void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc)
+{
+
+  if(hltdc->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    
+    PI12     ------> LTDC_HSYNC
+    PI13     ------> LTDC_VSYNC
+    PI14     ------> LTDC_CLK
+    PI15     ------> LTDC_R0
+    PJ0     ------> LTDC_R1
+    PJ1     ------> LTDC_R2
+    PJ2     ------> LTDC_R3
+    PJ3     ------> LTDC_R4
+    PJ4     ------> LTDC_R5
+    PJ5     ------> LTDC_R6
+    PJ6     ------> LTDC_R7
+    PJ7     ------> LTDC_G0
+    PJ8     ------> LTDC_G1
+    PJ9     ------> LTDC_G2
+    PJ10     ------> LTDC_G3
+    PJ11     ------> LTDC_G4
+    PK0     ------> LTDC_G5
+    PK1     ------> LTDC_G6
+    PK2     ------> LTDC_G7
+    PJ12     ------> LTDC_B0
+    PJ13     ------> LTDC_B1
+    PJ14     ------> LTDC_B2
+    PJ15     ------> LTDC_B3
+    PK3     ------> LTDC_B4
+    PK4     ------> LTDC_B5
+    PK5     ------> LTDC_B6
+    PK6     ------> LTDC_B7
+    PK7     ------> LTDC_DE 
+    */
+    HAL_GPIO_DeInit(GPIOI, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
+
+    HAL_GPIO_DeInit(GPIOJ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
+                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 
+                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
+                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
+
+    HAL_GPIO_DeInit(GPIOK, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
+                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
+
+  /* USER CODE BEGIN LTDC_MspDeInit 1 */
+
+  /* USER CODE END LTDC_MspDeInit 1 */
+  }
+
+}
+
 /**
 * @brief RTC MSP Initialization
 * This function configures the hardware resources used in this example

+ 19 - 4
bsp/stm32/stm32f429-armfly-v6/board/Kconfig

@@ -15,10 +15,12 @@ menu "Onboard Peripheral Drivers"
 
     config BSP_USING_EXT_FMC_IO
         bool "Enable extend gpio"
+        select BSP_USING_FMC
         default y
 
 	config BSP_USING_SDRAM
         bool "Enable SDRAM"
+        select BSP_USING_FMC
         default n
 		
 	config BSP_USING_SPI_FLASH
@@ -38,9 +40,7 @@ menu "Onboard Peripheral Drivers"
 
     config PHY_USING_DM9161CEP
         bool
-    
 
-    
     menuconfig BSP_USING_ETH
         bool "Enable Ethernet"
         select RT_USING_LWIP
@@ -57,14 +57,22 @@ menu "Onboard Peripheral Drivers"
                 default 118
         endif
 
+    config BSP_USING_LCD
+        bool "Enable LCD"
+        select BSP_USING_LTDC
+        select BSP_USING_SDRAM
+        select BSP_USING_PWM
+        select BSP_USING_PWM2
+        select BSP_USING_PWM2_CH1
+        default n
+
     config BSP_USING_MPU6050
         bool "Enable MPU6050(i2c1)"
         select BSP_USING_I2C1
         select PKG_USING_MPU6XXX
         select PKG_USING_MPU6XXX_SAMPLE
         select PKG_USING_MPU6XXX_LATEST_VERSION
-        default n	
-
+        default n
 endmenu
 
 menu "On-chip Peripheral Drivers"
@@ -191,6 +199,13 @@ menu "On-chip Peripheral Drivers"
         select RT_USING_DFS
         default n
 
+    config BSP_USING_FMC
+        bool
+        default n
+
+    config BSP_USING_LTDC
+        bool
+        default n
 endmenu
 
 menu "Board extended module Drivers"

+ 54 - 51
bsp/stm32/stm32f429-armfly-v6/board/board.c

@@ -5,7 +5,7 @@
  *
  * Change Logs:
  * Date           Author       Notes
- * 2018-11-7      zylx 	       first version
+ * 2018-11-7      zylx         first version
  */
 
 #include "board.h"
@@ -14,54 +14,57 @@
 */
 void SystemClock_Config(void)
 {
-  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
-  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
-  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
-
-  /**Configure the main internal regulator output voltage 
-  */
-  __HAL_RCC_PWR_CLK_ENABLE();
-  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
-  /**Initializes the CPU, AHB and APB busses clocks 
-  */
-  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE
-                              |RCC_OSCILLATORTYPE_LSE;
-  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
-  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
-  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
-  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
-  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
-  RCC_OscInitStruct.PLL.PLLM = 5;
-  RCC_OscInitStruct.PLL.PLLN = 225;
-  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
-  RCC_OscInitStruct.PLL.PLLQ = 8;
-  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
-  {
-    Error_Handler();
-  }
-  /**Activate the Over-Drive mode 
-  */
-  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
-  {
-    Error_Handler();
-  }
-  /**Initializes the CPU, AHB and APB busses clocks 
-  */
-  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
-                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
-  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
-  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
-  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
-  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
-
-  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
-  {
-    Error_Handler();
-  }
-  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
-  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
-  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
-  {
-    Error_Handler();
-  }
+    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+    
+    /**Configure the main internal regulator output voltage 
+    */
+    __HAL_RCC_PWR_CLK_ENABLE();
+    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+    /**Initializes the CPU, AHB and APB busses clocks 
+    */
+    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE
+                                |RCC_OSCILLATORTYPE_LSE;
+    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+    RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+    RCC_OscInitStruct.LSIState = RCC_LSI_ON;
+    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+    RCC_OscInitStruct.PLL.PLLM = 4;
+    RCC_OscInitStruct.PLL.PLLN = 180;
+    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+    RCC_OscInitStruct.PLL.PLLQ = 8;
+    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+    {
+      Error_Handler();
+    }
+    /**Activate the Over-Drive mode 
+    */
+    if (HAL_PWREx_EnableOverDrive() != HAL_OK)
+    {
+      Error_Handler();
+    }
+    /**Initializes the CPU, AHB and APB busses clocks 
+    */
+    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
+    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
+    
+    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
+    {
+      Error_Handler();
+    }
+    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_RTC;
+    PeriphClkInitStruct.PLLSAI.PLLSAIN = 50;
+    PeriphClkInitStruct.PLLSAI.PLLSAIR = 2;
+    PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;
+    PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+    {
+      Error_Handler();
+    }
 }

+ 33 - 0
bsp/stm32/stm32f429-armfly-v6/board/ports/lcd_port.h

@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2019-01-08     zylx         first version
+ */
+
+#ifndef __LCD_PORT_H__
+#define __LCD_PORT_H__
+
+/* armfly 5 inch screen, 800 * 480 */
+#define LCD_WIDTH           800
+#define LCD_HEIGHT          480
+#define LCD_BITS_PER_PIXEL  16
+#define LCD_BUF_SIZE        (LCD_WIDTH * LCD_HEIGHT * LCD_BITS_PER_PIXEL / 8)
+#define LCD_PIXEL_FORMAT    RTGRAPHIC_PIXEL_FORMAT_RGB565
+
+#define LCD_HSYNC_WIDTH     96
+#define LCD_VSYNC_HEIGHT    2
+#define LCD_HBP             10
+#define LCD_VBP             10
+#define LCD_HFP             10
+#define LCD_VFP             10
+
+#define LCD_BACKLIGHT_USING_PWM
+#define LCD_PWM_DEV_NAME    "pwm2"
+#define LCD_PWM_DEV_CHANNEL 1
+/* armfly 5 inch screen, 800 * 480 */
+
+#endif /* __LCD_PORT_H__ */

+ 1 - 0
bsp/stm32/stm32f429-armfly-v6/rtconfig.h

@@ -169,6 +169,7 @@
 #define BSP_USING_GPIO
 #define BSP_USING_UART
 #define BSP_USING_UART1
+#define BSP_USING_FMC
 
 /* Board extended module Drivers */
 

+ 4 - 0
bsp/stm32/stm32f429-atk-apollo/board/Kconfig

@@ -26,6 +26,7 @@ menu "Onboard Peripheral Drivers"
 
     config BSP_USING_SDRAM
         bool "Enable SDRAM"
+        select BSP_USING_FMC
         default n
 
     config BSP_USING_SPI_FLASH
@@ -235,6 +236,9 @@ menu "On-chip Peripheral Drivers"
         select RT_USING_DFS
         default n
 
+    config BSP_USING_FMC
+        bool
+        default n
 endmenu
 
 menu "Board extended module Drivers"

+ 3 - 0
bsp/stm32/stm32f429-fire-challenger/.config

@@ -338,6 +338,7 @@ CONFIG_BSP_USING_USB_TO_USART=y
 # CONFIG_BSP_USING_RS232 is not set
 # CONFIG_BSP_USING_SDRAM is not set
 # CONFIG_BSP_USING_SPI_FLASH is not set
+# CONFIG_BSP_USING_LCD is not set
 # CONFIG_BSP_USING_MPU6050 is not set
 # CONFIG_BSP_USING_ETH is not set
 # CONFIG_BSP_USING_RGB is not set
@@ -361,6 +362,8 @@ CONFIG_BSP_USING_UART1=y
 # CONFIG_BSP_USING_ONCHIP_RTC is not set
 # CONFIG_BSP_USING_WDT is not set
 # CONFIG_BSP_USING_SDIO is not set
+# CONFIG_BSP_USING_FMC is not set
+# CONFIG_BSP_USING_LTDC is not set
 
 #
 # Board extended module Drivers

Разница между файлами не показана из-за своего большого размера
+ 2 - 2
bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/.mxproject


+ 199 - 109
bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/CubeMX_Config.ioc

@@ -11,102 +11,130 @@ File.Version=6
 KeepUserPlacement=false
 Mcu.Family=STM32F4
 Mcu.IP0=ADC1
-Mcu.IP1=ETH
-Mcu.IP10=TIM5
-Mcu.IP11=TIM11
-Mcu.IP12=TIM13
-Mcu.IP13=TIM14
-Mcu.IP14=USART1
-Mcu.IP15=USART2
-Mcu.IP2=FMC
-Mcu.IP3=IWDG
-Mcu.IP4=NVIC
-Mcu.IP5=RCC
-Mcu.IP6=RTC
-Mcu.IP7=SDIO
-Mcu.IP8=SPI5
-Mcu.IP9=SYS
-Mcu.IPNb=16
+Mcu.IP1=DMA2D
+Mcu.IP10=SPI5
+Mcu.IP11=SYS
+Mcu.IP12=TIM5
+Mcu.IP13=TIM11
+Mcu.IP14=TIM13
+Mcu.IP15=TIM14
+Mcu.IP16=USART1
+Mcu.IP2=ETH
+Mcu.IP3=FMC
+Mcu.IP4=IWDG
+Mcu.IP5=LTDC
+Mcu.IP6=NVIC
+Mcu.IP7=RCC
+Mcu.IP8=RTC
+Mcu.IP9=SDIO
+Mcu.IPNb=17
 Mcu.Name=STM32F429I(E-G)Tx
 Mcu.Package=LQFP176
-Mcu.Pin0=PC14/OSC32_IN
-Mcu.Pin1=PC15/OSC32_OUT
-Mcu.Pin10=PF9
-Mcu.Pin11=PH0/OSC_IN
-Mcu.Pin12=PH1/OSC_OUT
-Mcu.Pin13=PC0
-Mcu.Pin14=PC1
-Mcu.Pin15=PC3
-Mcu.Pin16=PA1
-Mcu.Pin17=PA2
-Mcu.Pin18=PA7
-Mcu.Pin19=PC4
-Mcu.Pin2=PF0
-Mcu.Pin20=PC5
-Mcu.Pin21=PF11
-Mcu.Pin22=PF12
-Mcu.Pin23=PF13
-Mcu.Pin24=PF14
-Mcu.Pin25=PF15
-Mcu.Pin26=PG0
-Mcu.Pin27=PG1
-Mcu.Pin28=PE7
-Mcu.Pin29=PE8
-Mcu.Pin3=PF1
-Mcu.Pin30=PE9
-Mcu.Pin31=PE10
-Mcu.Pin32=PE11
-Mcu.Pin33=PE12
-Mcu.Pin34=PE13
-Mcu.Pin35=PE14
-Mcu.Pin36=PE15
-Mcu.Pin37=PB11
-Mcu.Pin38=PH6
-Mcu.Pin39=PH7
-Mcu.Pin4=PF2
-Mcu.Pin40=PH10
-Mcu.Pin41=PH11
-Mcu.Pin42=PH12
-Mcu.Pin43=PD8
-Mcu.Pin44=PD9
-Mcu.Pin45=PD10
-Mcu.Pin46=PD14
-Mcu.Pin47=PD15
-Mcu.Pin48=PG4
-Mcu.Pin49=PG5
-Mcu.Pin5=PF3
-Mcu.Pin50=PG8
-Mcu.Pin51=PC8
-Mcu.Pin52=PC9
-Mcu.Pin53=PA9
-Mcu.Pin54=PA10
-Mcu.Pin55=PA13
-Mcu.Pin56=PA14
-Mcu.Pin57=PC10
-Mcu.Pin58=PC11
-Mcu.Pin59=PC12
-Mcu.Pin6=PF4
-Mcu.Pin60=PD0
-Mcu.Pin61=PD1
-Mcu.Pin62=PD2
-Mcu.Pin63=PD5
-Mcu.Pin64=PD6
-Mcu.Pin65=PG13
-Mcu.Pin66=PG14
-Mcu.Pin67=PG15
-Mcu.Pin68=PE0
-Mcu.Pin69=PE1
-Mcu.Pin7=PF5
-Mcu.Pin70=VP_IWDG_VS_IWDG
-Mcu.Pin71=VP_RTC_VS_RTC_Activate
-Mcu.Pin72=VP_SYS_VS_Systick
-Mcu.Pin73=VP_TIM5_VS_ClockSourceINT
-Mcu.Pin74=VP_TIM11_VS_ClockSourceINT
-Mcu.Pin75=VP_TIM13_VS_ClockSourceINT
-Mcu.Pin76=VP_TIM14_VS_ClockSourceINT
-Mcu.Pin8=PF7
-Mcu.Pin9=PF8
-Mcu.PinsNb=77
+Mcu.Pin0=PE4
+Mcu.Pin1=PE5
+Mcu.Pin10=PF3
+Mcu.Pin100=VP_TIM5_VS_ClockSourceINT
+Mcu.Pin101=VP_TIM11_VS_ClockSourceINT
+Mcu.Pin102=VP_TIM13_VS_ClockSourceINT
+Mcu.Pin103=VP_TIM14_VS_ClockSourceINT
+Mcu.Pin11=PF4
+Mcu.Pin12=PF5
+Mcu.Pin13=PF7
+Mcu.Pin14=PF8
+Mcu.Pin15=PF9
+Mcu.Pin16=PF10
+Mcu.Pin17=PH0/OSC_IN
+Mcu.Pin18=PH1/OSC_OUT
+Mcu.Pin19=PC0
+Mcu.Pin2=PE6
+Mcu.Pin20=PC1
+Mcu.Pin21=PC3
+Mcu.Pin22=PA1
+Mcu.Pin23=PA2
+Mcu.Pin24=PH2
+Mcu.Pin25=PH3
+Mcu.Pin26=PA3
+Mcu.Pin27=PA7
+Mcu.Pin28=PC4
+Mcu.Pin29=PC5
+Mcu.Pin3=PC14/OSC32_IN
+Mcu.Pin30=PB0
+Mcu.Pin31=PB1
+Mcu.Pin32=PF11
+Mcu.Pin33=PF12
+Mcu.Pin34=PF13
+Mcu.Pin35=PF14
+Mcu.Pin36=PF15
+Mcu.Pin37=PG0
+Mcu.Pin38=PG1
+Mcu.Pin39=PE7
+Mcu.Pin4=PC15/OSC32_OUT
+Mcu.Pin40=PE8
+Mcu.Pin41=PE9
+Mcu.Pin42=PE10
+Mcu.Pin43=PE11
+Mcu.Pin44=PE12
+Mcu.Pin45=PE13
+Mcu.Pin46=PE14
+Mcu.Pin47=PE15
+Mcu.Pin48=PB11
+Mcu.Pin49=PH6
+Mcu.Pin5=PI9
+Mcu.Pin50=PH7
+Mcu.Pin51=PH8
+Mcu.Pin52=PH10
+Mcu.Pin53=PH11
+Mcu.Pin54=PH12
+Mcu.Pin55=PD8
+Mcu.Pin56=PD9
+Mcu.Pin57=PD10
+Mcu.Pin58=PD14
+Mcu.Pin59=PD15
+Mcu.Pin6=PI10
+Mcu.Pin60=PG4
+Mcu.Pin61=PG5
+Mcu.Pin62=PG6
+Mcu.Pin63=PG7
+Mcu.Pin64=PG8
+Mcu.Pin65=PC7
+Mcu.Pin66=PC8
+Mcu.Pin67=PC9
+Mcu.Pin68=PA9
+Mcu.Pin69=PA10
+Mcu.Pin7=PF0
+Mcu.Pin70=PA11
+Mcu.Pin71=PA12
+Mcu.Pin72=PA13
+Mcu.Pin73=PH13
+Mcu.Pin74=PH15
+Mcu.Pin75=PI0
+Mcu.Pin76=PI2
+Mcu.Pin77=PA14
+Mcu.Pin78=PC10
+Mcu.Pin79=PC11
+Mcu.Pin8=PF1
+Mcu.Pin80=PC12
+Mcu.Pin81=PD0
+Mcu.Pin82=PD1
+Mcu.Pin83=PD2
+Mcu.Pin84=PD6
+Mcu.Pin85=PG10
+Mcu.Pin86=PG11
+Mcu.Pin87=PG12
+Mcu.Pin88=PG13
+Mcu.Pin89=PG14
+Mcu.Pin9=PF2
+Mcu.Pin90=PG15
+Mcu.Pin91=PB8
+Mcu.Pin92=PB9
+Mcu.Pin93=PE0
+Mcu.Pin94=PE1
+Mcu.Pin95=PI4
+Mcu.Pin96=VP_DMA2D_VS_DMA2D
+Mcu.Pin97=VP_IWDG_VS_IWDG
+Mcu.Pin98=VP_RTC_VS_RTC_Activate
+Mcu.Pin99=VP_SYS_VS_Systick
+Mcu.PinsNb=104
 Mcu.ThirdPartyNb=0
 Mcu.UserConstants=
 Mcu.UserName=STM32F429IGTx
@@ -127,18 +155,37 @@ PA1.Mode=RMII
 PA1.Signal=ETH_REF_CLK
 PA10.Mode=Asynchronous
 PA10.Signal=USART1_RX
+PA11.Mode=RGB888
+PA11.Signal=LTDC_R4
+PA12.Mode=RGB888
+PA12.Signal=LTDC_R5
 PA13.Mode=Serial_Wire
 PA13.Signal=SYS_JTMS-SWDIO
 PA14.Mode=Serial_Wire
 PA14.Signal=SYS_JTCK-SWCLK
 PA2.Mode=RMII
 PA2.Signal=ETH_MDIO
+PA3.Locked=true
+PA3.Mode=RGB888
+PA3.Signal=LTDC_B5
 PA7.Mode=RMII
 PA7.Signal=ETH_CRS_DV
 PA9.Mode=Asynchronous
 PA9.Signal=USART1_TX
+PB0.Locked=true
+PB0.Mode=RGB888
+PB0.Signal=LTDC_R3
+PB1.Locked=true
+PB1.Mode=RGB888
+PB1.Signal=LTDC_R6
 PB11.Mode=RMII
 PB11.Signal=ETH_TX_EN
+PB8.Locked=true
+PB8.Mode=RGB888
+PB8.Signal=LTDC_B6
+PB9.Locked=true
+PB9.Mode=RGB888
+PB9.Signal=LTDC_B7
 PC0.Signal=FMC_SDNWE
 PC1.Mode=RMII
 PC1.Signal=ETH_MDC
@@ -158,6 +205,9 @@ PC4.Mode=RMII
 PC4.Signal=ETH_RXD0
 PC5.Mode=RMII
 PC5.Signal=ETH_RXD1
+PC7.Locked=true
+PC7.Mode=RGB888
+PC7.Signal=LTDC_G6
 PC8.Mode=SD_4_bits_Wide_bus
 PC8.Signal=SDIO_D0
 PC9.Mode=SD_4_bits_Wide_bus
@@ -177,11 +227,9 @@ PD14.Signal=FMC_D0_DA0
 PD15.Signal=FMC_D1_DA1
 PD2.Mode=SD_4_bits_Wide_bus
 PD2.Signal=SDIO_CMD
-PD5.Mode=Asynchronous
-PD5.Signal=USART2_TX
 PD6.Locked=true
-PD6.Mode=Asynchronous
-PD6.Signal=USART2_RX
+PD6.Mode=RGB888
+PD6.Signal=LTDC_B2
 PD8.Signal=FMC_D13_DA13
 PD9.Signal=FMC_D14_DA14
 PE0.Signal=FMC_NBL0
@@ -192,11 +240,19 @@ PE12.Signal=FMC_D9_DA9
 PE13.Signal=FMC_D10_DA10
 PE14.Signal=FMC_D11_DA11
 PE15.Signal=FMC_D12_DA12
+PE4.Mode=RGB888
+PE4.Signal=LTDC_B0
+PE5.Mode=RGB888
+PE5.Signal=LTDC_G0
+PE6.Mode=RGB888
+PE6.Signal=LTDC_G1
 PE7.Signal=FMC_D4_DA4
 PE8.Signal=FMC_D5_DA5
 PE9.Signal=FMC_D6_DA6
 PF0.Signal=FMC_A0
 PF1.Signal=FMC_A1
+PF10.Mode=RGB888
+PF10.Signal=LTDC_DE
 PF11.Signal=FMC_SDNRAS
 PF12.Signal=FMC_A6
 PF13.Signal=FMC_A7
@@ -216,6 +272,13 @@ PF9.Mode=Full_Duplex_Master
 PF9.Signal=SPI5_MOSI
 PG0.Signal=FMC_A10
 PG1.Signal=FMC_A11
+PG10.Locked=true
+PG10.Mode=RGB888
+PG10.Signal=LTDC_G3
+PG11.Mode=RGB888
+PG11.Signal=LTDC_B3
+PG12.Mode=RGB888
+PG12.Signal=LTDC_B1
 PG13.Locked=true
 PG13.Mode=RMII
 PG13.Signal=ETH_TXD0
@@ -225,6 +288,10 @@ PG14.Signal=ETH_TXD1
 PG15.Signal=FMC_SDNCAS
 PG4.Signal=FMC_A14_BA0
 PG5.Signal=FMC_A15_BA1
+PG6.Mode=RGB888
+PG6.Signal=LTDC_R7
+PG7.Mode=RGB888
+PG7.Signal=LTDC_CLK
 PG8.Signal=FMC_SDCLK
 PH0/OSC_IN.Mode=HSE-External-Oscillator
 PH0/OSC_IN.Signal=RCC_OSC_IN
@@ -234,10 +301,31 @@ PH10.Locked=true
 PH10.Signal=S_TIM5_CH1
 PH11.Signal=S_TIM5_CH2
 PH12.Signal=S_TIM5_CH3
+PH13.Mode=RGB888
+PH13.Signal=LTDC_G2
+PH15.Mode=RGB888
+PH15.Signal=LTDC_G4
+PH2.Locked=true
+PH2.Mode=RGB888
+PH2.Signal=LTDC_R0
+PH3.Mode=RGB888
+PH3.Signal=LTDC_R1
 PH6.Mode=SdramChipSelect2_1
 PH6.Signal=FMC_SDNE1
 PH7.Mode=SdramChipSelect2_1
 PH7.Signal=FMC_SDCKE1
+PH8.Mode=RGB888
+PH8.Signal=LTDC_R2
+PI0.Mode=RGB888
+PI0.Signal=LTDC_G5
+PI10.Mode=RGB888
+PI10.Signal=LTDC_HSYNC
+PI2.Mode=RGB888
+PI2.Signal=LTDC_G7
+PI4.Mode=RGB888
+PI4.Signal=LTDC_B4
+PI9.Mode=RGB888
+PI9.Signal=LTDC_VSYNC
 PinOutPanel.RotationAngle=0
 ProjectManager.AskForMigrate=true
 ProjectManager.BackupPrevious=false
@@ -265,7 +353,7 @@ ProjectManager.StackSize=0x400
 ProjectManager.TargetToolchain=MDK-ARM V5
 ProjectManager.ToolChainLocation=
 ProjectManager.UnderRoot=false
-ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ETH_Init-ETH-false-HAL-true,5-MX_SPI5_Init-SPI5-false-HAL-true,6-MX_FMC_Init-FMC-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_IWDG_Init-IWDG-false-HAL-true,10-MX_TIM14_Init-TIM14-false-HAL-true,11-MX_TIM13_Init-TIM13-false-HAL-true,12-MX_TIM11_Init-TIM11-false-HAL-true,13-MX_SDIO_SD_Init-SDIO-false-HAL-true,14-MX_TIM5_Init-TIM5-false-HAL-true,15-MX_USART2_UART_Init-USART2-false-HAL-true
+ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ETH_Init-ETH-false-HAL-true,5-MX_SPI5_Init-SPI5-false-HAL-true,6-MX_FMC_Init-FMC-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_IWDG_Init-IWDG-false-HAL-true,10-MX_TIM14_Init-TIM14-false-HAL-true,11-MX_TIM13_Init-TIM13-false-HAL-true,12-MX_TIM11_Init-TIM11-false-HAL-true,13-MX_SDIO_SD_Init-SDIO-false-HAL-true,14-MX_TIM5_Init-TIM5-false-HAL-true,15-MX_LTDC_Init-LTDC-false-HAL-true,16-MX_DMA2D_Init-DMA2D-false-HAL-true
 RCC.48MHZClocksFreq_Value=45000000
 RCC.AHBFreq_Value=180000000
 RCC.APB1CLKDivider=RCC_HCLK_DIV4
@@ -282,8 +370,8 @@ RCC.HCLKFreq_Value=180000000
 RCC.HSE_VALUE=25000000
 RCC.HSI_VALUE=16000000
 RCC.I2SClocksFreq_Value=160000000
-RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ
-RCC.LCDTFTFreq_Value=20416666.666666668
+RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSAIN,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ
+RCC.LCDTFTFreq_Value=25000000
 RCC.LSI_VALUE=32000
 RCC.MCO2PinFreq_Value=180000000
 RCC.PLLCLKFreq_Value=180000000
@@ -291,21 +379,22 @@ RCC.PLLM=15
 RCC.PLLN=216
 RCC.PLLQ=8
 RCC.PLLQCLKFreq_Value=45000000
+RCC.PLLSAIN=60
 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
 RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE
 RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE
 RCC.RTCFreq_Value=32768
 RCC.RTCHSEDivFreq_Value=12500000
-RCC.SAI_AClocksFreq_Value=20416666.666666668
-RCC.SAI_BClocksFreq_Value=20416666.666666668
+RCC.SAI_AClocksFreq_Value=25000000
+RCC.SAI_BClocksFreq_Value=25000000
 RCC.SYSCLKFreq_VALUE=180000000
 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
 RCC.VCOI2SOutputFreq_Value=320000000
 RCC.VCOInputFreq_Value=1666666.6666666667
 RCC.VCOOutputFreq_Value=360000000
-RCC.VCOSAIOutputFreq_Value=81666666.66666667
-RCC.VCOSAIOutputFreq_ValueQ=20416666.666666668
-RCC.VCOSAIOutputFreq_ValueR=40833333.333333336
+RCC.VCOSAIOutputFreq_Value=100000000
+RCC.VCOSAIOutputFreq_ValueQ=25000000
+RCC.VCOSAIOutputFreq_ValueR=50000000
 RCC.VcooutputI2S=160000000
 RCC.VcooutputI2SQ=160000000
 SH.ADCx_IN13.0=ADC1_IN13,IN13
@@ -388,9 +477,10 @@ SH.S_TIM5_CH2.0=TIM5_CH2,PWM Generation2 CH2
 SH.S_TIM5_CH2.ConfNb=1
 SH.S_TIM5_CH3.0=TIM5_CH3,PWM Generation3 CH3
 SH.S_TIM5_CH3.ConfNb=1
+SPI5.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
 SPI5.CalculateBaudRate=45.0 MBits/s
 SPI5.Direction=SPI_DIRECTION_2LINES
-SPI5.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate
+SPI5.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler
 SPI5.Mode=SPI_MODE_MASTER
 SPI5.VirtualType=VM_MASTER
 TIM5.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
@@ -399,8 +489,8 @@ TIM5.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
 TIM5.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3
 USART1.IPParameters=VirtualMode
 USART1.VirtualMode=VM_ASYNC
-USART2.IPParameters=VirtualMode
-USART2.VirtualMode=VM_ASYNC
+VP_DMA2D_VS_DMA2D.Mode=DMA2D_Activate
+VP_DMA2D_VS_DMA2D.Signal=DMA2D_VS_DMA2D
 VP_IWDG_VS_IWDG.Mode=IWDG_Activate
 VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG
 VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled

+ 3 - 3
bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h

@@ -5,7 +5,7 @@
   ******************************************************************************
   * @attention
   *
-  * <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
+  * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
   *
   * Redistribution and use in source and binary forms, with or without modification,
   * are permitted provided that the following conditions are met:
@@ -56,7 +56,7 @@
 /* #define HAL_CRYP_MODULE_ENABLED   */
 /* #define HAL_DAC_MODULE_ENABLED   */
 /* #define HAL_DCMI_MODULE_ENABLED   */
-/* #define HAL_DMA2D_MODULE_ENABLED   */
+#define HAL_DMA2D_MODULE_ENABLED
 #define HAL_ETH_MODULE_ENABLED
 /* #define HAL_NAND_MODULE_ENABLED   */
 /* #define HAL_NOR_MODULE_ENABLED   */
@@ -67,7 +67,7 @@
 /* #define HAL_I2C_MODULE_ENABLED   */
 /* #define HAL_I2S_MODULE_ENABLED   */
 #define HAL_IWDG_MODULE_ENABLED
-/* #define HAL_LTDC_MODULE_ENABLED   */
+#define HAL_LTDC_MODULE_ENABLED
 /* #define HAL_RNG_MODULE_ENABLED   */
 #define HAL_RTC_MODULE_ENABLED
 /* #define HAL_SAI_MODULE_ENABLED   */

+ 134 - 39
bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/main.c

@@ -64,10 +64,14 @@
 /* Private variables ---------------------------------------------------------*/
 ADC_HandleTypeDef hadc1;
 
+DMA2D_HandleTypeDef hdma2d;
+
 ETH_HandleTypeDef heth;
 
 IWDG_HandleTypeDef hiwdg;
 
+LTDC_HandleTypeDef hltdc;
+
 RTC_HandleTypeDef hrtc;
 
 SD_HandleTypeDef hsd;
@@ -80,7 +84,6 @@ TIM_HandleTypeDef htim13;
 TIM_HandleTypeDef htim14;
 
 UART_HandleTypeDef huart1;
-UART_HandleTypeDef huart2;
 
 SDRAM_HandleTypeDef hsdram1;
 
@@ -103,7 +106,8 @@ static void MX_TIM13_Init(void);
 static void MX_TIM11_Init(void);
 static void MX_SDIO_SD_Init(void);
 static void MX_TIM5_Init(void);
-static void MX_USART2_UART_Init(void);
+static void MX_LTDC_Init(void);
+static void MX_DMA2D_Init(void);
 /* USER CODE BEGIN PFP */
 
 /* USER CODE END PFP */
@@ -153,7 +157,8 @@ int main(void)
   MX_TIM11_Init();
   MX_SDIO_SD_Init();
   MX_TIM5_Init();
-  MX_USART2_UART_Init();
+  MX_LTDC_Init();
+  MX_DMA2D_Init();
   /* USER CODE BEGIN 2 */
 
   /* USER CODE END 2 */
@@ -219,7 +224,10 @@ void SystemClock_Config(void)
   {
     Error_Handler();
   }
-  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
+  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_RTC;
+  PeriphClkInitStruct.PLLSAI.PLLSAIN = 60;
+  PeriphClkInitStruct.PLLSAI.PLLSAIR = 2;
+  PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;
   PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
   {
@@ -277,6 +285,43 @@ static void MX_ADC1_Init(void)
 
 }
 
+/**
+  * @brief DMA2D Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_DMA2D_Init(void)
+{
+
+  /* USER CODE BEGIN DMA2D_Init 0 */
+
+  /* USER CODE END DMA2D_Init 0 */
+
+  /* USER CODE BEGIN DMA2D_Init 1 */
+
+  /* USER CODE END DMA2D_Init 1 */
+  hdma2d.Instance = DMA2D;
+  hdma2d.Init.Mode = DMA2D_M2M;
+  hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
+  hdma2d.Init.OutputOffset = 0;
+  hdma2d.LayerCfg[1].InputOffset = 0;
+  hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888;
+  hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+  hdma2d.LayerCfg[1].InputAlpha = 0;
+  if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN DMA2D_Init 2 */
+
+  /* USER CODE END DMA2D_Init 2 */
+
+}
+
 /**
   * @brief ETH Initialization Function
   * @param None
@@ -350,6 +395,88 @@ static void MX_IWDG_Init(void)
 
 }
 
+/**
+  * @brief LTDC Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_LTDC_Init(void)
+{
+
+  /* USER CODE BEGIN LTDC_Init 0 */
+
+  /* USER CODE END LTDC_Init 0 */
+
+  LTDC_LayerCfgTypeDef pLayerCfg = {0};
+  LTDC_LayerCfgTypeDef pLayerCfg1 = {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 = 7;
+  hltdc.Init.VerticalSync = 3;
+  hltdc.Init.AccumulatedHBP = 14;
+  hltdc.Init.AccumulatedVBP = 5;
+  hltdc.Init.AccumulatedActiveW = 654;
+  hltdc.Init.AccumulatedActiveH = 485;
+  hltdc.Init.TotalWidth = 660;
+  hltdc.Init.TotalHeigh = 487;
+  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 = 0;
+  pLayerCfg.WindowY0 = 0;
+  pLayerCfg.WindowY1 = 0;
+  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
+  pLayerCfg.Alpha = 0;
+  pLayerCfg.Alpha0 = 0;
+  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
+  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
+  pLayerCfg.FBStartAdress = 0;
+  pLayerCfg.ImageWidth = 0;
+  pLayerCfg.ImageHeight = 0;
+  pLayerCfg.Backcolor.Blue = 0;
+  pLayerCfg.Backcolor.Green = 0;
+  pLayerCfg.Backcolor.Red = 0;
+  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  pLayerCfg1.WindowX0 = 0;
+  pLayerCfg1.WindowX1 = 0;
+  pLayerCfg1.WindowY0 = 0;
+  pLayerCfg1.WindowY1 = 0;
+  pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
+  pLayerCfg1.Alpha = 0;
+  pLayerCfg1.Alpha0 = 0;
+  pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
+  pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
+  pLayerCfg1.FBStartAdress = 0;
+  pLayerCfg1.ImageWidth = 0;
+  pLayerCfg1.ImageHeight = 0;
+  pLayerCfg1.Backcolor.Blue = 0;
+  pLayerCfg1.Backcolor.Green = 0;
+  pLayerCfg1.Backcolor.Red = 0;
+  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, 1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN LTDC_Init 2 */
+
+  /* USER CODE END LTDC_Init 2 */
+
+}
+
 /**
   * @brief RTC Initialization Function
   * @param None
@@ -647,39 +774,6 @@ static void MX_USART1_UART_Init(void)
 
 }
 
-/**
-  * @brief USART2 Initialization Function
-  * @param None
-  * @retval None
-  */
-static void MX_USART2_UART_Init(void)
-{
-
-  /* USER CODE BEGIN USART2_Init 0 */
-
-  /* USER CODE END USART2_Init 0 */
-
-  /* USER CODE BEGIN USART2_Init 1 */
-
-  /* USER CODE END USART2_Init 1 */
-  huart2.Instance = USART2;
-  huart2.Init.BaudRate = 115200;
-  huart2.Init.WordLength = UART_WORDLENGTH_8B;
-  huart2.Init.StopBits = UART_STOPBITS_1;
-  huart2.Init.Parity = UART_PARITY_NONE;
-  huart2.Init.Mode = UART_MODE_TX_RX;
-  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
-  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
-  if (HAL_UART_Init(&huart2) != HAL_OK)
-  {
-    Error_Handler();
-  }
-  /* USER CODE BEGIN USART2_Init 2 */
-
-  /* USER CODE END USART2_Init 2 */
-
-}
-
 /* FMC initialization function */
 static void MX_FMC_Init(void)
 {
@@ -724,13 +818,14 @@ static void MX_GPIO_Init(void)
 {
 
   /* GPIO Ports Clock Enable */
+  __HAL_RCC_GPIOE_CLK_ENABLE();
   __HAL_RCC_GPIOC_CLK_ENABLE();
+  __HAL_RCC_GPIOI_CLK_ENABLE();
   __HAL_RCC_GPIOF_CLK_ENABLE();
   __HAL_RCC_GPIOH_CLK_ENABLE();
   __HAL_RCC_GPIOA_CLK_ENABLE();
-  __HAL_RCC_GPIOG_CLK_ENABLE();
-  __HAL_RCC_GPIOE_CLK_ENABLE();
   __HAL_RCC_GPIOB_CLK_ENABLE();
+  __HAL_RCC_GPIOG_CLK_ENABLE();
   __HAL_RCC_GPIOD_CLK_ENABLE();
 
 }

+ 266 - 42
bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c

@@ -163,6 +163,53 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
 
 }
 
+/**
+* @brief DMA2D MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hdma2d: DMA2D handle pointer
+* @retval None
+*/
+void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d)
+{
+
+  if(hdma2d->Instance==DMA2D)
+  {
+  /* USER CODE BEGIN DMA2D_MspInit 0 */
+
+  /* USER CODE END DMA2D_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_DMA2D_CLK_ENABLE();
+  /* USER CODE BEGIN DMA2D_MspInit 1 */
+
+  /* USER CODE END DMA2D_MspInit 1 */
+  }
+
+}
+
+/**
+* @brief DMA2D MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hdma2d: DMA2D handle pointer
+* @retval None
+*/
+
+void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d)
+{
+
+  if(hdma2d->Instance==DMA2D)
+  {
+  /* USER CODE BEGIN DMA2D_MspDeInit 0 */
+
+  /* USER CODE END DMA2D_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_DMA2D_CLK_DISABLE();
+  /* USER CODE BEGIN DMA2D_MspDeInit 1 */
+
+  /* USER CODE END DMA2D_MspDeInit 1 */
+  }
+
+}
+
 /**
 * @brief ETH MSP Initialization
 * This function configures the hardware resources used in this example
@@ -275,6 +322,225 @@ void HAL_ETH_MspDeInit(ETH_HandleTypeDef* heth)
 
 }
 
+/**
+* @brief LTDC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hltdc: LTDC handle pointer
+* @retval None
+*/
+void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc)
+{
+
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(hltdc->Instance==LTDC)
+  {
+  /* USER CODE BEGIN LTDC_MspInit 0 */
+
+  /* USER CODE END LTDC_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_LTDC_CLK_ENABLE();
+  
+    __HAL_RCC_GPIOE_CLK_ENABLE();
+    __HAL_RCC_GPIOI_CLK_ENABLE();
+    __HAL_RCC_GPIOF_CLK_ENABLE();
+    __HAL_RCC_GPIOH_CLK_ENABLE();
+    __HAL_RCC_GPIOA_CLK_ENABLE();
+    __HAL_RCC_GPIOB_CLK_ENABLE();
+    __HAL_RCC_GPIOG_CLK_ENABLE();
+    __HAL_RCC_GPIOC_CLK_ENABLE();
+    __HAL_RCC_GPIOD_CLK_ENABLE();
+    /**LTDC GPIO Configuration    
+    PE4     ------> LTDC_B0
+    PE5     ------> LTDC_G0
+    PE6     ------> LTDC_G1
+    PI9     ------> LTDC_VSYNC
+    PI10     ------> LTDC_HSYNC
+    PF10     ------> LTDC_DE
+    PH2     ------> LTDC_R0
+    PH3     ------> LTDC_R1
+    PA3     ------> LTDC_B5
+    PB0     ------> LTDC_R3
+    PB1     ------> LTDC_R6
+    PH8     ------> LTDC_R2
+    PG6     ------> LTDC_R7
+    PG7     ------> LTDC_CLK
+    PC7     ------> LTDC_G6
+    PA11     ------> LTDC_R4
+    PA12     ------> LTDC_R5
+    PH13     ------> LTDC_G2
+    PH15     ------> LTDC_G4
+    PI0     ------> LTDC_G5
+    PI2     ------> LTDC_G7
+    PD6     ------> LTDC_B2
+    PG10     ------> LTDC_G3
+    PG11     ------> LTDC_B3
+    PG12     ------> LTDC_B1
+    PB8     ------> LTDC_B6
+    PB9     ------> LTDC_B7
+    PI4     ------> LTDC_B4 
+    */
+    GPIO_InitStruct.Pin = 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_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_2 
+                          |GPIO_PIN_4;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOI, &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_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_13 
+                          |GPIO_PIN_15;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_11|GPIO_PIN_12;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    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_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF9_LTDC;
+    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_11|GPIO_PIN_12;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_7;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_6;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOD, &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_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF9_LTDC;
+    HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+  /* USER CODE BEGIN LTDC_MspInit 1 */
+
+  /* USER CODE END LTDC_MspInit 1 */
+  }
+
+}
+
+/**
+* @brief LTDC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hltdc: LTDC handle pointer
+* @retval None
+*/
+
+void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc)
+{
+
+  if(hltdc->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    
+    PE4     ------> LTDC_B0
+    PE5     ------> LTDC_G0
+    PE6     ------> LTDC_G1
+    PI9     ------> LTDC_VSYNC
+    PI10     ------> LTDC_HSYNC
+    PF10     ------> LTDC_DE
+    PH2     ------> LTDC_R0
+    PH3     ------> LTDC_R1
+    PA3     ------> LTDC_B5
+    PB0     ------> LTDC_R3
+    PB1     ------> LTDC_R6
+    PH8     ------> LTDC_R2
+    PG6     ------> LTDC_R7
+    PG7     ------> LTDC_CLK
+    PC7     ------> LTDC_G6
+    PA11     ------> LTDC_R4
+    PA12     ------> LTDC_R5
+    PH13     ------> LTDC_G2
+    PH15     ------> LTDC_G4
+    PI0     ------> LTDC_G5
+    PI2     ------> LTDC_G7
+    PD6     ------> LTDC_B2
+    PG10     ------> LTDC_G3
+    PG11     ------> LTDC_B3
+    PG12     ------> LTDC_B1
+    PB8     ------> LTDC_B6
+    PB9     ------> LTDC_B7
+    PI4     ------> LTDC_B4 
+    */
+    HAL_GPIO_DeInit(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
+
+    HAL_GPIO_DeInit(GPIOI, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_2 
+                          |GPIO_PIN_4);
+
+    HAL_GPIO_DeInit(GPIOF, GPIO_PIN_10);
+
+    HAL_GPIO_DeInit(GPIOH, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_13 
+                          |GPIO_PIN_15);
+
+    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3|GPIO_PIN_11|GPIO_PIN_12);
+
+    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_8|GPIO_PIN_9);
+
+    HAL_GPIO_DeInit(GPIOG, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_11 
+                          |GPIO_PIN_12);
+
+    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_7);
+
+    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_6);
+
+  /* USER CODE BEGIN LTDC_MspDeInit 1 */
+
+  /* USER CODE END LTDC_MspDeInit 1 */
+  }
+
+}
+
 /**
 * @brief RTC MSP Initialization
 * This function configures the hardware resources used in this example
@@ -659,30 +925,6 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
 
   /* USER CODE END USART1_MspInit 1 */
   }
-  else if(huart->Instance==USART2)
-  {
-  /* USER CODE BEGIN USART2_MspInit 0 */
-
-  /* USER CODE END USART2_MspInit 0 */
-    /* Peripheral clock enable */
-    __HAL_RCC_USART2_CLK_ENABLE();
-  
-    __HAL_RCC_GPIOD_CLK_ENABLE();
-    /**USART2 GPIO Configuration    
-    PD5     ------> USART2_TX
-    PD6     ------> USART2_RX 
-    */
-    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
-    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
-    GPIO_InitStruct.Pull = GPIO_PULLUP;
-    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
-    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
-    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
-
-  /* USER CODE BEGIN USART2_MspInit 1 */
-
-  /* USER CODE END USART2_MspInit 1 */
-  }
 
 }
 
@@ -716,24 +958,6 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
 
   /* USER CODE END USART1_MspDeInit 1 */
   }
-  else if(huart->Instance==USART2)
-  {
-  /* USER CODE BEGIN USART2_MspDeInit 0 */
-
-  /* USER CODE END USART2_MspDeInit 0 */
-    /* Peripheral clock disable */
-    __HAL_RCC_USART2_CLK_DISABLE();
-  
-    /**USART2 GPIO Configuration    
-    PD5     ------> USART2_TX
-    PD6     ------> USART2_RX 
-    */
-    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_5|GPIO_PIN_6);
-
-  /* USER CODE BEGIN USART2_MspDeInit 1 */
-
-  /* USER CODE END USART2_MspDeInit 1 */
-  }
 
 }
 

+ 14 - 0
bsp/stm32/stm32f429-fire-challenger/board/Kconfig

@@ -21,6 +21,7 @@ menu "Onboard Peripheral Drivers"
         
     config BSP_USING_SDRAM
         bool "Enable SDRAM"
+        select BSP_USING_FMC
         default n
         
     config BSP_USING_SPI_FLASH
@@ -30,6 +31,12 @@ menu "Onboard Peripheral Drivers"
         select RT_USING_SFUD
         select RT_SFUD_USING_SFDP
         default n
+
+    config BSP_USING_LCD
+        bool "Enable LCD"
+        select BSP_USING_LTDC
+        select BSP_USING_SDRAM
+        default n
         
     config BSP_USING_MPU6050
         bool "Enable MPU6050 (i2c1)"
@@ -214,6 +221,13 @@ menu "On-chip Peripheral Drivers"
         select RT_USING_DFS
         default n
 
+    config BSP_USING_FMC
+        bool
+        default n
+
+    config BSP_USING_LTDC
+        bool
+        default n
 endmenu
 
 menu "Board extended module Drivers"

+ 51 - 48
bsp/stm32/stm32f429-fire-challenger/board/board.c

@@ -12,54 +12,57 @@
 
 void SystemClock_Config(void)
 {
-  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
-  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
-  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 
-  /**Configure the main internal regulator output voltage 
-  */
-  __HAL_RCC_PWR_CLK_ENABLE();
-  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
-  /**Initializes the CPU, AHB and APB busses clocks 
-  */
-  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE
-                              |RCC_OSCILLATORTYPE_LSE;
-  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
-  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
-  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
-  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
-  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
-  RCC_OscInitStruct.PLL.PLLM = 15;
-  RCC_OscInitStruct.PLL.PLLN = 216;
-  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
-  RCC_OscInitStruct.PLL.PLLQ = 8;
-  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
-  {
-    Error_Handler();
-  }
-  /**Activate the Over-Drive mode 
-  */
-  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
-  {
-    Error_Handler();
-  }
-  /**Initializes the CPU, AHB and APB busses clocks 
-  */
-  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
-                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
-  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
-  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
-  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
-  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
+    /**Configure the main internal regulator output voltage
+    */
+    __HAL_RCC_PWR_CLK_ENABLE();
+    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+    /**Initializes the CPU, AHB and APB busses clocks
+    */
+    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE
+                                       | RCC_OSCILLATORTYPE_LSE;
+    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+    RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+    RCC_OscInitStruct.LSIState = RCC_LSI_ON;
+    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+    RCC_OscInitStruct.PLL.PLLM = 15;
+    RCC_OscInitStruct.PLL.PLLN = 216;
+    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+    RCC_OscInitStruct.PLL.PLLQ = 8;
+    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+    {
+        Error_Handler();
+    }
+    /**Activate the Over-Drive mode
+    */
+    if (HAL_PWREx_EnableOverDrive() != HAL_OK)
+    {
+        Error_Handler();
+    }
+    /**Initializes the CPU, AHB and APB busses clocks
+    */
+    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
+                                  | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
+    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
 
-  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
-  {
-    Error_Handler();
-  }
-  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
-  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
-  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
-  {
-    Error_Handler();
-  }
+    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
+    {
+        Error_Handler();
+    }
+    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_RTC;
+    PeriphClkInitStruct.PLLSAI.PLLSAIN = 60;
+    PeriphClkInitStruct.PLLSAI.PLLSAIR = 2;
+    PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;
+    PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+    {
+        Error_Handler();
+    }
 }

+ 33 - 0
bsp/stm32/stm32f429-fire-challenger/board/ports/lcd_port.h

@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2019-01-08     zylx         first version
+ */
+
+#ifndef __LCD_PORT_H__
+#define __LCD_PORT_H__
+
+/* fire 5 inch screen, 800 * 480 */
+#define LCD_WIDTH           800
+#define LCD_HEIGHT          480
+#define LCD_BITS_PER_PIXEL  16
+#define LCD_BUF_SIZE        (LCD_WIDTH * LCD_HEIGHT * BITS_PER_PIXEL / 8)
+#define LCD_PIXEL_FORMAT    RTGRAPHIC_PIXEL_FORMAT_RGB565
+
+#define LCD_HSYNC_WIDTH     2
+#define LCD_VSYNC_HEIGHT    2
+#define LCD_HBP             46
+#define LCD_VBP             23
+#define LCD_HFP             22
+#define LCD_VFP             22
+
+#define LCD_BACKLIGHT_USING_GPIO
+#define LCD_BL_GPIO_NUM     GET_PIN(D, 7)
+#define LCD_DISP_GPIO_NUM   GET_PIN(D, 4)
+/* fire 5 inch screen, 800 * 480 */
+
+#endif /* __LCD_PORT_H__ */

Некоторые файлы не были показаны из-за большого количества измененных файлов