3761|5

12

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ST F7大赛~智能小区控制系统~屏幕篇 [复制链接]

本帖最后由 abofly 于 2015-10-4 16:24 编辑

哈哈,很意外入选了ST F7大赛,智能小区控制系统组,并收到了论坛寄来的STM32F746G-DISCO开发板!
收到板子,首先被她的大屏吸引了,还是电容触摸屏!所以决定从屏幕开始学起
然后,纠结了居然没有mini B口的数据线,不能用ST-Link调试!刚好想组一台台式机,就搁置了几天一起去数码城买。
步入正题:屏幕
第一步收集各种资料,可是屏幕的资料在哪呢?没有数据手册吗?什么控制芯片?(⊙o⊙)…,只能从官方例程下手
关于屏幕的例子看了几个,一下子凌乱了,LTDC、DMA2D?,前期工作没做好呀,呵呵,回到第一个例子吧:
STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Examples\LTDC\LTDC_Display_1Layer
看着这美女决定换掉她,方法简单找到图片数据替换!emWin工具轻松搞定

可是怎么显示的还是看不懂,回到原程序吧!
程序中始终没发现屏幕控制芯片的初始化,最关键的就是两句话:
  if(HAL_LTDC_Init(&hltdc_F) != HAL_OK)
  if(HAL_LTDC_ConfigLayer(&hltdc_F, &pLayerCfg, 1) != HAL_OK)
只能好好看数据手册了!查了些资料,原来屏幕的控制方式使用了LTDC,而且STM32F429I Discovery屏幕也是这样的。
/* Timing Configuration */参数配置:水平同步,垂直同步……参数看不懂,原来是从最右侧返回左侧,最下边返回最上边
LCD时序:http://blog.163.com/kmustchenb@126/blog/static/11090576520100363410559/
/* Layer1 Configuration*/参数还好理解一些,窗口,像素颜色模式,缓冲地址,背景色,透明度等。
HAL_LTDC_Init(&hltdc_F)里参数初始化及LTDC使能,注意:此时可以显示LCD背景颜色了,屏幕的数据通信在哪呢?
HAL_LTDC_ConfigLayer(&hltdc_F, &pLayerCfg, 1) 里关键的就是  LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);层参数初始化和使能,屏幕的数据通信在哪呢?
好吧纠结了半天,查资料明白了,LTDC就是LCD控制器
LCD控制器:http://blog.chinaunix.net/uid-23193900-id-3188233.html
LCD控制器功能是什么呢,就是负责组织屏幕数据刷新的!LTDC控制器一直在取缓存中的数据刷新屏幕,这个过程不用我们关心,我们只负责改变缓存中的数据。
编程验证1:  我们改变一下数据缓冲区的数据类型 static uint32_t RGB565_480x272[65280];改为uint32_t RGB565_480x272[65280];
并在主函数的死循环里不断更新能容:
  while (1)
  {
      tempdata = tempdata + 0xFF;              //改变内容
      for(index=0;index<6000;index++)
      {
           RGB565_480x272[index] = tempdata;
      };
       HAL_Delay(500);                                //ms延时
}
屏幕上方几行颜色每半秒变化一次,无屏幕数据交换控制!
编程验证2: 我们准备两幅图片缓冲数据,每半秒换一下LTDC所指向的缓冲区,缓冲区地址不好找采用下面方法
将static void LCD_Config(void)函数中的  static LTDC_HandleTypeDef hltdc_F;设置为全局变量,因为初始化时是将该变量的地址一层层向下传递到缓冲区初始化。
主函数死循环函数改为:
  while (1)
  {
      HAL_Delay(500);
      BSP_LED_Toggle(LED1);
      HAL_LTDC_SetAddress(&hltdc_F,(uint32_t)&myRGB565_480x272,1);//我的图像
  
     HAL_Delay(500);
     BSP_LED_Toggle(LED1);
     HAL_LTDC_SetAddress(&hltdc_F,(uint32_t)&RGB565_480x272,1);//原始图像
  }
或者

  while (1)
  {
      HAL_Delay(500);
      BSP_LED_Toggle(LED1);
      LTDC_LAYER(&hltdc_F, 1)->CFBAR = (uint32_t)&myRGB565_480x272;//我的图像
      (&hltdc_F)->Instance->SRCR = LTDC_SRCR_VBR;//影子寄存器特点设置后需手动刷新
  
     HAL_Delay(500);
     BSP_LED_Toggle(LED1);

     LTDC_LAYER(&hltdc_F, 1)->CFBAR = (uint32_t)&RGB565_480x272;//原始图像
     (&hltdc_F)->Instance->SRCR = LTDC_SRCR_VBR;//影子寄存器特点设置后需手动刷新
  }

屏幕每半秒交替显示两幅图片,无屏幕数据交换控制!


总结:屏幕LTDC控制器,自动更新屏幕显示,无需手动干预,我们只需改变缓冲区数据即可改变屏幕!关于屏幕图层控制操作细节需进一步学习,高手勿喷!


此帖出自stm32/stm8论坛

最新回复

贴个效果图看看.  详情 回复 发表于 2015-10-6 14:57
点赞 关注
个人签名不积跬步,无以至千里!
 

回复
举报

323

帖子

2

TA的资源

一粒金砂(高级)

沙发
 
以前用LPC2478和LPC1788的时候也是用双显示缓存,显示一个,修改一个
此帖出自stm32/stm8论坛
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
我用BmpCvtDemo.exe整出来的C数组是16位的,请问楼主,用什么办法可以快速把BMP转为32位数组?
此帖出自stm32/stm8论坛
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

4
 
swisor 发表于 2015-10-5 02:37
我用BmpCvtDemo.exe整出来的C数组是16位的,请问楼主,用什么办法可以快速把BMP转为32位数组?

数据直接存为16位的,注意长度加倍,调用时强制转换为32位
此帖出自stm32/stm8论坛
 
个人签名不积跬步,无以至千里!
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

5
 
abofly 发表于 2015-10-5 09:01
数据直接存为16位的,注意长度加倍,调用时强制转换为32位

此帖出自stm32/stm8论坛
 
 
 

回复

6107

帖子

4

TA的资源

版主

6
 
贴个效果图看看.
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表