本帖最后由 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控制器,自动更新屏幕显示,无需手动干预,我们只需改变缓冲区数据即可改变屏幕!关于屏幕图层控制操作细节需进一步学习,高手勿喷!