STM32摄像头实验

58 篇文章 10 订阅
订阅专栏

探索者 STM32F4 开发板的摄像头接口与 ALIENTEK OV2640 摄像头模块 的连接。在开发板的左下角的 2*9 的 P8 排座,是摄像头模块/OLED 模块共用接口,

特别注意:DCMI 摄像头接口和 I2S 接口、DAC、SDIO 以及 1WIRE_DQ 等有冲突,使用的时候,必须分时复用才可以,不可同时使用。

代码讲解

HARDWARE 文件夹下新建了 OV2640、DCMI 和 USART2 三个文件夹。在 OV2640 文件夹下新建了 ov2640.c、sccb.c、ov2640.h、sccb.h、ov2640cfg.h 等 5 个文件,并同时在工程中将这个文件夹加入头文件包含路径。在 DCMI 文件夹新建了 dcmi.c 和 dcmi.h 两个文件,也将这个文件夹加入头文件包含路径。在 USART2 文件夹下新建了:usart2.c 和 usart2.h 两个文件,同时将这个文件夹加入头文件包含路径。 DCMI 接口相关的库函数分布在 stm32f4xx_dcmi.c 文件以及对应的头文件 stm32f4xx_dcmi.h 中。

ov2640.c 里面的 OV2640_Init 函数:

u8 OV2640_Init(void)
{ 
	u16 i=0;
	u16 reg;
	//设置IO     	   
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  //GPIOG9,15初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_15;//PG9,15推挽输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
 
 	OV2640_PWDN=0;	//POWER ON
	delay_ms(10);
	OV2640_RST=0;	//复位OV2640
	delay_ms(10);
	OV2640_RST=1;	//结束复位 
  SCCB_Init();        		//初始化SCCB 的IO口	 
	SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01);	//操作sensor寄存器
 	SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80);	//软复位OV2640
	delay_ms(50); 
	reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH);	//读取厂家ID 高八位
	reg<<=8;
	reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL);	//读取厂家ID 低八位
	if(reg!=OV2640_MID)
	{
		printf("MID:%d\r\n",reg);
		return 1;
	}
	reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH);	//读取厂家ID 高八位
	reg<<=8;
	reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL);	//读取厂家ID 低八位
	if(reg!=OV2640_PID)
	{
		printf("HID:%d\r\n",reg);
		//return 2;
	}   
 	//初始化 OV2640,采用SXGA分辨率(1600*1200)  
	for(i=0;i<sizeof(ov2640_sxga_init_reg_tbl)/2;i++)
	{
	   	SCCB_WR_Reg(ov2640_sxga_init_reg_tbl[i][0],ov2640_sxga_init_reg_tbl[i][1]);
 	} 
  	return 0x00; 	//ok
} 

此部分代码先初始化 OV2640 相关的 IO 口(包括 SCCB_Init),然后最主要的是完成 OV2640 的寄存器序列初始化。OV2640 的寄存器特多(百几十个),配置特麻烦,我们用厂家有提供参考配置序列,本章我们用到的配置序列,存放在 ov2640_uxga_init_reg_tbl 这个数组里面,该数组是一个 2 维数组,存储初始化序列寄存器及 其对应的值,该数组存放在 ov2640cfg.h 里面。

另外,在 ov2640.c 里面,还有几个函数比较重要:

OV2640_Window_Set 函数,该函数用于设置传感器输出窗口;

OV2640_ImageSize_Set 函数,用于设置图像尺寸;

OV2640_ImageWin_Set 函数,用于设置图像窗口大小;

OV2640_OutSize_Set 函数,用于设置图像输出大小;

ov2640cfg.h 里面 ov2640_uxga_init_reg_tbl 的内容:

里面总共有 5 个数组。每个数组条目的第一个字节为寄存器号(也就是寄存器地址),第二个字节为要设置 的值,比如{0xff, 0x01},就表示在 0Xff 地址,写入 0X01 这个值。 五个数组里面 ov2640_uxga_init_reg_tbl 和 ov2640_svga_init_reg_tbl,分别用于配置 OV2640 输出 UXGA 和 SVGA 分辨率的图像,我们只用了 ov2640_uxga_init_reg_tbl 这个数组,完成对 OV2640 的初始化(设置为 UXGA)。最后 OV2640 要输出数据是 RGB565 还是 JPEG,就得通过 其他数组设置,输出 RGB565 时,通过一个数组:ov2640_rgb565_reg_tbl 设置即可;输出 JPEG 时,则要通过 ov2640_yuv422_reg_tbl 和 ov2640_jpeg_reg_tbl 两个数组设置。

dcmi.c:

DCMI_IRQHandler 函数,用于处理帧中断,可以实现帧率统计(需要定时器支持) 和 JPEG 数据处理等。DCMI_DMA_Init 函数,则用于配置 DCMI 的 DMA 传输,其外设地址固 定为:DCMI->DR,而存储器地址可变(LCD 或者 SRAM)。DMA 被配置为循环模式,一旦开 启,DMA 将不停的循环传输数据。My_DCMI_Init 函数用于初始化 STM32F4 的 DCMI 接口。最后,DCMI_Start 和 DCMI_Stop 两个函数, 用于开启或停止 DCMI 接口。

main.c 文件:

这里定义了一个非常大的数组 jpeg_buf(124KB),用来存储 JPEG 数据,因为 1600*1200 大小的 jpeg 图片,有可能大于 120K,所以必须将这个数组尽量设置大一点。

//处理JPEG数据
//当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
void jpeg_data_process(void)
{
	if(ov2640_mode)//只有在JPEG格式下,才需要做处理.
	{
		if(jpeg_data_ok==0)	//jpeg数据还未采集完?
		{	
			DMA_Cmd(DMA2_Stream1, DISABLE);//停止当前传输 
			while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置  
			jpeg_data_len=jpeg_buf_size-DMA_GetCurrDataCounter(DMA2_Stream1);//得到此次数据传输的长度
				
			jpeg_data_ok=1; 				//标记JPEG数据采集完按成,等待其他函数处理
		}
		if(jpeg_data_ok==2)	//上一次的jpeg数据已经被处理了
		{
			DMA2_Stream1->NDTR=jpeg_buf_size;	
			DMA_SetCurrDataCounter(DMA2_Stream1,jpeg_buf_size);//传输长度为jpeg_buf_size*4字节
			DMA_Cmd(DMA2_Stream1, ENABLE);			//重新传输
			jpeg_data_ok=0;						//标记数据未采集
		}
	}
    else
    {
        LCD_SetCursor(0, 0);
        LCD_WriteRAM_Prepare();     //开始写入GRAM
        hsync_int = 1;
    }
} 

jpeg_data_process 函数用于处理 JPEG 数据的接收,在 DCMI_IRQHandler 函数里面被调用,通过一个 jpeg_data_ok 变量与 jpeg_test 函数共同控制 JPEG 的数据传送。

//JPEG测试
//JPEG数据,通过串口2发送给电脑.
void jpeg_test(void)
{
	u32 i; 
	u8 *p;
	u8 key;
	u8 effect=0,saturation=2,contrast=2;
	u8 size=3;		//默认是QVGA 320*240尺寸
	u8 msgbuf[15];	//消息缓存区 
	LCD_Clear(WHITE);
  POINT_COLOR=RED; 
	LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4");
	LCD_ShowString(30,70,200,16,16,"OV2640 JPEG Mode");
	LCD_ShowString(30,100,200,16,16,"KEY0:Contrast");			//对比度
	LCD_ShowString(30,120,200,16,16,"KEY1:Saturation"); 		//色彩饱和度
	LCD_ShowString(30,140,200,16,16,"KEY2:Effects"); 			//特效 
	LCD_ShowString(30,160,200,16,16,"KEY_UP:Size");				//分辨率设置 
	sprintf((char*)msgbuf,"JPEG Size:%s",JPEG_SIZE_TBL[size]);
	LCD_ShowString(30,180,200,16,16,msgbuf);					//显示当前JPEG分辨率
	
 	OV2640_JPEG_Mode();		//JPEG模式
	My_DCMI_Init();			//DCMI配置
	DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//DCMI DMA配置   
	OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//设置输出尺寸 
	DCMI_Start(); 		//启动传输
	while(1)
	{
		if(jpeg_data_ok==1)	//已经采集完一帧图像了
		{  
			p=(u8*)jpeg_buf;
			LCD_ShowString(30,210,210,16,16,"Sending JPEG data..."); //提示正在传输数据
			for(i=0;i<jpeg_data_len*4;i++)		//dma传输1次等于4字节,所以乘以4.
			{
        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);	//循环发送,直到发送完毕  		
				USART_SendData(USART2,p[i]); 
				key=KEY_Scan(0); 
				if(key)break;
			} 
			if(key)	//有按键按下,需要处理
			{  
				LCD_ShowString(30,210,210,16,16,"Quit Sending data   ");//提示退出数据传输
				switch(key)
				{				    
					case KEY0_PRES:	//对比度设置
						contrast++;
						if(contrast>4)contrast=0;
						OV2640_Contrast(contrast);
						sprintf((char*)msgbuf,"Contrast:%d",(signed char)contrast-2);
						break;
					case KEY1_PRES:	//饱和度Saturation
						saturation++;
						if(saturation>4)saturation=0;
						OV2640_Color_Saturation(saturation);
						sprintf((char*)msgbuf,"Saturation:%d",(signed char)saturation-2);
						break;
					case KEY2_PRES:	//特效设置				 
						effect++;
						if(effect>6)effect=0;
						OV2640_Special_Effects(effect);//设置特效
						sprintf((char*)msgbuf,"%s",EFFECTS_TBL[effect]);
						break;
					case WKUP_PRES:	//JPEG输出尺寸设置   
						size++;  
						if(size>8)size=0;   
						OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//设置输出尺寸  
						sprintf((char*)msgbuf,"JPEG Size:%s",JPEG_SIZE_TBL[size]);
						break;
				}
				LCD_Fill(30,180,239,190+16,WHITE);
				LCD_ShowString(30,180,210,16,16,msgbuf);//显示提示内容
				delay_ms(800); 				  
			}else LCD_ShowString(30,210,210,16,16,"Send data complete!!");//提示传输结束设置 
			jpeg_data_ok=2;	//标记jpeg数据处理完了,可以让DMA去采集下一帧了.
		}		
	}    
} 

jpeg_test 函数将 OV2640 设置为 JPEG 模式,该函数接收 OV2640 的 JPEG 数据,并通过串口 2 发送给上位机。

//RGB565测试
//RGB数据直接显示在LCD上面
void rgb565_test(void)
{ 
	u8 key;
	u8 effect=0,saturation=2,contrast=2;
	u8 scale=1;		//默认是全尺寸缩放
	u8 msgbuf[15];	//消息缓存区 
	LCD_Clear(WHITE);
    POINT_COLOR=RED; 
	LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4");
	LCD_ShowString(30,70,200,16,16,"OV2640 RGB565 Mode");
	
	LCD_ShowString(30,100,200,16,16,"KEY0:Contrast");			//对比度
	LCD_ShowString(30,130,200,16,16,"KEY1:Saturation"); 		//色彩饱和度
	LCD_ShowString(30,150,200,16,16,"KEY2:Effects"); 			//特效 
	LCD_ShowString(30,170,200,16,16,"KEY_UP:FullSize/Scale");	//1:1尺寸(显示真实尺寸)/全尺寸缩放
	
	OV2640_RGB565_Mode();	//RGB565模式
	My_DCMI_Init();			//DCMI配置
	DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置  
 	OV2640_OutSize_Set(lcddev.width,lcddev.height); 
	DCMI_Start(); 		//启动传输
	while(1)
	{ 
		key=KEY_Scan(0); 
		if(key)
		{ 
			DCMI_Stop(); //停止显示
			switch(key)
			{				    
				case KEY0_PRES:	//对比度设置
					contrast++;
					if(contrast>4)contrast=0;
					OV2640_Contrast(contrast);
					sprintf((char*)msgbuf,"Contrast:%d",(signed char)contrast-2);
					break;
				case KEY1_PRES:	//饱和度Saturation
					saturation++;
					if(saturation>4)saturation=0;
					OV2640_Color_Saturation(saturation);
					sprintf((char*)msgbuf,"Saturation:%d",(signed char)saturation-2);
					break;
				case KEY2_PRES:	//特效设置				 
					effect++;
					if(effect>6)effect=0;
					OV2640_Special_Effects(effect);//设置特效
					sprintf((char*)msgbuf,"%s",EFFECTS_TBL[effect]);
					break;
				case WKUP_PRES:	//1:1尺寸(显示真实尺寸)/缩放	    
					scale=!scale;  
					if(scale==0)
					{
                        if(lcddev.id == 0X5510)
                        {
                            SCCB_WR_Reg(0xd3,0x02);
                        }
						OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸
						OV2640_OutSize_Set(lcddev.width,lcddev.height); 
						sprintf((char*)msgbuf,"Full Size 1:1");
					}else 
					{
						OV2640_ImageWin_Set(0,0,1600,1200);				//全尺寸缩放
						OV2640_OutSize_Set(lcddev.width,lcddev.height); 
						sprintf((char*)msgbuf,"Scale");
					}
					break;
			}
			LCD_ShowString(30,50,210,16,16,msgbuf);//显示提示内容
			delay_ms(800); 
			DCMI_Start();//重新开始传输
		} 
        if (hsync_int)  //刚刚产生帧中断,可以延时
        {
            delay_ms(10);
            hsync_int = 0;
        }
	}    
}

rgb565_test 函数将 OV2640 设置为 RGB565 模式,并将接收到的数据,直接传送给 LCD,处理 过程完全由硬件实现,CPU 完全不用理会。main 函数就相对简单了。

int main(void)
{ 
	u8 key;
	u8 t;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	usart2_init(42,115200);		//初始化串口2波特率为115200
	LED_Init();					//初始化LED 
 	LCD_Init();					//LCD初始化  
 	KEY_Init();					//按键初始化 
	TIM3_Int_Init(10000-1,8400-1);//10Khz计数,1秒钟中断一次
	
 	usmart_dev.init(84);		//初始化USMART
 	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");	
	LCD_ShowString(30,70,200,16,16,"OV2640 TEST");	
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2014/5/14");  	 
	while(OV2640_Init())//初始化OV2640
	{
		LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
		delay_ms(200);
	    LCD_Fill(30,130,239,170,WHITE);
		delay_ms(200);
	}
	LCD_ShowString(30,130,200,16,16,"OV2640 OK");  	  
 	while(1)
	{	
		key=KEY_Scan(0);
		if(key==KEY0_PRES)			//RGB565模式
		{
			ov2640_mode=0;   
			break;
		}else if(key==KEY1_PRES)	//JPEG模式
		{
			ov2640_mode=1;
			break;
		}
		t++; 									  
		if(t==100)LCD_ShowString(30,150,230,16,16,"KEY0:RGB565  KEY1:JPEG"); //闪烁显示提示信息
 		if(t==200)
		{	
			LCD_Fill(30,150,210,150+16,WHITE);
			t=0; 
		}
		delay_ms(5);	  
	}
	if(ov2640_mode)jpeg_test();
	else rgb565_test(); 
}

使用STM32实现简单的摄像头应用
2401_85625565的博客
07-08 878
STM32上,我们可以使用外部存储器作为图像缓存,将图像数据存储在其中,并通过串行通信接口(如SPI或I2C)将数据传输给计算机或显示设备。在本篇文章中,我们将使用STM32微控制器,结合摄像头模块,实现一个简单的摄像头应用。在本例中,我们将使用行扫描方式采集图像数据。请注意,以上引脚连接方式仅供参考,具体的引脚分配取决于您所使用的STM32型号和摄像头模块。函数中启用了I2C1和GPIO的时钟,并配置了SCL和SDA引脚为开漏输出。在上述代码中,我们首先定义了I2C1的SCL和SDA引脚,然后在。
学习STM32摄像头控制
最新发布
2401_85625565的博客
07-26 479
本文将详细介绍摄像头STM32的硬件连接,以及使用STM32的软件编程。而STM32是一款广泛应用于嵌入式系统的微控制器,具有强大的处理能力和丰富的外设接口,非常适合用于控制摄像头。在STM32的软件编程中,我们需要使用STM32的外设库和相关的库函数来实现对摄像头的控制。根据OV7670的引脚定义,我们可以将其与STM32的GPIO引脚连接起来。首先,我们需要初始化STM32的I2C总线,以便与OV7670进行通信。接下来,我们需要初始化OV7670摄像头模块,以便进行图像数据的采集。
STM32摄像头实验相关源码分享[二值化]
Baby_Qi的博客
04-09 707
我只是一个无情的硬盘代码搬运工~ 我的电脑里资源好多呀,都是当年熬夜在实验室不要命的搞的。 想想当时,真的努力啊!现在也不差!!!就是想开学,想我的实验室… 看看文件夹吧: 其他就不一一发了,文件夹太多,慢慢分享吧! ...
使用STM32实现智能摄像头
qq_67153941的博客
07-11 1325
通过了解OV7670摄像头模块的硬件连接和初始化,以及使用I2C外设读取图像数据,再结合图像处理算法的示例代码,我们可以实。六、图像处理 在获取到图像数据之后,我们可以对图像数据进行处理,例如人脸识别、目标跟踪等。函数中,我们使用STM32的GPIO外设来配置OV7670摄像头的复位和使能管脚,并分别对其进行复位和使能操作。在上述代码中,我们首先定义了OV7670摄像头模块的各个管脚的引脚定义,然后编写了一个。函数中,我们首先将原始的RGB格式图像数据转换为灰度图像数据,然后调用。函数来进行人脸检测。
stm32 照相机 摄像头
01-06
stm32 照相机 摄像头 ov7620的驱动,实现照相机功能。。。。。。。。。。。。。。。。。。。。。。
STM32摄像头程序,亲测可用
11-26
STM32摄像头程序,亲测可用。内有详细注释和说明文档,很好的参考资料。
stm32 OV7670摄像头模块的介绍以及应用(SCCB的使用)
热门推荐
qq_35653974的博客
08-24 3万+
stm32 OV7670摄像头模块的介绍以及应用(SCCB的使用)
STM32 摄像头实验
01-14
在这个STM32摄像头实验中,我们将探讨如何利用STM32来驱动摄像头模块,并在LCD(液晶显示屏)上显示摄像头捕获的图像。 首先,我们需要了解STM32摄像头模块之间的接口。通常,摄像头模块会通过SPI、I2C或MIPI CSI...
STM32摄像头实验相关源码分享[一、颜色识别]
Baby_Qi的博客
04-09 3655
在原子哥摄像头实验基础上做了更改。 color.c部分[用于设定颜色值、匹配颜色等]: #include "color.h" #include "sys.h" #include "lcd.h" #include <stdio.h> RESULT result; TARGET_CONDITION condition={ 60, //目标最小色度,H_MIN 110, ...
STM32嵌入式课程设计摄像头实验
05-03
STM32嵌入式课程设计摄像头实验 实验现象: 本实验开机后,先初始化摄像头模块(OV7725),如果初始化成功,则在LCD模块上面显示摄像头模块所 拍摄到的内容。我们可以通过KEY0设置光照模式(5种模式)、通过KEY1...
STM32.zip_STM32 摄像头_ministm32
09-24
在"STM32.zip_STM32 摄像头_ministm32"这个压缩包中,我们可以看到重点是关于ALIENTEK MINISTM32开发板上的摄像头实验。ALIENTEK是一家知名的嵌入式系统开发工具提供商,MINISTM32开发板则是他们设计的一款用于学习...
基于stm32 简易摄像头设计实验
12-10
基于stm32 简易摄像头设计实验,内附源码程序,仅供参考学习,谢谢!
摄像头_摄像头_摄像头模块_stm32识别_
09-29
实现STM32摄像头的识别功能,本实验开机后,先初始化摄像头模块(OV7670),如果初始化成功,则在LCD模块上面显示摄像头模块所拍摄到的内容。我们可以通过KEY0设置光照模式(5种模式)、通过KEY1设置色饱和度,通过KEY2设置亮度,通过WK_UP设置对比度,通过TPAD设置特效(总共7种特效)。通过串口,我们可以查看当前的帧率(这里是指LCD显示的帧率,而不是指OV7670的输出帧率),同时可以借助USMART设置OV7670的寄存器,方便大家调试。DS0指示程序运行状态。 另外本实验可以借助USMART调试调用SCCB_RD_Reg和SCCB_WR_Reg等函数实现OV7670寄存器读写.
STM32F103实现OV7670摄像头显示
11-23
成功实现OV7670摄像头模块的OLED显示,包括每一块的程序,并附有成品。
【国外开源】STM32 机器人视觉摄像机OpenMV
08-01
【国外开源】STM32 机器人视觉摄像机OpenMV Cam设计,可结合python编程,很好的学习资料,内附开源网址。
STM32摄像头程序实现
10-07
可运行在STM32摄像头程序源码。实现了摄像头采集数据,可以很方便移植到别的平台上。
学习笔记之STM32的ov7670摄像头实验
sincerelover的博客
08-02 9973
OV7670是由OV(OmniVision)公司生产的一颗1/6寸的CMOS VGA图像传感器。该传感器体积小、工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影像数据。该产品VGA图像最高达到30帧/秒,用户可以完全控制图像质量、数据格式和传输方式。
STM32F4_OV2640&DCMI 摄像头模块
light_2025的博客
07-13 9146
KEY0 按键设置对比度;,图像可以设置任何尺寸(QQVGA~UXGA),采集到的 JPEG 数据将先存放到STM32F4的内存里面,每采集到一帧数据,就会关闭DMA传输,然后将采集到的数据发送到串口 2(通过上位机软件串口摄像头.exe接收,显示图片),之后在重新启动DMA传输;来控制采集多少的数据,比如说采集40帧的数据,但是CPU无法同时处理40帧数据,这是可以通过设置捕获率来设置采集数目的多少,可以采集20帧数据,也就是说,在原本采集40帧的基础上,没采集一帧就丢弃一帧,这样下来会采集一半的帧数。
写文章

热门文章

  • SD卡简介 9258
  • SDIO简介 6730
  • FATFS文件系统 6497
  • 2.4G无线通信 6215
  • ADC基本原理 4588

分类专栏

  • Matlab
  • stm32 58篇
  • 算法笔记 9篇

最新评论

  • LCD液晶显示实验

    2401_83515746: 显示汉字的话要怎么做

  • FATFS文件系统

    光怪鹿李: 我将那

  • CAN通信实验

    zcq6666: 成功了

  • ADC模数转换实验

    Vulcanuuu: 为什么两个采样阶段之间的延迟20个时钟?

  • DHT11 数字温湿度传感器实验

    xsswai: 校验和=四个字节相加的末8位

大家在看

  • 基于指纹和六角键盘的门锁系统 122
  • 眼图基础:阅读、分析和应用 976
  • 串行通信协议 - 简介 300
  • ESP32-WROOM-32 [创建AP站点-客户端-TCP透传] 394

最新文章

  • STM32 I2S简介和实验硬件连接
  • STM32 WAV&WM8978简介
  • STM32照相机实验
2022年67篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王网站优化如何才能让排名更靠前阜宁网站优化价格网站手机优化网站的优化仔细云速捷用对湛江百度网站优化灯塔网站优化软件网站关键词优化服务至上马鞍山市做网站优化哪家有名跟我学网站优化教学焦作企业网站快速排名优化技巧青浦区专业网站优化案例平谷优化网站推广遵化seo网站优化网站标题优化软件金华网站关键词怎么优化周村区网站seo优化排名廊坊网站优化费用乐至网站制作优化公司长春实力强的服装行业网站优化网站优化 代码优化贾汪区网站优化多少钱河南综合网站优化大全外贸网站优化接任务金华百度搜索网站优化虞城网站优化费用做360优化网站都有哪家什邡市网站优化乡宁县网站seo优化排名白帽优化网站seo宝山区优化网站价格香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化