首页 > 其他 > 详细

TouchGFX4.13 + FreeRTOS

时间:2020-03-19 09:24:05      阅读:211      评论:0      收藏:0      [点我收藏+]

简介

基于STM32F746移植TouchGFX,学习图形界面开发。

开发平台

硬件平台:STM32F746 Discovery Kit
开发环境:MDK V5.28
工程配置:STM32CubeMX V5.6
界面设计:TouchGFX 4.13

创建工程

芯片选择

打开STM32CubeMX,通过芯片型号选择STM32F746NGHx,开始工程。

System Core配置

  1. 选择RCC配置晶振:HSE选择BYPASS Clock Source,LSE选择Crystal/Ceramic Resonator,点击NVIC Settings勾选RCC global interrupt
    技术分享图片

  2. 选择SYS配置系统时间:Debug选择Serial Wire,开启仿真,SWD接口;Timebase Source选择TIM6用于给系统提供时间基准
    技术分享图片

Connectivity配置

  1. 选择FMC并展开SDRAM 1栏,Clock and chip enable选择SDCKE0 + SDNE0,Internal bank number选择4 banks,Address选择12 bits,Data选择16 bits,Byte enable选择16-bit byte enable
    技术分享图片

  2. 点击SDRAM 1项配置SDRAM的相关参数,点击NVIC Settings勾选FMC global interrupt,点击GPIO Setttings确定接口与实际电路一致
    技术分享图片 技术分享图片

Multimedia配置

  1. 选择DMA2D勾选Mode栏下的Actived,点击Parameter Settings选择适合自己的Color Mode,点击NVIC Settings勾选DMA2D global interrupt
    技术分享图片 技术分享图片

  2. 选择LTDC并下拉Display Type选择与硬件对应的屏幕类型,此处选择RGB888(24 bits),点击Parameter Settings设置对应参数
    技术分享图片 技术分享图片
    设置Layer Settings对应参数
    技术分享图片 技术分享图片
    点击NVIC Settings勾选LTDC global interrupt,点击GPIO Settings确定接口是否与实际电路一致
    技术分享图片 技术分享图片

Computing配置

选择CRC勾选Actived,参数保持默认即可
技术分享图片

Middleware配置

  1. 选择FreeRTOS在Mode栏下选择CMSIS_V1,点击Tasks and Queues配置一个任务,该任务用于TouchGFX
    技术分享图片

  2. 点击Config parameters对FreeRTOS进行配置,主要配置Kernel和Memory
    技术分享图片 技术分享图片

Additional Software配置

  1. 点击顶栏Clock Configuration下方的Additional Software准备开启TouchGFX,要提前下载TouchGFX包
    技术分享图片

  2. 在弹出界面的Packs框内逐步展开并选择TouchGFX,此界面拉小后可以看到右下角的OK
    技术分享图片

  3. 第2步确定后选择左侧栏新增加的Additional Software并点击TouchGFX.4.13.0勾选Graphics Application,配置TouchGFX的参数
    技术分享图片

额外引脚配置

LCD需要增加三个GPIO,PI12控制显示使能,低电平进入Sleep模式,高电平进入正常模式;PK3控制背光,低电平关闭背光,高电平打开背光;PI1控制LD1。GPIO output level选择High,GPIO mode选择Output Push Pull,默认拉高。
技术分享图片

时钟配置

点击界面上方Clock Configuration配置系统时钟
技术分享图片

代码生成

点击界面上方Project Manager设置工程名称和路径,以及IDE的类型,点击右上角GENERATE CODE生成工程代码
技术分享图片

设计界面

打开工程根目录下的/Src/ApplicationTemplate.touchgfx.part文件开始制作界面,编辑完成后点击右上角的Generate Code按钮生成代码,此时.part文件同目录下会生成.touchgfx文件,以后可以直接打开该文件进行界面设计
技术分享图片

代码设计

  1. 手动添加SDRAM的初始化代码,并放到FMC初始化之后运行。先定义相关参数

    /* USER CODE BEGIN PD */
    #define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
    #define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
    #define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
    #define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)
    #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
    #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)
    #define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
    #define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)
    #define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
    #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
    #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)
    /* USER CODE END PD */

    SDRAM初始化代码

    static void MX_SDRAM_Init(void)
    {
     __IO uint32_t tmpmrd = 0;
    
     FMC_SDRAM_CommandTypeDef Command;
    
     /* Step 1: Config clock */
     Command.CommandMode             = FMC_SDRAM_CMD_CLK_ENABLE;
     Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
     Command.AutoRefreshNumber       = 1;
     Command.ModeRegisterDefinition  = 0;
     HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);
    
     /* Step 2: Insert Delay */
     HAL_Delay(1);
    
     /* Step 3: Config pall */
     Command.CommandMode             = FMC_SDRAM_CMD_PALL;
     Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
     Command.AutoRefreshNumber       = 1;
     Command.ModeRegisterDefinition  = 0;
     HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);
    
     /* Step 3: Config auto refresh */
     Command.CommandMode             = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
     Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
     Command.AutoRefreshNumber       = 8;
     Command.ModeRegisterDefinition  = 0;
     HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);
    
     /* Step 4: Config memory mode */
     tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1   | //设置突发长度:1(可以是1/2/4/8)
              SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      | //设置突发类型:连续(可以是连续/交错)
              SDRAM_MODEREG_CAS_LATENCY_3              | //设置CAS值:3(可以是2/3)
              SDRAM_MODEREG_OPERATING_MODE_STANDARD    | //设置操作模式:0,标准模式
              SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;      //设置突发写模式:1,单点访问
     Command.CommandMode             = FMC_SDRAM_CMD_LOAD_MODE;
     Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
     Command.AutoRefreshNumber       = 1;
     Command.ModeRegisterDefinition  = tmpmrd;
     HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);
    
     /* Step 5: Set refresh rate */
     HAL_SDRAM_ProgramRefreshRate(&hsdram1, 1800);
    }
  2. 在defaulttask内启动TouchGFX

    void StartDefaultTask(void const * argument)
    {
     /* USER CODE BEGIN 5 */
     MX_TouchGFX_Process();
     /* Infinite loop */
     for(;;)
     {
         osDelay(1);
     }
     /* USER CODE END 5 */
    }
  3. 额外创建一个任务用于LD1闪烁。声明任务句柄;定义任务块然后启动任务;实现任务入口函数。

    /* USER CODE BEGIN PV */
    osThreadId userTaskHandle;
    /* USER CODE END PV */
    void StartUserTask(void const *argument);
    /* USER CODE BEGIN RTOS_THREADS */
    /* add threads, ... */
    osThreadDef(userTask, StartUserTask, osPriorityNormal, 0, 128);
    userTaskHandle = osThreadCreate(osThread(userTask), NULL);
    /* USER CODE END RTOS_THREADS */
    void StartUserTask(void const *argument)
    {
     for(;;)
     {
         HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_SET);
         osDelay(500);
         HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET);
         osDelay(500);
     }
    }

下载验证

技术分享图片

注意

工程中配置的代码要卸载BEGIN END两行之间,避免重新生成代码后被清除。

TouchGFX4.13 + FreeRTOS

原文:https://www.cnblogs.com/niu-li/p/12519948.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!