请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L4R9 STEMWIN UCOSIII移植,dispstringat 怎么显示缓冲区没有变化?

[复制链接]
xuyejin1 提问时间:2021-9-26 19:06 / 未解决
  我使用STM32L4R9ZGT6,移植了UCOSIII 和 STEMWIN,参考了正点原子的STM429开发板,实验2,文本显示,UCOSIII  STEMWIN都移植了,显示缓冲用的是内部RAM ,没有使用DMA2D,直接LTDC驱动了,程序如下
void TFT_LCD_Init(void)
{
        LTDC_HandleTypeDef hltdc;
        LTDC_LayerCfgTypeDef pLayerCfg = {0};
          LTDC_LayerCfgTypeDef pLayerCfg1 = {0};

        /* USER CODE BEGIN LTDC_Init 0 */
          Ltdc_GPIO_Init();

        //  __HAL_RCC_DMA2D_CLK_ENABLE();                // 源地址-> 目的地址图像格式混合格式
          __HAL_RCC_LTDC_CLK_ENABLE();                        // 产生LCD需要的各种时钟

        /* USER CODE END LTDC_Init 0 */
          /* USER CODE BEGIN LTDC_Init 1 */

          // USER CODE END LTDC_Init 1
          hltdc.Instance = LTDC;
        // Polarity configuration
          // Initialize the horizontal synchronization polarity as active low
          hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
        // Initialize the vertical synchronization polarity as active low
          hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
        // Initialize the data enable polarity as active low
          hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
        // Initialize the pixel clock polarity as input pixel clock
          hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;

        // The RK043FN48H LCD 480x272 is selected
          // Timing Configuration
          hltdc.Init.HorizontalSync = (TM043NDH02_HSYNC - 1);
          hltdc.Init.VerticalSync = (TM043NDH02_VSYNC - 1);
          hltdc.Init.AccumulatedHBP = (TM043NDH02_HSYNC + TM043NDH02_HBP - 1);
          hltdc.Init.AccumulatedVBP = (TM043NDH02_VSYNC + TM043NDH02_VBP - 1);
          hltdc.Init.AccumulatedActiveW = (TM043NDH02_WIDTH + TM043NDH02_HSYNC + TM043NDH02_HBP - 1);
          hltdc.Init.AccumulatedActiveH = (TM043NDH02_HEIGHT + TM043NDH02_VSYNC + TM043NDH02_VBP - 1);
          hltdc.Init.TotalWidth = (TM043NDH02_WIDTH + TM043NDH02_HSYNC + TM043NDH02_HBP + TM043NDH02_HFP - 1);
          hltdc.Init.TotalHeigh = (TM043NDH02_HEIGHT + TM043NDH02_VSYNC + TM043NDH02_VBP + TM043NDH02_VFP - 1);

        // Configure R,G,B component values for LCD background color : all black background
        hltdc.Init.Backcolor.Blue = 0;
          hltdc.Init.Backcolor.Green = 0;
          hltdc.Init.Backcolor.Red = 0;

        // Configure the LTDC
          if (HAL_LTDC_Init(&hltdc) != HAL_OK)
          {
                    Error_Handler();
          }

        // Layer1 Configuration ------------------------------------------------------

          // Windowing configuration
          // In this case all the active display area is used to display a picture then :
             // Horizontal start = horizontal synchronization + Horizontal back porch = 43
             // Vertical start   = vertical synchronization + vertical back porch     = 12
             // Horizontal stop = Horizontal start + window width -1 = 43 + 480 -1
             // Vertical stop   = Vertical start + window height -1  = 12 + 272 -1     
          pLayerCfg.WindowX0 = 0;
          pLayerCfg.WindowX1 = 0;
          pLayerCfg.WindowY0 = 0;
          pLayerCfg.WindowY1 = 0;
          pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
          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, LTDC_LAYER_1) != HAL_OK)
          {
                    Error_Handler();
          }

        pLayerCfg1.WindowX0 = 0;
          pLayerCfg1.WindowX1 = 480;
          pLayerCfg1.WindowY0 = 0;
          pLayerCfg1.WindowY1 = 272;
       
          pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_L8;

        // Alpha constant (255 == totally opaque)
        pLayerCfg1.Alpha = 255;
        // Default Color configuration (configure A,R,G,B component values) : no background color
          pLayerCfg1.Alpha0 = 255;
          pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
          pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
       
          pLayerCfg1.FBStartAdress = (uint32_t)&RGBL8_480x272;
       
          pLayerCfg1.ImageWidth = 480;
          pLayerCfg.ImageHeight = 272;

        pLayerCfg1.Backcolor.Blue = 0;
          pLayerCfg1.Backcolor.Green = 0;
          pLayerCfg1.Backcolor.Red = 0;

        if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, LTDC_LAYER_2) != HAL_OK)
          {
                    Error_Handler();
          }

        //##-2- CLUT Configuration ################################################
          HAL_LTDC_ConfigCLUT(&hltdc, (uint32_t *)L8_480x272_CLUT, 256, LTDC_LAYER_2);



          if (HAL_LTDC_SetPitch(&hltdc, 0, 0) != HAL_OK)
          {
                    Error_Handler();
          }
          if (HAL_LTDC_SetPitch(&hltdc, 0, 1) != HAL_OK)
          {
                    Error_Handler();
          }
          // USER CODE BEGIN LTDC_Init 2

          // USER CODE END LTDC_Init 2
       
        //##-3- Enable CLUT For Layer 1 ############################################
          HAL_LTDC_EnableCLUT(&hltdc, LTDC_LAYER_2);   
          
          // Assert backlight LCD_BL_CTRL pin
          HAL_GPIO_WritePin(GPIOB, LCD_On_Off, GPIO_PIN_SET);//
}


这个是直接初始化LTDC的层2

在显示缓冲区RGBL8_480x272里修改数据,能变化画面
然后移植  STEMWIN,  没有用层,
程序如下
//设置EMWIN内存大小
#define GUI_NUMBYTES                (20*1024)
#define GUI_BLOCKSIZE                0x80  //块大小

//GUI_X_Config
//初始化的时候调用,用来设置emwin所使用的内存
void GUI_X_Config(void) {
                U32 *aMemory = mymalloc(SRAMIN,GUI_NUMBYTES); //从内部RAM中分配GUI_NUMBYTES字节的内存
                GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
                GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
                GUI_SetDefaultFont(&GUI_Font16B_1); //设置默认字体
}


void LCD_X_Config(void)
{
    //设置第一层
        GUI_DEVICE_CreateAndLink(GUIDRV_LIN_8,GUICC_M332,0,0);
               
        GUI_SelectLayer(0);                                                                                     // 设置层0

        LCD_SetSizeEx(0,XSIZE_PHYS,YSIZE_PHYS);   
        LCD_SetVSizeEx(0,XSIZE_PHYS,YSIZE_PHYS);   

        LCD_SetVRAMAddrEx(0, RGBL8_480x272);

}

应用程序如下
        GUI_Init();                                          //STemWin初始化
        WM_MULTIBUF_Enable(1);          // 开启stemwin 多缓冲,RGB屏可能会用到
       
        WM_SetCreateFlags(WM_CF_MEMDEV);                                //Use memory devices on all windows to avoid flicker
        WM_SetCallback(WM_HBKWIN, &_cbBkWindow);                //Set callback for background window
        GUI_SetBkColor(GUI_RED);
        GUI_Clear();
        GUI_SetBkColor(GUI_BLACK);
        GUI_Clear();
        GUI_SetColor(GUI_WHITE);
        GUI_DispStringAt("Hello!", 0, 0);
        GUI_Delay(10);

显示缓冲区使用的8位L8 ,  
        GUI_SetBkColor(GUI_RED);
        GUI_Clear();   显示缓冲区填充的是0xe0   红色

        GUI_SetBkColor(GUI_BLACK);
        GUI_Clear();  显示缓冲区填充的是0x00   黑色

        GUI_SetColor(GUI_WHITE);
        GUI_DispStringAt("Hello!", 0, 0);  显示不出来字符,显示缓冲区没有变化,都是0x00  怎么回事情?




收藏 评论3 发布时间:2021-9-26 19:06

举报

3个回答
xuyejin1 回答时间:2021-9-26 19:08:23
我使用的是 LCDConf_Lin_Template 线性驱动
xuyejin1 回答时间:2021-9-26 19:17:57
好像问题解决了,把TFT_LCD_Init 里的两个HAL_LTDC_SetPitch 注释掉,就可以了,但是这两个程序是做什么用的,搞的不是很清楚
xuyejin1 回答时间:2021-9-26 19:40:42
又碰到一个问题,调用GUI_DELAY后,会清屏,程序如下int GUI_X_GetTime(void) {
        OS_ERR err;
        return ((int)OSTimeGet(&err));   //»ñȡϵͳʱ¼ä,´Ë´¦Ê±¼äµ¥ÔªÎª1ms
}

//GUIÑÓʱº¯Êý
void GUI_X_Delay(int period) {
       
        OS_ERR err;
        CPU_INT32U ticks;
        ticks = (period * 1000) / OSCfg_TickRate_Hz;
        OSTimeDly(ticks,OS_OPT_TIME_DLY,&err);//UCOSIIIÑÓʱ²ÉÓÃÖÜÆÚģʽ
}
为什么?



关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版