【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3
(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-055. LCD-液晶截图)
/**
******************************************************************************
* 硬石YS-F1Pro开发板例程功能说明
*
* 例程名称: YSF1_HAL-055. LCD-液晶截图
*
******************************************************************************
* 说明:
* 本例程配套硬石stm32开发板YS-F1Pro使用。
*
* 淘宝:
* 论坛:http://www.ing10bbs.com
* 版权归硬石嵌入式开发团队所有,请勿商用。
******************************************************************************
*/
【1】例程简介
FSMC:可变静态存储控制器,是STM32系列采用的一种新型的存储器扩展技术。一般可以用FSMC
接口与液晶驱动IC连接,实现数据交换。YS-F1Pro预留16bit的FSMC液晶接口,我们同时提供了
3.5寸TFT液晶模组供选购,该模组的液晶驱动IC型号为ILI9488。
本例程实现液晶模组显示24bit的bmp格式图片。
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号 IO端口 目标功能引脚 出厂默认设置
JP1 PA10 TXD(CH340G) 已接入
JP2 PA9 RXD(CH340G) 已接入
【3】操作及现象
将例程目录下的图片文件拷贝到SD卡中,并把SD卡插入到开发板上,把3.5寸TFT液晶模组插入开发
板中间液晶接口上,使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB
接口(需要安装驱动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序
之后,在串口调试助手窗口可接收到液晶模组ID信息,同时液晶屏幕亮起来,先后显示几张图片。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
bsp_bmp.h文件内容
- #ifndef __BSP_BMP_H__
- #define __BSP_BMP_H__
- /* 包含头文件 ----------------------------------------------------------------*/
- #include "stm32f1xx_hal.h"
- #include <string.h>
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- /* 类型定义 ------------------------------------------------------------------*/
- //位图文件头信息结构定义
- //其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)
- #pragma pack(2) //两字节对齐,否则bmp_fileheader会占16Byte
- typedef struct
- {
- uint16_t bfType; //固定为:bm 0x4d42
- uint32_t bfSize; //文件大小 4
- uint16_t bfReserved1; //保留字,不考虑 2
- uint16_t bfReserved2; //保留字,同上 2
- uint32_t bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 4
- }BMP_FileHeader;
- typedef struct
- {
- uint32_t biSize; //指定此结构体的长度,为40 4
- uint32_t biWidth; //位图宽 4
- uint32_t biHeight; //位图高 4
- uint16_t biPlanes; //平面数,为1 2
- uint16_t biBitCount; //采用颜色位数,可以是1,2,4,8,16,24新的可以是32 2
- uint32_t biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩 4
- uint32_t biSizeImage; //实际位图数据占用的字节数 4
- uint32_t biXPelsPerMeter; //X方向分辨率 4
- uint32_t biYPelsPerMeter; //Y方向分辨率 4
- uint32_t biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) 4
- uint32_t biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 4
- }BMP_InfoHeader;
- typedef struct
- {
- uint8_t rgbBlue; //该颜色的蓝色分量
- uint8_t rgbGreen; //该颜色的绿色分量
- uint8_t rgbRed; //该颜色的红色分量
- uint8_t rgbReserved; //保留值
- }BMP_RGBQUAD;
- /* 宏定义 --------------------------------------------------------------------*/
- // 四个字节对齐 进1制处理
- #define WIDTHBYTES(bits) (((bits)+31)/32*4) //对于24位真彩色 每一行的像素宽度必须是4的倍数 否则补0补齐
- #define GETR_FROM_RGB16(RGB565) ((RGB565>>11)<<3) //返回8位 R
- #define GETG_FROM_RGB16(RGB565) (((RGB565 & 0x07ff)>>5)<<2) //返回8位 G
- #define GETB_FROM_RGB16(RGB565) ((RGB565 & 0x001f)<<3) //返回8位 B
- //#pragma diag_suppress 870 //使编译器支持多字节字符,否则会有invalid multibyte character sequence警告
- /* 扩展变量 ------------------------------------------------------------------*/
- /* 函数声明 ------------------------------------------------------------------*/
- void Lcd_show_bmp(uint16_t x, uint16_t y,char *pic_name);
- uint8_t Screen_shot(uint16_t x,uint16_t y,uint16_t Width,uint16_t Height, const char * filename);
- #endif /* __BSP_BMP_H__ */
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
bsp_bmp.c文件内容
- /**
- ******************************************************************************
- * 文件名程: bsp_bmp.c
- * 作 者: 硬石嵌入式开发团队
- * 版 本: V1.0
- * 编写日期: 2015-10-04
- * 功 能: bmp图像显示实现
- ******************************************************************************
- * 说明:
- * 本例程配套硬石stm32开发板YS-F1Pro使用。
- *
- * 淘宝:
- * 论坛:http://www.ing10bbs.com
- * 版权归硬石嵌入式开发团队所有,请勿商用。
- ******************************************************************************
- */
- /* 包含头文件 ----------------------------------------------------------------*/
- #include "usart/bsp_debug_usart.h"
- #include "lcd/bsp_lcd.h"
- #include "ff.h"
- #include "bmp/bsp_bmp.h"
- /* 私有类型定义 --------------------------------------------------------------*/
- /* 私有宏定义 ----------------------------------------------------------------*/
- /* R(8bit) G(8bit) B(8bit) --> RGB565 */
- #define RGB24TORGB16(R,G,B) ((R>>3)<<11)|((G>>2)<<5)|(B>>3)
- /* 如果不需要打印bmp相关的提示信息,将printf注释掉即可
- * 如要用printf(),需将串口驱动文件包含进来
- */
- #define BMP_DEBUG_PRINTF(FORMAT,...) //printf(FORMAT,##__VA_ARGS__)
- /* 私有变量 ------------------------------------------------------------------*/
- uint8_t pColorData[960]; /* 一行真彩色数据缓存 320 * 3 = 960 */
- FIL file;
- extern FRESULT f_res;
- UINT f_num;
- /* 扩展变量 ------------------------------------------------------------------*/
- /* 私有函数原形 --------------------------------------------------------------*/
- /* 函数体 --------------------------------------------------------------------*/
- /**
- * 函数功能: 打印BMP文件的头信息,用于调试
- * 输入参数: pBmpHead:BMP文件的头信息
- * 返 回 值: 无
- * 说 明:无
- */
- static void showBmpHeader(BMP_FileHeader *pBmpHead)
- {
- BMP_DEBUG_PRINTF("位图文件头:\n");
- BMP_DEBUG_PRINTF("文件类型:%d\n",(*pBmpHead).bfType);
- BMP_DEBUG_PRINTF("文件大小:%d\n",(*pBmpHead).bfSize);
- BMP_DEBUG_PRINTF("保留字:%d\n",(*pBmpHead).bfReserved1);
- BMP_DEBUG_PRINTF("保留字:%d\n",(*pBmpHead).bfReserved2);
- BMP_DEBUG_PRINTF("实际位图数据的偏移字节数:%d\n",(*pBmpHead).bfOffBits);
- BMP_DEBUG_PRINTF("\n");
- }
- /**
- * 函数功能: 打印BMP文件的头信息,用于调试
- * 输入参数: pBmpHead:BMP文件的头信息
- * 返 回 值: 无
- * 说 明:无
- */
- static void showBmpInforHeader(BMP_InfoHeader *pBmpInforHead)
- {
- BMP_DEBUG_PRINTF("位图信息头:\n");
- BMP_DEBUG_PRINTF("结构体的长度:%d\n",(*pBmpInforHead).biSize);
- BMP_DEBUG_PRINTF("位图宽:%d\n",(*pBmpInforHead).biWidth);
- BMP_DEBUG_PRINTF("位图高:%d\n",(*pBmpInforHead).biHeight);
- BMP_DEBUG_PRINTF("biPlanes平面数:%d\n",(*pBmpInforHead).biPlanes);
- BMP_DEBUG_PRINTF("biBitCount采用颜色位数:%d\n",(*pBmpInforHead).biBitCount);
- BMP_DEBUG_PRINTF("压缩方式:%d\n",(*pBmpInforHead).biCompression);
- BMP_DEBUG_PRINTF("biSizeImage实际位图数据占用的字节数:%d\n",(*pBmpInforHead).biSizeImage);
- BMP_DEBUG_PRINTF("X方向分辨率:%d\n",(*pBmpInforHead).biXPelsPerMeter);
- BMP_DEBUG_PRINTF("Y方向分辨率:%d\n",(*pBmpInforHead).biYPelsPerMeter);
- BMP_DEBUG_PRINTF("使用的颜色数:%d\n",(*pBmpInforHead).biClrUsed);
- BMP_DEBUG_PRINTF("重要颜色数:%d\n",(*pBmpInforHead).biClrImportant);
- BMP_DEBUG_PRINTF("\n");
- }
- /**
- * 函数功能: 显示bmp图片, 24位真彩色
- * 输入参数: x:显示图片左上角x轴坐标
- * y:显示图片左上角y轴坐标
- * pic_name:显示图片文件名称
- * 返 回 值: 无
- * 说 明:图片宽度和高度根据图片大小而定
- */
- void Lcd_show_bmp(uint16_t x, uint16_t y,char *pic_name)
- {
- uint16_t i, j, k;
- int width, height, l_width;
-
- BMP_FileHeader FileHeader;
- BMP_InfoHeader InfoHeader;
-
- /*-------------------------------------------------------------------------------------------------------*/
- f_res=f_open(&file,pic_name, FA_OPEN_EXISTING|FA_READ);
- if(f_res == FR_OK)
- {
- BMP_DEBUG_PRINTF("Open file success\r\n");
- /* 读取文件头信息 两个字节*/
- f_res=f_read(&file,&FileHeader,sizeof(BMP_FileHeader),&f_num);
-
- /* 判断是不是bmp文件 "BM"*/
- if(FileHeader.bfType!=0x4d42)
- {
- BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
- return;
- }
- else
- {
- BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");
- }
- /* 读取BMP文件头信息*/
- showBmpHeader(&FileHeader);
-
- /* 读取位图信息头信息 */
- f_res=f_read(&file,&InfoHeader,sizeof(BMP_InfoHeader),&f_num);
- showBmpInforHeader(&InfoHeader);
- }
- else
- {
- BMP_DEBUG_PRINTF("file open fail!\r\n");
- return;
- }
- /*-------------------------------------------------------------------------------------------------------*/
- width = InfoHeader.biWidth;
- height = InfoHeader.biHeight;
-
- /* 计算位图的实际宽度并确保它为32的倍数 */
- l_width = WIDTHBYTES(width* InfoHeader.biBitCount);
-
- if((l_width>960)||(InfoHeader.biBitCount!=24))
- {
- BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (X<=320 and bit!=16)\n");
- return;
- }
- f_lseek(&file,FileHeader.bfOffBits);
-
- if(InfoHeader.biBitCount == 24)
- {
- for(i=0;i<height;++i)
- {
- /* 开一个图片大小的窗口*/
- LCD_OpenWindow(x, y+height-i-1, width, 1);
- LCD_WRITE_CMD(0x2C);
- /* 读取一行bmp的数据到数组pColorData里面 */
- f_read(&file,pColorData,l_width,&f_num);
- for(j=0;j<width;j++) //一行有效信息
- {
- k = j*3; //一行中第K个像素的起点
- LCD_WRITE_DATA(RGB24TORGB16(pColorData[k+2],pColorData[k+1],pColorData[k])); //写入LCD-GRAM
- }
- }
- }
- f_close(&file);
- }
- uint8_t Screen_shot(uint16_t x,uint16_t y,uint16_t Width,uint16_t Height, const char * filename)
- {
- /* bmp 文件头 54个字节 */
- uint8_t header[54] =
- {
- 0x42, 0x4d, 0, 0, 0, 0,
- 0, 0, 0, 0, 54, 0,
- 0, 0, 40,0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 24, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0
- };
-
- uint16_t i;
- uint16_t j;
- uint32_t file_size;
- uint16_t width;
- uint16_t height;
- uint8_t r,g,b;
- uint16_t read_data;
- uint8_t kk[4]={0,0,0,0};
-
- uint8_t ucAlign=Width%4;
-
- /* 宽*高 +补充的字节 + 头部信息 */
- file_size = Width * Height * 3 + Height*(Width%4) + 54;
- /* 文件大小 4个字节 */
- header[2] = file_size&0x000000ff;
- header[3] = (file_size >> 8) & 0x000000ff;
- header[4] = (file_size >> 16) & 0x000000ff;
- header[5] = (file_size >> 24) & 0x000000ff;
-
- /* 位图宽 4个字节 */
- width=Width;
- header[18] = width & 0x000000ff;
- header[19] = (width >> 8) &0x000000ff;
- header[20] = (width >> 16) &0x000000ff;
- header[21] = (width >> 24) &0x000000ff;
-
- /* 位图高 4个字节 */
- height = Height;
- header[22] = height &0x000000ff;
- header[23] = (height >> 8) &0x000000ff;
- header[24] = (height >> 16) &0x000000ff;
- header[25] = (height >> 24) &0x000000ff;
-
- /* 新建一个文件 */
- f_res = f_open(&file,filename,FA_CREATE_ALWAYS|FA_WRITE);
- if(f_res==FR_OK)
- {
- /* 将预先定义好的bmp头部信息写进文件里面 */
- f_res = f_write(&file, header,54, &f_num);
- for(i=0; i<Height; i++)
- {
- if(!(Width % 4))
- {
- for(j=Width;j>0;j--)
- {
- read_data=LCD_GetPointPixel(y+j-1, x+i);
-
- r = GETR_FROM_RGB16(read_data);
- g = GETG_FROM_RGB16(read_data);
- b = GETB_FROM_RGB16(read_data);
- f_res = f_write(&file, &b,1, &f_num);
- f_res = f_write(&file, &g,1, &f_num);
- f_res = f_write(&file, &r,1, &f_num);
- }
- }
- else
- {
- for(j=Width;j>0;j--)
- {
- read_data = LCD_GetPointPixel(y+j-1, x+i);
-
- r = GETR_FROM_RGB16(read_data);
- g = GETG_FROM_RGB16(read_data);
- b = GETB_FROM_RGB16(read_data);
- f_res = f_write(&file, &b,1, &f_num);
- f_res = f_write(&file, &g,1, &f_num);
- f_res = f_write(&file, &r,1, &f_num);
- }
- if( ucAlign ) /* 如果不是4字节对齐 */
- f_res = f_write ( & file, kk, ucAlign, & f_num );
- }
- }/* 截屏完毕 */
- f_close(&file);
- return 1;
- }
- else if(f_res==FR_EXIST) //如果文件已经存在
- return FR_EXIST; //8
- else/* 截屏失败 */
- return 0;
- }
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
截图默认是bmp格式的,论坛不能上传bmp格式,只好转成JPG,效果差了很多
|