发新帖本帖赏金 20.00元(功能说明)我要提问
12下一页
返回列表
打印
[STM32F4]

【STM32F469I试用】超详细使用mbed开发LCD教程

[复制链接]
8524|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
colin2135|  楼主 | 2015-12-26 23:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 colin2135 于 2016-1-20 11:44 编辑

     非常感谢21ic,又给予我一次试用的机会。这次是以资深大牛的身份得到F469 DISCOVERY,所以,接下来,我会尽我最大的努力,写一些能帮助大家的 东西。



     收藏了将近10块STM32开发板,F469 DISCOVERY无疑是我最喜欢的一块了。




      我将会大家带来几期关于在mbed上开发的经验帖,帮助大家去尝试使用mbed的开发平台。
     为什么选择在mbed上开发,原因有几下几点:
1. mbed上的开发跟ardunio非常相似,对于从没接触stm32,只会51单片机或者ardunio又准备学习stm32的新手们来说,这是非常快速,并且容易上手的方法。
2. mbed在近一年来,不断的更新,不断的优化,不断的加入更多的设备支持,我相信在以后,会有越来越多的人加入这个社区,而我愿意走在大家前面,帮大家比比看与传统的STM32开发对比,mbed能取代它?
3. 有时间的话,多学习一种技术,何乐而不为呢。
      所以,如果大家认为我的教程有帮助,希望在小跑堂的投票中给我投上一票。
https://bbs.21ic.com/forum.php?mod=viewthread&tid=1277786
在这里就不给大家开箱什么的了,直接上干货。

今天,给大家演示的是在mbed上使用LCD,所以,我们先写一个简单的Demo,再讲解LCD里面所有的函数。
1、首先新建一个工程。
2.插入两个需要用到的库文件,BSP_DISCO_F469NILCD_DISCO_F469NI.插入库的过程如下。右键刚才所新建的程序。点击Import Library->From Import Wizard

3.步骤(1):在seach输入“mbed”。(2):双击Authormbed offcialmbed。这样就成功添加 BSP_DISCO_F469NI


4.步骤(1):在seach输入“lcd_disco”。(2):双击NameLCD_DISCO_F469NI。这样就成功添加 BSP_DISCO_F469NI
5.再右键Import file,加入main.cpp。我们给main.cpp添加一段代码:
http://#include "mbed.h"
#include "LCD_DISCO_F469NI.h"

LCD_DISCO_F469NI lcd;

int main()
{
    lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"welcome to 21ic", CENTER_MODE);
    while(1){
    }
    return 0;
}

6.点击compile后,网页提示下载一个bin文件 ,把它放到F469所在的盘,RESET重启。恭喜我们的第一个Demo顺利完成。



下面,开始对一些函数进行讲解。如果有误,请帮忙指出,多多指教。
LCD_DISCO_F469NI lcd;
在声明lcd对象后,做了些什么呢,我们看LCD_DISCO_F469NI的构造函数
LCD_DISCO_F469NI::LCD_DISCO_F469NI()
{
  BSP_LCD_Init();//BSP层的一些初始化,时钟,SDRAM,字体大小,屏幕方向等的一些默认设置
  BSP_LCD_InitEx(LCD_ORIENTATION_LANDSCAPE);//也是对BSP层的初始化,但多了自定义屏幕方向的参数
//对layout的初始化,像素的格式,frame的缓存地址,字体颜色等等
  BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER_BACKGROUND, LCD_FB_START_ADDRESS);
//设置字字大小
  BSP_LCD_SetFont(&Font20);
//把当前显示清除成白色
  BSP_LCD_Clear(LCD_COLOR_WHITE);
}

做完这初始化后,就可以调用LCD_DISCO_F469NI.h的函数了。

首先讲void Clear(uint32_t Color)函数,这个函数是对当前LCD区域进行颜色填充,起到清屏的作用。
我们对上面的那段进行小修改,
int main()
{
    //lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"welcome to 21ic", CENTER_MODE);
    lcd.Clear(LCD_COLOR_BLUE);
    while(1){
    }
    return 0;
}
编译下载到板子上,可以看到整个LCD屏幕都被填充成蓝色。
下面4个函数是读取当前LCD设置的大小,和设置当前LCD大小
uint32_t GetXSize(void);
uint32_t GetYSize(void);
void SetXSize(uint32_t imageWidthPixels);
void SetYSize(uint32_t imageHeightPixels);

下面这个函数是对前景或者背景进行初始化设置,像素的格式,frame的缓存地址,字体颜色等等
LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address)

这个函数是选择默认的layout是哪个
void SelectLayer(uint32_t LayerIndex)

这个函数是设置前景或背景是否可见。
void SetLayerVisible(uint32_t LayerIndex, FunctionalState State);

这个函数是设置前景或背景的透明度。
void SetTransparency(uint32_t LayerIndex, uint8_t Transparency);

这个函数是设置前景或背景的图片缓存地址。
void SetLayerAddress(uint32_t LayerIndex, uint32_t Address);

这个函数是设置前景或背景的显示区域。
void SetLayerWindow(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);

使用一个表面的时候将其背景色去掉
void SetColorKeying(uint32_t LayerIndex, uint32_t RGBValue);
void ResetColorKeying(uint32_t LayerIndex);
举个例子:
使用SetColorKeying和不使用的效果分别如下图:
拍照的效果有偏差,其实是跟上面一样的蓝色,SetColorKeying就是抠图,去掉背景。
大家可以尝试以下代码:
lcd.Clear(LCD_COLOR_GREEN);
    lcd.SetTextColor(LCD_COLOR_BLUE);
    lcd.FillRect(10, 20, 50, 50);
lcd.SetColorKeying(0,LCD_COLOR_GREEN);
下面两个函数是设置和读取字体的颜色
void SetTextColor(uint32_t Color);
uint32_t GetTextColor(void);



下面两个函数是设置和读取字体背景颜色
void SetBackColor(uint32_t Color);
uint32_t GetBackColor(void);
设置和读取字体大小
void SetFont(sFONT *fonts);
sFONT *GetFont(void);
读取当前(X,Y)坐标的RGB像素值
uint32_t ReadPixel(uint16_t Xpos, uint16_t Ypos);

清除所在行的字符串  
void ClearStringLine(uint32_t Line);

显示字符串在(X,Y)坐标开始,Mode是对齐模式,有三种,靠左LEFT_MODE,靠右RIGHT_MODE,居中CENTER_MODE
void DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Text_AlignModeTypdef Mode);

在某行显示字符串
void DisplayStringAtLine(uint16_t Line, uint8_t *ptr);

显示单个字母
void DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii);

从(X,Y)坐标开始,画长度为Length的直线
void DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length);
从(X,Y)坐标开始,画长度为Length的坚线
void DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length);

从一个点画一条线到另外一个点
void DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);

下面分别是画矩形,圆形,椭圆型的,中间为空的。
void DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
void DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius);
void DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius);

下面这个是画多边形
void DrawPolygon(pPoint Points, uint16_t PointCount);
举例:画一个三角形
Point point[3];
                point[0].X=20;
                point[0].Y=20;
                point[1].X=50;
                point[1].Y=50;
                point[2].X=20;
                point[2].Y=90;
    lcd.Clear(LCD_COLOR_GREEN);
    lcd.DrawPolygon(point,3);


用法与上面一样,但是中间是覆盖的。
void FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
void FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius);
void FillPolygon(pPoint Points, uint16_t PointCount);
void FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius);

LCD显示和打开的开关。
void DisplayOn(void);
void DisplayOff(void);


下面带来难度比较大的,显示图片。
mbed库文件显示图片有两种方式,一种是通过ARGB显示,一种是BMP图像
今天给大家使用ARBG模式,大家回去自己试一下显示BMP图像。

ARGB的方式转为繁琐,需要先将图片转为数组文件,然后通过以下函数进行像素填充。大家可以网上下载把图像转成ARGB的数组文件软件。
void DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code); 填充函数
#include "mbed.h"
#include "LCD_DISCO_F469NI.h"
#include "picture.h"
LCD_DISCO_F469NI lcd;
uint16_t picture_width=800;
uint16_t picture_height=480;
int main()
{
   
    int i,j;
    uint32_t ARGB=0;
    lcd.SetLayerWindow(0,0,0,picture_width,picture_height);
    for(j=0;j<picture_height;j++){
        for(i=0;i<picture_width;i++)
        {
            ARGB=*((uint32_t*)(gImage_picture+j*picture_width*4+i*4));
            ARGB|=0Xff000000;//<span style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">ARGB</span><font face="Droid Sans" style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">中的</font><font face="Calibri" style="color: rgb(0, 0, 10); font-size: 10.5pt; line-height: 1.5;">A</font><font face="Droid Sans" style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">代表透明度,我们设置为</font><font face="Calibri" style="color: rgb(0, 0, 10); font-size: 10.5pt; line-height: 1.5;">FF</font><font face="Droid Sans" style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">,不透明。</font>




打赏榜单

21ic小管家 打赏了 10.00 元 2016-05-16
理由:【申请有奖】TI USBType-C来袭,测评达人是你吗?活动打赏。

21ic小喇叭 打赏了 10.00 元 2015-12-29

沙发
colin2135|  楼主 | 2015-12-27 00:02 | 只看该作者
上面图片显示的代码有点问题,超过20000字没法改了,重新发一下。
#include "mbed.h"
#include "LCD_DISCO_F469NI.h"
#include "picture.h"
LCD_DISCO_F469NI lcd;
uint16_t picture_width=800;
uint16_t picture_height=480;
int main()
{
   
    int i,j;
    uint32_t ARGB=0;
    lcd.SetLayerWindow(0,0,0,picture_width,picture_height);
    for(j=0;j<picture_height;j++){
        for(i=0;i<picture_width;i++)
        {
            ARGB=*((uint32_t*)(gImage_picture+j*picture_width*4+i*4));
            ARGB|=0Xff000000;//ARGB中的A代表透明度,我们设置为FF,不透明。
           lcd.DrawPixel(i,j,ARGB);
        }
    }
   
   
    while(1){
    }
    return 0;
}

使用特权

评论回复
板凳
colin2135|  楼主 | 2015-12-27 00:06 | 只看该作者
大家帖子顶高点的话,给大家带来触摸屏的教程。

使用特权

评论回复
地板
colin2135|  楼主 | 2015-12-28 09:34 | 只看该作者
没点人气啊?

使用特权

评论回复
5
guet_new_man| | 2015-12-28 12:43 | 只看该作者
顶一个

使用特权

评论回复
6
langzizhishang| | 2015-12-28 12:49 | 只看该作者
顶一个

使用特权

评论回复
7
逍遥李| | 2015-12-28 12:51 | 只看该作者
顶一个~!

使用特权

评论回复
8
slotg| | 2015-12-28 14:35 | 只看该作者
感谢楼主的分享,我目前也正使用 MBED 调试 STM32F469I-DISCO 这块板子。

使用特权

评论回复
9
colin2135|  楼主 | 2015-12-28 14:43 | 只看该作者
slotg 发表于 2015-12-28 14:35
感谢楼主的分享,我目前也正使用 MBED 调试 STM32F469I-DISCO 这块板子。

嗯,有问题分享一下,一起探讨。

使用特权

评论回复
10
huangcunxiake| | 2015-12-28 14:54 | 只看该作者
那个MBED里,提供了触摸的库函数。

使用特权

评论回复
11
huangcunxiake| | 2015-12-28 14:55 | 只看该作者
不过MBED有个缺点就是ARM没有公开对应的.c文件,只提供了中间文件.o文件,然后需要在项目配置里设置才可以使用。跟之前的.c比较起来使用的有点费劲。

使用特权

评论回复
12
lisingch| | 2015-12-29 00:39 | 只看该作者
跟着楼主好好学学。

使用特权

评论回复
13
songchenping| | 2015-12-29 09:29 | 只看该作者
值得学习和借鉴啊

使用特权

评论回复
14
amd1217| | 2015-12-29 13:40 | 只看该作者
很好的教程

使用特权

评论回复
15
大秦正声| | 2015-12-29 14:53 | 只看该作者
不错啊!
我用的是
stm32cubef4官方软件库
程序目录stm32cubef4\STM32Cube_FW_F4_V1.10.0\Projects\STM32469I-Discovery\Examples\DMA2D\DMA2D_MemToMemWithBlending\

使用特权

评论回复
16
colin2135|  楼主 | 2015-12-29 16:37 | 只看该作者
大秦正声 发表于 2015-12-29 14:53
不错啊!
我用的是
stm32cubef4官方软件库

感觉mbed上开发也挺有意思。多一种选择也是好事。

使用特权

评论回复
17
brave123| | 2015-12-29 19:49 | 只看该作者
顶一个。。。

使用特权

评论回复
18
ou513| | 2015-12-30 08:17 | 只看该作者
很详细,很好,必须顶啊

使用特权

评论回复
19
幸福至上| | 2015-12-30 15:09 | 只看该作者
谢谢楼主分享,虽然没摸到板子,但看楼主的示例,就有些直观的了解了。希望有空多出一点其它设备的编程示例。Mark...

使用特权

评论回复
20
丶tiantian| | 2015-12-30 15:24 | 只看该作者
辛苦了~,支持起来。

使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

533

帖子

8

粉丝