查看: 1954|回复: 0

【怪兽F7】开始打怪——免费的GUI

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-6 08:48
  • 签到天数: 169 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-6-24 13:01:36 | 显示全部楼层 |阅读模式
    分享到:
    意法半导体向STM32客户免费提供STemWin软件。该软件内置SEGGER VNC虚拟网络计算系统,可运用互联网协议远程查看用户界面。该软件还为开发人员提供其它强大的功能,其中包括窗口管理器和小工具包、触摸屏/鼠标支持,存储器上下文可实现无闪屏刷新。
    目前StemWin并不提供源码,记得好像只有2.9以前的GUI才有源码,这里StemWin是以库的形式提供的。

    可以看出,这个库是针对M7而制作的,所以这里要使用StemWin的话,只要配置GUIConf.c与LCDConf.c两个文件就可以了


    GUIConf.c主要是配置显示缓存的大小 。
    LCDConf.c主要是配置与LCD相关的参数与函数。
    LCD-TFT(液晶显示器——薄膜晶体管)显示器控制器提供并行数字 RGB (红色、绿色、蓝色)以及水平同步、垂直同步、像素时钟和数据使能信号,这些信号直接输出到不同 LCD和 TFT面板的接口。
    层混合:

    LTDC编程步骤:
       1、在 RCC寄存器中使能 LTDC 时钟。
       2、按照面板数据表配置所需像素时钟。
       3、配置同步时序:VSYNC、HSYNC、垂直和水平后沿、有效数据区域以及前沿时序。
       4、配置 LTDC_GCR 寄存器中的同步信号和时钟极性。
       5、必要时,配置 LTDC_BCCR寄存器中的背景色。
       6、配置 LTDC_IER和LTDC_LIPCR 寄存器中的所需中断。
       7、通过执行以下编程操作配置第 1/2层的参数:
       1)、编程LTDC_LxWHPCR和LTDC_WVPCR 寄存器中的层窗口的水平和垂直位置。层窗口必须位于有效数据区域
       2)、编程LTDC_LxPFCR 寄存器中的像素输入格式
       3)、 编程LTDC_LxCFBAR寄存器中的颜色帧起始地址
       4)、 编程LTDC_LxCFBLR寄存器中的颜色帧缓冲区的行长和间距
       5)、 编程LTDC_LxCFBLNR寄存器中的颜色帧缓冲区的行数
       6)、 必要时,在LTDC_LxCLUTWR寄存器中为 CLUT 加载 RGB值及其地址
       7)、 必要时,分别在LTDC_LxDCCR和LTDC_LxBFCR寄存器中配置默认颜色和混合系数
       8、使能 LTDC_LxCR寄存器中的第 1/2层,必要时使能 CLUT 。
       9、必要时,可分别在LTDC_GCR和   LTDC_LxCKCR寄存器中使能抖动和色键。也可以实时使能这两个功能。
       10、通过 LTDC_SRCR 寄存器将影子寄存器重载到活动寄存器中。
       11、使能 LTDC_GCR 寄存器中的 LCD-TFT控制器。
       12、除 CLUT外,所有层参数均可实时修改。新配置必须通过配置LTDC_SRCR 寄存器立即重载或在垂直消隐周期内重载。
         
    如下,LTDC的初始化函数。对板子上的LCD进行初始化。
    static void LCD_LL_LayerInit(U32 LayerIndex) {  LTDC_LayerCfgTypeDef             layer_cfg;    if (LayerIndex < GUI_NUM_LAYERS)   {     /* Layer configuration */    layer_cfg.WindowX0 = 0;    layer_cfg.WindowX1 = XSIZE_PHYS;    layer_cfg.WindowY0 = 0;    layer_cfg.WindowY1 = YSIZE_PHYS;     layer_cfg.PixelFormat = LCD_LL_GetPixelformat(LayerIndex);    layer_cfg.FBStartAdress = ((uint32_t)0xC0000000);    layer_cfg.Alpha = 255;    layer_cfg.Alpha0 = 0;    layer_cfg.Backcolor.Blue = 0;    layer_cfg.Backcolor.Green = 0;    layer_cfg.Backcolor.Red = 0;    layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;    layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;    layer_cfg.ImageWidth = XSIZE_PHYS;    layer_cfg.ImageHeight = YSIZE_PHYS;    HAL_LTDC_ConfigLayer(&hltdc, &layer_cfg, LayerIndex);          /* Enable LUT on demand */    if (LCD_GetBitsPerPixelEx(LayerIndex) <= 8)     {      /* Enable usage of LUT for all modes with <= 8bpp*/      HAL_LTDC_EnableCLUT(&hltdc, LayerIndex);    }   } }static void LCD_LL_Init(void) {   /* DeInit */  HAL_LTDC_DeInit(&hltdc);    /* Set LCD Timings */  hltdc.Init.HorizontalSync = 40;  hltdc.Init.VerticalSync = 9;  hltdc.Init.AccumulatedHBP = 53;  hltdc.Init.AccumulatedVBP = 11;  hltdc.Init.AccumulatedActiveH = 283;  hltdc.Init.AccumulatedActiveW = 533;  hltdc.Init.TotalHeigh = 285;  hltdc.Init.TotalWidth = 565;    /* background value */  hltdc.Init.Backcolor.Blue = 0;  hltdc.Init.Backcolor.Green = 0;  hltdc.Init.Backcolor.Red = 0;      /* Polarity */  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.Instance = LTDC;    HAL_LTDC_Init(&hltdc);  HAL_LTDC_ProgramLineEvent(&hltdc, 0);    /* Enable dithering */  HAL_LTDC_EnableDither(&hltdc);       /* Configure the DMA2D default mode */   hdma2d.Init.Mode         = DMA2D_R2M;  hdma2d.Init.ColorMode    = DMA2D_RGB565;  hdma2d.Init.OutputOffset = 0x0;       hdma2d.Instance          = DMA2D;   if(HAL_DMA2D_Init(&hdma2d) != HAL_OK)  {    while (1);  }    /* Assert display enable LCD_DISP pin */  HAL_GPIO_WritePin(GPIOI, GPIO_PIN_12, GPIO_PIN_SET);  /* Assert backlight LCD_BL_CTRL pin */  HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_SET);}在使用GUI之前,要GUI_Init();函数,对ST enWin 的库进行初始化,并使用WM_SetCreateFlags(WM_CF_MEMDEV);激活存储设备。
    完成上述的工作,就可以在工程中调用ST emWin的API函数了。
    如,在LCD上显示Hello World。
    清屏,清除LCD为黑色的背景色。
    GUI_Clear();设置GUI的字体为GUI_Font20_1。
    GUI_SetFont(&GUI_Font20_1);这里有很多的字体可以使用的。

    使用GUI_DispStringAt函数显示字符串。
    这个函数的第一个参数是要显示的字符串,后两个参数是要显示字符串的位置。
    GUI_DispStringAt("Hello world!", (LCD_GetXSize()-100)/2, (LCD_GetYSize()-20)/2);程序运行结果:
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 08:22 , Processed in 0.120038 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.