嵌入式 在开发板显示bmp图片、jpeg图片

2023-11-19

嵌入式 在开发板显示bmp图片、jpeg图片

一、简述

        记--在GEC6818开发板(800W*480H)显示24位的bmp图片、使用开源的jpeg库显示jpeg图片。

        代码:链接: https://pan.baidu.com/s/1G3jzvdncocDMRbwCvsmSlg 密码: gz6m

二、效果

        执行开始显示bmp图片,回车后显示jpg图片。

三、工程结构

        

        

四、源代码

        display_bmp.c文件

        

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include "lcd.h"
#include "freetype.h"
#include "to_wchar.h"
#include "display_bmp.h"

/*display_bmp:显示bmp图片
 *pathname:图片的路径名
 *lcd_ptr:指向LCD映射首地址
 *x_s,y_s:左上角起始点
 */
int display_bmp(const char *pathname, unsigned int *lcd_ptr,unsigned int x_s, unsigned int y_s)
{
	unsigned int bmp_width,bmp_height;
	unsigned int x, y, color;
	unsigned char *pic_buf_ptr, *ptr_save;
	
	if( get_bmp_width_and_height( pathname, &bmp_width, &bmp_height) != 0 )//获取图片的宽高
	{
		fprintf(stderr, "get bmp width and height failed!\n");
		return -1;
	}

	if( get_pic_data_to_buffer(pathname, &pic_buf_ptr) == -1 )//获取图片的像素数据
	{
	    fprintf(stderr, "get picture data error\n");
		return -1;
	}
	ptr_save = pic_buf_ptr;
	
	for(y=y_s; y<y_s+bmp_height && y< LCD_HEIGHT; y++)
	{  
		for(x=x_s; x< x_s+bmp_width ; x++)
		{  
			if(x>=0 && x< LCD_WIDTH)
			{	    
				//将RGB的3个字节颜色数据装到4字节  RGB:红绿蓝
				color = (*(pic_buf_ptr+2)<<16) | (*(pic_buf_ptr+1)<<8) | (*pic_buf_ptr);
				lcd_draw_point(x, LCD_HEIGHT-y-1, color, lcd_ptr);//LCD_HEIGHT-y-1:镜像翻转
			}
			pic_buf_ptr += 3;//三个字节一个颜色像素点
		}
		
	}   

	//显示图片路径名	
	wchar_t *w_pathname = NULL;
	if( mchars_to_wchars(pathname, &w_pathname) == 0)//将多字节转换为宽字符(汉字未能转换成功)
	{
		//显示字体
		Lcd_Show_FreeType(w_pathname,32,0x00,x_s+10,y_s+50, lcd_ptr);
		free(w_pathname);
	}
	
	free( ptr_save );
	return 0;
}

/*get_pic_data_to_buffer:获取图片的像素数据
 *pathname:图片的路径名
 *pic_buf_ptr:用来指向 存放图片的像素数据缓冲区
 */
int get_pic_data_to_buffer(const char *pathname, unsigned char **pic_buf_ptr)
{
    FILE *pic_fp;
	off_t file_size;
	struct stat file_info;
        
	pic_fp = fopen(pathname, "r");
	if(pic_fp == NULL)
	{
		perror("open %s error\n");
		return -1;
	}

	if( stat(pathname, &file_info) == -1)
	{
		perror("get file info error\n");
		return -1;
	}
	
	file_size = file_info.st_size;//获取图片大小
	*pic_buf_ptr = (unsigned char *)malloc(file_size-54);

	fseek(pic_fp, 54,SEEK_SET);//跳过文件头(存在内存对齐,可能是56字节)
	
	fread(*pic_buf_ptr, file_size-54, 1, pic_fp);//读取图片颜色数据
	if(ferror(pic_fp))
	{
			perror("read picture data error\n");
			return -1; 
	}

	return fclose(pic_fp);
    
}

/*get_bmp_width_and_height:获取bmp图片的宽高信息
 *pathname:图片路径名
 *width:图片的宽度
 *height:图片的高度
 */
int get_bmp_width_and_height(const char *pathname, unsigned int *width, unsigned int *height)
{
	FILE *pic_fp;
	unsigned char file_head[54];

	pic_fp = fopen(pathname, "r");
	if(pic_fp == NULL)
	{
		perror("open %s error\n");
		return -1;
	}

	fread( file_head, 54, 1, pic_fp);
	if( ferror( pic_fp ) )
	{
		perror("read picture head error\n");
		return -1;
	}
	fclose(pic_fp);
	
	*width = *((int*)&file_head[18]);//宽:18~21共4个字节
	*height = file_head[22] | file_head[23]<<8;//高:22~23共两个字节

	return 0;
}


        display_jpeg.c文件

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <jpeglib.h>
#include <jerror.h>

#include "lcd.h"
#include "to_wchar.h"

extern JSAMPLE * image_buffer;	/* Points to large array of R,G,B-order data */
extern int image_height;	/* Number of rows in image */
extern int image_width;

struct my_error_mgr 
{
	struct jpeg_error_mgr pub;	/* "public" fields */
	jmp_buf setjmp_buffer;	/* for return to caller */
};

typedef struct my_error_mgr * my_error_ptr;

METHODDEF(void)
my_error_exit (j_common_ptr cinfo)
{
	my_error_ptr myerr = (my_error_ptr) cinfo->err;
	(*cinfo->err->output_message) (cinfo);

	longjmp(myerr->setjmp_buffer, 1);
}

/*display_jpeg:显示jpeg图片
 *filename:图片的路径名
 *lcd_ptr:指向LCD映射首地址
 *x_s,y_s:左上角起始点
 */
int display_jpeg (char * filename, unsigned int *lcd_ptr,unsigned int x_s, unsigned int y_s)
{

	struct my_error_mgr jerr;
	struct jpeg_decompress_struct cinfo;
	int row_stride;		/* physical row width in output buffer */
	FILE * infile;		/* source file */

	if((infile = fopen(filename, "rb")) == NULL) 
	{
		fprintf(stderr, "can't open %s\n", filename);
		return -1;
	}

	cinfo.err = jpeg_std_error(&jerr.pub);
	jerr.pub.error_exit = my_error_exit;
  
	if(setjmp(jerr.setjmp_buffer)) 
	{    
		jpeg_destroy_decompress(&cinfo);
		fclose(infile);
		return -1;
	}

	jpeg_create_decompress(&cinfo);

	jpeg_stdio_src(&cinfo, infile);
	
	jpeg_read_header(&cinfo, TRUE);
    
	jpeg_start_decompress(&cinfo);
  
	row_stride = cinfo.output_width * cinfo.output_components;

	char *buffer;  
	buffer = (char*)(*cinfo.mem->alloc_sarray)
		((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);

	unsigned int x, y;
	unsigned int color;
	char * ptr_save = buffer; 

	y = y_s;
	while(cinfo.output_scanline < cinfo.output_height && y < cinfo.output_height) 
	{    
		buffer = ptr_save;
		jpeg_read_scanlines(&cinfo, (JSAMPARRAY)&buffer, 1);
		
		for(x=x_s; x< x_s+cinfo.output_width && x<LCD_WIDTH; x++)
		{
			color = buffer[2] | buffer[1]<<8 | buffer[0]<<16;
			lcd_draw_point(x, y, color, lcd_ptr);

			buffer += 3;
		}

		y++;
	}
	
	//显示图片路径
	wchar_t *w_pathname = NULL;
	if( mchars_to_wchars(filename, &w_pathname) == 0)
	{
		//显示图片路径
		Lcd_Show_FreeType(w_pathname,32,0x00,x_s+10,y_s+50, lcd_ptr);
		free(w_pathname);
	}


	jpeg_finish_decompress(&cinfo);
	jpeg_destroy_decompress(&cinfo);
	fclose(infile);
	return 0;
}

        freetype.c文件

#include <sys/mman.h>
#include <stdio.h>
#include <linux/fb.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <wchar.h>
#include <string.h>
#include <ft2build.h>
#include FT_FREETYPE_H

#include <lcd.h>


#define	SIM_TTY_PATH	"font/simsun.ttc"
/*	
	功能:根据得到的RGB24数据,进行图像任意位置显示
	(主要是迎合上面的各种转换函数的显示测试)
	x:显示的x轴起点
	y:显示的y轴起点
	w:显示图像宽度。
	h:显示图像高度。
	bit_dept:要显示的图像位深 24/32
	pbmp_data:要进行显示的RGB24_buf
*/
int Show_FreeType_Bitmap(FT_Bitmap*  bitmap,int start_x,int start_y,int color, unsigned int *lcd_buf_ptr)
{
	int  buff_x, buff_y;	//遍历bitmap时使用
	int  x,y;	//循环遍历使用
	int  end_x = start_x + bitmap->width;	//图像宽度
	int  end_y = start_y + bitmap->rows;	//图像高度

	for ( x = start_x, buff_x = 0; x < end_x; buff_x++, x++ )	//y表示起点y,x表示起点x
	{
		for ( y = start_y, buff_y = 0; y < end_y; buff_y++, y++ )	//y表示起点y,x表示起点x
		{
			//LCD边界处理
			if ( x < 0 || y < 0 || x >=800   || y >= 480 )
				continue;

			if(bitmap->buffer[buff_y * bitmap->width + buff_x] )	//判断该位上是不是为1,1则表明需要描点
				lcd_draw_point(start_x+buff_x , start_y+buff_y ,  color, lcd_buf_ptr);		//在当前x位置加上p的偏移量(p表示buff中列的移动)
				//在当前y位置加上q的偏移量(q表示buff中行的移动)
			
		}
	}
} 

void Lcd_Show_FreeType(wchar_t *wtext, int size, int color, int start_x, int start_y, unsigned int *lcd_buf_ptr)
{

	//1.定义库所需要的变量
	FT_Library    library;
	FT_Face       face;
	FT_GlyphSlot  slot;	//用于指向face中的glyph
	FT_Vector     pen;                    
	FT_Error      error;

	int n;

	
	//2.初始化库
	error = FT_Init_FreeType( &library );            

	//3.打开一个字体文件,并加载face对象:
	error = FT_New_Face( library, SIM_TTY_PATH, 0, &face ); 
	slot = face->glyph;
	
	//4.设置字体大小
	error = FT_Set_Pixel_Sizes(face, size, 0); 
	
	//x起点位置:start_x。需要*64
	pen.x = start_x * 64;	
	//y起点位置:LCD高度 - start_y。需要*64
	pen.y = ( 480 - start_y ) * 64;
	
	//每次取出显示字符串中的一个字
	for ( n = 0; n < wcslen( wtext ); n++ )	
	{
		//5.设置显示位置和旋转角度,0为不旋转,pen为提前设置好的坐标
		FT_Set_Transform( face, 0, &pen );
		
		
		//将字形槽的字形图像,转为位图,并存到 face->glyph->bitmap->buffer[],并且更新bitmap下的其他成员,
		//	face->glyph->bitmap.rows:图像总高度
		//	face->glyph->bitmap.width:图像总宽度
		//	face->glyph->bitmap.pitch:每一行的字节数
		//	face->glyph->bitmap.pixel_mode:像素模式(1单色 8反走样灰度)
		//	face->glyph->bitmap.buffer:点阵位图的数据缓冲区
	

		
		error = FT_Load_Char( face, wtext[n], FT_LOAD_RENDER );
			//FT_LOAD_RENDER表示转换RGB888的位图像素数据
			
		//出错判断	
		if ( error )
		  continue;                
		
		
		Show_FreeType_Bitmap(&slot->bitmap, slot->bitmap_left, 480 - slot->bitmap_top, color, lcd_buf_ptr);
		
		//增加笔位
		pen.x += slot->advance.x;
		
	}	
	
	FT_Done_Face(face);
	FT_Done_FreeType(library);
	
}






        lcd.c文件

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>

#include "lcd.h"

/*lcd_draw_point:在lcd上画一个点
 *x:x轴坐标   (左上角为原点,x轴分别向右,y轴下递增)
 *y:y轴坐标
 *color:点的颜色
 *lcd_ptr:LCD的操作指针
 */
void lcd_draw_point(unsigned int x, unsigned int y, unsigned int color, unsigned int *lcd_ptr)
{
	if( x>=0 && x<LCD_WIDTH && y>=0 && y<LCD_HEIGHT )
	{
		*(lcd_ptr+LCD_WIDTH*y+x) = color;
	}
}

/*lcd_draw_full_srceen_single_color:用一种颜色画满整个屏幕
 *color:点的颜色
 *lcd_ptr:LCD的操作指针
 */
void lcd_draw_full_srceen_single_color(unsigned int color, unsigned int *lcd_ptr)
{
	int x, y;
	for(y=0;y<LCD_HEIGHT;++y)
	{
		for(x=0;x<LCD_WIDTH;++x)
		{
			lcd_draw_point(x, y, color, lcd_ptr);
		}
	}
}

/*open_lcd_device:打开LCD
 *lcd_ptr:LCD的内存映射首地址
 *返回值:lcd_fd:LCD的描述符
 */
int open_lcd_device(unsigned int **lcd_ptr)
{

	int lcd_fd;
	lcd_fd = open("/dev/fb0", O_RDWR);//打开LCD设备
	if(lcd_fd == -1)
	{
		perror("open lcd device failed\n");
		return -1;
	}

	//内存映射
	*lcd_ptr = mmap( NULL, LCD_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
	if(lcd_ptr == MAP_FAILED)
	{
		perror("map lcd_fb error\n");
		return -1;
	}

	return lcd_fd;
}

/*close_lcd_device:关闭LCD
 *lcd_fd:LCD的描述符
 *lcd_ptr:LCD的内存映射首地址
 */
int close_lcd_device(int lcd_fd, unsigned int *lcd_ptr)
{
	munmap(lcd_ptr, LCD_SIZE);
	return close(lcd_fd);
}

        main.c文件

#include <stdio.h>
#include <stdlib.h>

#include "lcd.h"
#include "freetype.h"
#include "display_bmp.h"
#include "display_jpeg.h"

int main(int argc, char *argv[])
{
	int lcd_fd;
	int dis_ret;
	unsigned int *lcd_ptr;

	//打开LCD
	lcd_fd = open_lcd_device(&lcd_ptr);
	if(lcd_fd == -1)
	{
		return -1;
	}

	//显示bmp图片
	dis_ret = display_bmp("pic/test.bmp", lcd_ptr, 0, 0);
	if(dis_ret != 0)
	{
		printf("display bmp error\n");
	}

	printf("please enter any key continue!\n");
	getchar();

	//显示jpeg图片
	dis_ret = display_jpeg("pic/bird.jpg", lcd_ptr, 0, 0);
	if(dis_ret != 0)
	{
		printf("display jpeg error\n");
        }
	//关闭LCD
	close_lcd_device(lcd_fd, lcd_ptr);

	return 0;
}

       to_wchar.c文件

#include <wctype.h>
#include <locale.h>
#include <wchar.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*mchars_to_wchars:多字节转宽字符
 *mbs_char:多字节字符串
 *w_char:宽字符
 */
int mchars_to_wchars(const char *mbs_char, wchar_t **w_char)
{
	int mbslen = mbstowcs(NULL, mbs_char, 0);
	if (mbslen == (size_t) -1) 
	{
		perror("mbstowcs");
		return -1;
    }
    *w_char = NULL;
/*	if (setlocale(LC_CTYPE, "zh_CN.utf8") == NULL) 
	{
               perror("setlocale");
	       return -1;
        }
*/
	*w_char = calloc(mbslen + 1, sizeof(wchar_t));
	if(*w_char == NULL )
	{
		perror("calloc\n");
		return -1;
	}
	if (mbstowcs(*w_char, mbs_char, mbslen + 1) == (size_t) -1)
	{
		perror("mbstowcs");
		free(*w_char);
		return -1;
	}
	//printf("Wide character string is: %ls (%zu characters)\n", *w_char, mbslen);
	return 0;
}

Makefile文件

make:
	arm-linux-gcc src/*.c -o lcd -I include -I include/freetype2 -L lib -ljpeg -lfreetype

五、待添加功能

       1、图片根据显示屏的大小自适应(缩放操作:"偷工减料"; 复制周边)

       2、百叶窗式显示图片

       3、从左到右滚动

       4、扇形显示图片

=================================以下 回复 qq_37261494 ==================

百叶窗式显示图片测试

主要思路:将图片数据分为几个部分显示,每个部分交由子线程同时显示/隐藏。

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#define LCD_HEIGHT        480
#define LCD_WIDTH        800
#define LCD_SIZE        ((LCD_WIDTH)*(LCD_HEIGHT)*4)
#define ON 1
#define OFF 0
#define BLIND 5

int open_lcd_device(unsigned int **lcd_ptr);
void lcd_draw_point(unsigned int x, unsigned int y, unsigned int color, unsigned int *lcd_ptr);
int get_pic_data_to_buffer(const char *pathname, unsigned char **pic_buffer);
void blind_window(int lcd, unsigned char *image, int flag);

//打包数据给子线程使用
struct argument
{
	unsigned int *lcd_ptr;//LCD显示屏的显示内存空间指针
	unsigned char *pic_buf_ptr;;//图片数据
	int offset;//每叶的像素数据的偏移量(距离全部数据的起始位置)起始就是用来记录每叶的起始行
	int flag;//用来控制类似开窗关窗
};

int main(int argc, char *argv[])
{
	int lcd_fd;
	int ret;
	unsigned int *lcd_ptr;
	if(argc !=2)
	{
		printf("argc !=2\n");
		return -1;
	}
	
	//打开LCD
	lcd_fd = open_lcd_device(&lcd_ptr);
	if(lcd_fd == -1)
	{
		return -1;
	}
	
	//获取图片的像素数据
	unsigned char *pic_ptr;
	ret = get_pic_data_to_buffer(argv[1], &pic_ptr);
	if(ret == -1)
	{
		printf("get_pic_data_to_buffer erro\n");
	}   
	
	//百叶窗显示
	blind_window(lcd_fd, pic_ptr, ON);//关窗
	blind_window(lcd_fd, pic_ptr, OFF);//开窗
	
	munmap(lcd_ptr, LCD_SIZE);//接触映射
	close(lcd_fd);//关闭LCD设备
	return 0;
}

void *routine(void *_arg)//子线程执行的动作---显示1叶图片数据
{
	struct argument *arg = (struct argument *)_arg;

	unsigned int color;
	int x,y;

	if(arg->flag == ON)
	{
		arg->pic_buf_ptr += (4*(LCD_HEIGHT/BLIND)-arg->offset) * LCD_WIDTH * 3;
		for(y=arg->offset+LCD_HEIGHT/BLIND-1; y>=arg->offset; y--)//显示每叶数据-从下往上,有HEIGHT/BLIN行
		{
			for(x=0; x<LCD_WIDTH; x++)
			{
				color = (arg->pic_buf_ptr[2]<<16) | (arg->pic_buf_ptr[1]<<8) | arg->pic_buf_ptr[0];
				lcd_draw_point(x, y, color, arg->lcd_ptr);
				arg->pic_buf_ptr += 3;
			}
			
			usleep(10000);
		}
	}
	else if(arg->flag == OFF)//清除每叶数据-从上往下,有HEIGHT/BLIN行
	{
		for(y=arg->offset; y<arg->offset+LCD_HEIGHT/BLIND; y++)
		{
			for(x=0; x<LCD_WIDTH; x++)
			{
				lcd_draw_point(x, y, 0, arg->lcd_ptr);
			}
			usleep(10000);
		}
	}
	
	sleep(1);
	pthread_exit(NULL);
}

//百叶窗式显示图片
void blind_window(int lcd_fd, unsigned char *image, int flag)
{
	unsigned int *p = mmap( NULL, LCD_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);//内存映射,将LCD显示屏显示空间映射为内存空间,方便操作,这样给内存赋值为像素数据就是显示图片了
	int i;
	pthread_t tid[BLIND];
	for(i=0; i<BLIND; i++)//每1叶交由一条子线程显示
	{
		struct argument *arg = malloc(sizeof(struct argument));
		arg->lcd_ptr = p;
		arg->pic_buf_ptr = image;
		arg->offset = i*(LCD_HEIGHT/BLIND);//设置偏移量
		arg->flag = flag;
		//printf("offset=%d\n", arg->offset);
		pthread_create(&tid[i], NULL, routine, (void *)arg);//创建线程
	}

	for(i=0; i<BLIND; i++)
	{
		pthread_join(tid[i], NULL);//等待子线程结束
	}
}


/*lcd_draw_point:在lcd上画一个点
 *x:x轴坐标   (左上角为原点,x轴分别向右,y轴下递增)
 *y:y轴坐标
 *color:点的颜色
 *lcd_ptr:LCD的操作指针
 */
void lcd_draw_point(unsigned int x, unsigned int y, unsigned int color, unsigned int *lcd_ptr)
{
	if( x>=0 && x<LCD_WIDTH && y>=0 && y<LCD_HEIGHT )
	{
		*(lcd_ptr+LCD_WIDTH*y+x) = color;
	}
}

/*open_lcd_device:打开LCD
 *lcd_ptr:LCD的内存映射首地址
 *返回值:lcd_fd:LCD的描述符
 */
int open_lcd_device(unsigned int **lcd_ptr)
{

	int lcd_fd;
	lcd_fd = open("/dev/fb0", O_RDWR);//打开LCD设备
	if(lcd_fd == -1)
	{
		perror("open lcd device failed\n");
		return -1;
	}

	//内存映射
	*lcd_ptr = mmap( NULL, LCD_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
	if(lcd_ptr == MAP_FAILED)
	{
		perror("map lcd_fb error\n");
		return -1;
	}

	return lcd_fd;
}


/*get_pic_data_to_buffer:获取图片的像素数据
 *pathname:图片的路径名
 *pic_buf_ptr:用来指向 存放图片的像素数据缓冲区
 */
int get_pic_data_to_buffer(const char *pathname, unsigned char **pic_buf_ptr)
{
    FILE *pic_fp;
	off_t file_size;
	struct stat file_info;
        
	pic_fp = fopen(pathname, "r");
	if(pic_fp == NULL)
	{
		perror("open %s error\n");
		return -1;
	}

	if( stat(pathname, &file_info) == -1)
	{
		perror("get file info error\n");
		return -1;
	}
	
	file_size = file_info.st_size;//获取图片大小
	*pic_buf_ptr = (unsigned char *)malloc(file_size-54);

	fseek(pic_fp, 54,SEEK_SET);//跳过文件头(存在内存对齐,可能是56字节)
	
	fread(*pic_buf_ptr, file_size-54, 1, pic_fp);//读取图片颜色数据
	if(ferror(pic_fp))
	{
			perror("read picture data error\n");
			return -1; 
	}
	
	return fclose(pic_fp);
    
}

测试结果:

完整版:链接:https://pan.baidu.com/s/1cRO5tSMAnZdFeTii-qnYZA 提取码:9xfh

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式 在开发板显示bmp图片、jpeg图片 的相关文章

  • ANDROID

    1 环境构建 2 模拟测试 3 Activity 4android中的资源 5 UI 6 各种控件
  • coreutils-stty 初始设置和echo 16进制modBus数据至串口

    安装USB串口驱动 注 我所使用的USB serial芯片为pl2303 个人根据自己不同的芯片安装对应驱动 kmod usb serial pl2303 串口 dev ttyUSB0 配置 其中 F 指定端口 cs8表示8位 parenb
  • 手动更新(rpi-update)树莓派固件

    手动更新 rpi update 树莓派固件 1 下载固件 本地更新 先在 PC 上下载固件 也可以用如下方法下载 curl L https github com Hexxeh rpi firmware archive master tar
  • STM32与Python上位机通过USB虚拟串口通信

    文章目录 前言 1 查看原理图 2 新建工程 3 添加代码与烧录 4 python代码编写 总结 问题解决思路 前言 在详细阅读广大网友的教程之后 我对STM32和Python通过USB通信的流程烂熟于心 尝试用ST公司的NUCLEO L4
  • 嵌入式学习:stm32学习路线推荐之思维导图

    从9月1日开始学习STM32后 对于STM32的一些个人总结 1 对于STM32和51的区别 对于 STM32来说 基本的大概都和51单片的内容相似 但是由于STM的引脚和寄存器的数量较多 所以需要一个更加完善的管理机制 导致了 时钟 的产
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • Qt creator4.8.0 以上使用SqLite数据库进行数据操作

    文章目录 前言 一 在 pro工程文件中添加sql模块 二 使用步骤 1 添加头文件 2 链接并打开数据库 3 创建用户信息表management info 4 插入数据操作 5 修改数据库操作 6 查询数据库 总结 前言 Qt creat
  • iOS逆向工程之App脱壳

    本篇博客以微信为例 给微信脱壳 砸壳 在iOS逆向工程中是经常做的一件事情 因为从AppStore直接下载安装的App是加壳的 其实就是经过加密的 这个 砸壳 的过程就是一个解密的过程 未砸壳的App是无法在Class dump Hoppe
  • 新唐NUC980使用记录(5.10.y内核):u-boot & linux & rootfs 编译与烧录测试(基于SD1位置SD卡)

    文章目录 目的 基础准备 烧录环境 开发编译环境 SD卡分区 制作和设置编译工具链 制作toolchain和rootfs 拷贝rootfs内容到SD卡 设置编译工具链 u boot编译与测试 下载 配置与编译 烧录u boot与环境变量 l
  • 粤嵌GEC6818开发板-入门感慨篇(续一)

    触摸屏的事件 include
  • STM32F4之ADC1【库函数操作】

    折腾了两天ADC多通道采样 采样的结果都很乱 完全不是预期值 在amobbs求助也没有找到结果 于是决定从简单开始 一步步折腾着破ADC ADC试验1实验说明 1 这个实验仅仅是初始化一个ADC 对其输入进行采样 2 使用STM32F4的A
  • 嵌入式 在开发板显示bmp图片、jpeg图片

    嵌入式 在开发板显示bmp图片 jpeg图片 一 简述 记 在GEC6818开发板 800W 480H 显示24位的bmp图片 使用开源的jpeg库显示jpeg图片 代码 链接 https pan baidu com s 1G3jzvdnc
  • keil mdk代码提示与代码补全设置

    主要参考https blog csdn net w5862338 article details 50520423 结合自己的实际问题 一旦习惯了一些实用的功能 当进入到类似的环境中而没有熟悉的功能 会觉得很不方便 代码提示与补全就是这样实
  • HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏 在STM32开发板上的实战应用及其详解 一 HMI智能串口屏使用步骤 二 附录 一 HMI智能串口屏使用步骤 安装USART HMI软件 一般买的串口屏里面 商家送的资料里面都有改该软件 打开软件 并点击左上角的 新建 选
  • 毕业设计 STM32人体红外测温枪温度采集系统 - 单片机

    文章目录 1 前言 2 主要器件 3 实现效果 4 设计原理 MLX90614 红外温度传感器 5 部分实现代码 6 最后 1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求
  • C#写的34401A串口232数据读取程序

    首先呢 请先设置惠普表为Talk only模式 也就是31 还不明白的自己查手册去 另外 各个表设置不一样 比如我这里2块表就不一样 一块是7位数据位 even校验 另一块是8位数据位 none校验 具体的可以看看表里的i o那里的设置 数
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • FreeRTOS中断管理

    目录 说明 一 中断基础 1 1 中断理解 1 2 中断执行步骤 1 3 中断寄存器选择位 1 4 中断优先级分类 二 中断优先级分组设置 2 1 分类 2 2 特点 三 中断有关寄存器 3 1 SHPR1寄存器 3 2 SHPR2寄存器
  • Linux值得学习吗?打工人利用业务时间学习Linux需要多长时间?

    nbsp Linux值得学习吗 打工人利用业务时间学习Linux需要多长时间 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Linux的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评

随机推荐

  • java.lang.Long cannot be cast to java.lang.Integer解决办法

    Integer属于不可更改类型 而且Long和Integer没有任何继承关系 当然不能这样转换 例如 public Integer getUsersCount String hql select count from Users List
  • vscode实现文件单步调试保姆级教程

    第一步 第二步 第三步 第四步 第五步 第六步 第七步 第八步 第九步 第十步 点击终端 gt 配置任务 第十一步 第十二步 第十三步 第十四步 设置完毕 可以在源程序打断点按F5执行了
  • Spring中Quartz的详细配置

    关于cron表达式 来自网络 Cron 表达式包括以下 7 个字段 秒 分 小时 月内日期 月 周内日期 年 可选字段 特殊字符 Cron 触发器利用一系列特殊字符 如下所示 反斜线 字符表示增量值 例如 在秒字段中 5 15 代表从第 5
  • 常见状态码

    SWITCH PROTOCOL 101 Switching Protocols OK 200 OK CREATED 201 Created ACCEPTED 202 Accepted NO CONTENT 204 No Content PA
  • 雷军 1994 年写的代码,经典老古董~

    整合整理 程序员的那些事 id iProgrammer 雷军的代码像诗一样优雅 有些网友在评论中质疑 说雷军代码不会是 屎 一样优雅吧 说这话的网友 也许是开玩笑的 也许是真没看过雷军写过的代码 在 2011 年的时候 我们在微博转过雷军在
  • 《计算机网络》——第四章知识点

    1 终点不可达 当路由器或主机不能交付数据报时就向源点发送终点不可达报文 无法交付 源点抑制 当路由器或主机由于拥塞而丢弃数据报时 就向源点发送源点抑制报文 使源点知道应当把数据报的发送速率放慢 拥塞丢数据 3 时间超过 当路由器收到生存时
  • [UE5蓝图基础一]13.类似”人类一败涂地”掉落一定距离会回到空中 最终着落点还是设定地形上

    利用合体触发器Box Conllision 目标点 在放置actor里 实现 修改盒体范围为2W 当人物与盒子重叠就瞬移到空中
  • 苹果美区app内购方法及经验

    苹果美区app内购方法及经验 方法一 礼品卡 失败 淘宝or亚马逊购买苹果礼品卡 经测试账号充值成功 也可以购买付费app 但内购会经典限购 等了n周依然没有解除 如果养号成功大概就没什么问题 但苯人等不及了 方法二 美区转国区 实在太想氪
  • 编译安装mysql5.7.10

    1 gt cmake MySQL使用cmake跨平台工具预编译源码 用于设置mysql的编译参数 如 安装目录 数据存放目录 字符编码 排序规则等 安装最新版本即可 2 gt make3 75 mysql源代码是由C和C 语言编写 在Lin
  • 算法 {掃描線}

    算法 掃描線 掃描線 定義 題目 二維空間上 給定若干個 凸多邊形 求他們的並集的面積 思路 用若干個x 與Y軸平行的線 將目標區域T劃分成若干個子區域Ai 即S A1 A2 然後單獨求每個Ai 性質 與積分有點類似 都是求一個區域的面積
  • SQLite、MySQL和PostgreSQL 三种关系数据库哪个好?

    https www ssdax com 2188 html
  • 优化MyBatisPlus的autoResultMap生成策略

    前言 使用MyBatis Plus的字段类型处理器 只需一个注解 就可以很方便的将数组 对象等数据直接映射到实体类中 Data Accessors chain true TableName autoResultMap true public
  • Android 12读写存储卡权限申请

  • mysql报错:Host is not allowed to connect to this MySQL server(设置远程连接)

    一般出现在 localhost可以连接mysql 但是远程不行 输入shell命令 mysql u root p 然后输入密码进入mysql mysql命令行输入 use mysql update user set host where u
  • Linux-centos

    目录 一 Linux入门概述 1 1概述 1 2 下载地址 1 3 Linux特点 1 4 Linux和Windows区别 二 Linux目录结构 2 1 概览 2 2 树状目录结构 三 VI VIM编辑器 3 1 概述 3 2 测试数据准
  • 链队列的基本操作

    define CRT SECURE NO WARNINGS 链栈 include
  • Scala语言入门

    Scala入门 一 Scala安装 二 类和对象 1 Scala基本数据类型 2 Scala定义类 3 Scala单例对象 4 伴生对象 5 控制抽象 三 简单语法 1 if else 2 循环 3 方法 4 字符串 5 数组 6 集合 四
  • 你这样写代码会被打!

    编译 Python 开发者 伯乐在线 http python jobbole com 89252 所有人 好吧 不是所有人 都知道 python 是一门用途广泛 易读 而且容易入门的编程语言 但同时 python 语法也允许我们做一些很奇怪
  • 实现物联网,你有使用合适的数据库吗?

    数据正不断影响关键业务的决策 这使得企业开始重新考虑 他们能从物联网中得到什么 如果你觉得物联网世界的不断增长只是一时的狂热 那你就错了 一份关于M2M技术的研究报告表明 到2020年 通过传感器控制 监控以及自动化管理的设备将达到125亿
  • 嵌入式 在开发板显示bmp图片、jpeg图片

    嵌入式 在开发板显示bmp图片 jpeg图片 一 简述 记 在GEC6818开发板 800W 480H 显示24位的bmp图片 使用开源的jpeg库显示jpeg图片 代码 链接 https pan baidu com s 1G3jzvdnc