1040|4

174

帖子

0

资源

一粒金砂(中级)

【STM32F769Discovery开发板试用】搭建开发环境&驱动液晶屏显示点阵字符&触摸屏驱动

       收到开发板已经有一段时间了,由于忙于NXP项目,一直没时间发帖,现在开始陆续补上。
       STM32F769Discovery开发板是ST官方推出的功能齐全的评估开发板,相关的资料和例程也是非常完善的,因此几乎不需要花费多大的力气就可以上手这块开发板。如果是按照传统方式MDK开发的话,只需要下载两个文件即可,第一是CubeF7的固件源码压缩包,里面有ST官方做好的所有例程。我这人比较喜欢从效果入手反推,所以就选择里面的BSP例程,这个例程的作用是将开发板上的大部分入门外设都做成了一个演示DEMO,包括液晶屏,触摸屏,按键,SDRAM,FLASH,SD卡,音频等等,就可以比较快速地入门这些板上的基础外设,当然这个BSP例程缺了网口和USB HS的的DEMO,这个需要寻找别的例程,这里我做了个演示gif:

1.jpg 1.gif

那么,根据以往我拆装组合例程的经验,很快就把官方的BSP例程拆出来组合成自己的工程了:

2.jpg

 

这次我只打算驱动液晶屏和触摸屏,所以涉及的代码量不多,也非常容易理解,开发板的显存部分是挂到了外置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!='\0';i++)
    {
        LCD_Show_Char_1632(x+i*16,y,str,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程序,只是为了调用官方的驱动代码:

2.gif

上传这个工程压缩包:

STM32F769 - 副本.zip (1.56 MB, 下载次数: 11)

IMG_20200709_003217.jpg

回复

2652

帖子

1

资源

五彩晶圆(初级)

头疼,转给4哥了。

点评

不会吧,ST管板把例程都给出来了,这都不玩嘛道长  详情 回复 发表于 2020-7-10 13:48
个人签名人已离开,无事别找,找也找不到。

回复

174

帖子

0

资源

一粒金砂(中级)

freebsder 发表于 2020-7-9 20:53 头疼,转给4哥了。

不会吧,ST管板把例程都给出来了,这都不玩嘛道长

点评

时间有点紧,这段时间加班有点多,哈哈。算了,等下次吧。  详情 回复 发表于 2020-7-11 15:21

回复

2652

帖子

1

资源

五彩晶圆(初级)

donatello1996 发表于 2020-7-10 13:48 不会吧,ST管板把例程都给出来了,这都不玩嘛道长

时间有点紧,这段时间加班有点多,哈哈。算了,等下次吧。

个人签名人已离开,无事别找,找也找不到。

回复

5840

帖子

453

资源

五彩晶圆(高级)

做个菜单例程看看效果


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

关闭
站长推荐上一条 1/5 下一条

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

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

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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