收到开发板已经有一段时间了,由于忙于NXP项目,一直没时间发帖,现在开始陆续补上。
STM32F769Discovery开发板是ST官方推出的功能齐全的评估开发板,相关的资料和例程也是非常完善的,因此几乎不需要花费多大的力气就可以上手这块开发板。如果是按照传统方式MDK开发的话,只需要下载两个文件即可,第一是CubeF7的固件源码压缩包,里面有ST官方做好的所有例程。我这人比较喜欢从效果入手反推,所以就选择里面的BSP例程,这个例程的作用是将开发板上的大部分入门外设都做成了一个演示DEMO,包括液晶屏,触摸屏,按键,SDRAM,FLASH,SD卡,音频等等,就可以比较快速地入门这些板上的基础外设,当然这个BSP例程缺了网口和USB HS的的DEMO,这个需要寻找别的例程,这里我做了个演示gif:
那么,根据以往我拆装组合例程的经验,很快就把官方的BSP例程拆出来组合成自己的工程了:
这次我只打算驱动液晶屏和触摸屏,所以涉及的代码量不多,也非常容易理解,开发板的显存部分是挂到了外置RAM颗粒的,地址我记得貌似是0xd000000开头的一段32位长度的SDRAM地址,由于单片机里面不存在MMU,STM32F769的LTDC控制器可以使用两种方式直接操作显存,即单点操作和DMA2D缓存操作,单点操作适合拿来做画点的工作,比如画点阵汉字,画圆,画不规则多边形和画实时动态曲线,而DMA2D缓存操作适合给屏幕的某一篇矩形区域刷入特定的数据,如将BMP数组导入到显存中,或者刷单色矩形图案,两种方式的延迟差异可以忽略不计(因为STM32F7本身就是高达216MHz主频的处理器),不同图案使用不同方式绘制。
如果需要在屏幕上显示字符信息,那么适合使用单点操作,单点操作的方式超级简单,就是一个直接操作单个32位SDRAM地址空间的函数,可以控制屏幕的任何一个像素的颜色,颜色是32位色,即ARGB8888:
void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code)
{
*(__IO uint32_t*) (hltdc_discovery.LayerCfg[ActiveLayer].FBStartAdress + (4*(Ypos*BSP_LCD_GetXSize() + Xpos))) = RGB_Code;
}
-三个参数分别是X坐标,Y坐标,像素颜色,没有MMU的情况下,直接操作SDRAM内存地址就是往屏幕画点。那么,根据这个画点函数,要画出ASCII字符和汉字点阵那都是易如反掌了:
void LCD_Show_Char_1632(int x,int y,unsigned char ch,int fc,int bc)
{
int i,j;
int n=ch-' ';
unsigned char pix;
for(i=0;i<32;i++)
{
pix=a[i*2+n*64];
for(j=0;j<8;j++)
{
if(pix&0x80)
BSP_LCD_DrawPixel(x+j,y+i,fc);
else BSP_LCD_DrawPixel(x+j,y+i,bc);
pix<<=1;
}
pix=a[i*2+n*64+1];
for(j=8;j<16;j++)
{
if(pix&0x80)
BSP_LCD_DrawPixel(x+j,y+i,fc);
else BSP_LCD_DrawPixel(x+j,y+i,bc);
pix<<=1;
}
}
}
void LCD_Show_String_1632(int x,int y,unsigned char str[],int fc,int bc)
{
int i;
for(i=0;str[i]!='\0';i++)
{
LCD_Show_Char_1632(x+i*16,y,str[i],fc,bc);
}
}
void LCD_Show_CnChar_3232(int x,int y,unsigned char ch,int fc,int bc)
{
int i,j;
int n=ch;
unsigned char pix;
for(i=0;i<32;i++)
{
pix=b[i*4+n*128];
for(j=0;j<8;j++)
{
if(pix&0x80)
BSP_LCD_DrawPixel(x+j,y+i,fc);
else BSP_LCD_DrawPixel(x+j,y+i,bc);
pix<<=1;
}
pix=b[i*4+n*128+1];
for(j=8;j<16;j++)
{
if(pix&0x80)
BSP_LCD_DrawPixel(x+j,y+i,fc);
else BSP_LCD_DrawPixel(x+j,y+i,bc);
pix<<=1;
}
pix=b[i*4+n*128+2];
for(j=16;j<24;j++)
{
if(pix&0x80)
BSP_LCD_DrawPixel(x+j,y+i,fc);
else BSP_LCD_DrawPixel(x+j,y+i,bc);
pix<<=1;
}
pix=b[i*4+n*128+3];
for(j=24;j<32;j++)
{
if(pix&0x80)
BSP_LCD_DrawPixel(x+j,y+i,fc);
else BSP_LCD_DrawPixel(x+j,y+i,bc);
pix<<=1;
}
}
}
触摸屏同样简单,使用stm32f769i_discovery_ts.c里面的函数BSP_TS_Init(800,480);,如果是使用单点触摸的话,一个BSP_TS_GetState(&tst);函数就能获取触摸坐标,基于此驱动做的一个触摸画板的乞丐版DEMO程序,只是为了调用官方的驱动代码:
上传这个工程压缩包:
STM32F769 - 副本.zip
(1.56 MB, 下载次数: 35)