这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享开发笔记,赚取电动螺丝刀】MAX78000开发板摄像头的读取,并在TFT屏

共1条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】MAX78000开发板摄像头的读取,并在TFT屏幕上显示

助工
2025-11-04 09:39:40     打赏

Fm-PXF7qJ3nxAyZihTr26yzSbIMy

MAX78000板子上集成了一颗摄像头:CMOS VGA图像传感器(OVM769)。这颗摄像头非常的小,分辨率不算高,支持实时图像采集,适用于边缘AI视觉应用。该摄像头通过12位并行接口与MAX78000微控制器连接,可直接将图像数据传输至芯片内置的CNN加速器进行低功耗AI推理,常用于目标检测、分类及人脸识别等场景。

这次,尝试读取这颗摄像头的图像,并在TFT液晶屏上做显示。

第一步:首先创建工程,美信官方提供了很详实的例程,“MaximSDKExamplesMAX78000CameraIF”这个例程提供了使用摄像头的范例,所以这次以这个项目为基础实现自己的工程。

将“MaximSDKExamplesMAX78000CameraIF”项目导入eclipse,然后修改Makefile文件。

image.png

第二步:初始化屏幕。这里使用的屏幕是2.4寸SPI液晶屏模块240*320TFT模块ILI9341。具体驱动可以参考之前的帖子。

MAX78000FTHR开发板管脚TFT屏幕管脚说明

GND

GND电源负
3V3VCC电源正
P0_7
SCK4 线-SPI 串口时钟
P0_5SDI4 线-SPI 数据线
P0_19RESET显示屏驱动芯片选脚,低电平使能
P0_8DC4 线-SPI 数据/指令选择选择脚
P0_9BLK背光控制开关;低电平关闭背光
P0_11CS4 线-SPI 片选低电平有效
	//打开TFT屏幕
	mxc_gpio_cfg_t tft_reset_pin = { MXC_GPIO0, MXC_GPIO_PIN_19,
			MXC_GPIO_FUNC_OUT, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH };
	mxc_gpio_cfg_t tft_blen_pin = { MXC_GPIO0, MXC_GPIO_PIN_9,
			MXC_GPIO_FUNC_OUT, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH };
	MXC_TFT_Init(MXC_SPI0, 1, &tft_reset_pin, &tft_blen_pin);
	MXC_TFT_SetRotation(ROTATE_90);
	MXC_TFT_SetForeGroundColor(WHITE); // set chars to white
	MXC_Delay(1000000);

第三步:初始化摄像头。这里跟着例程做,摄像头有使用I2C协议,这里摄像头的I2C地址为“0X3C”。可以设置摄像头获取图像的信息,这里TFT屏幕分辨率为320X240,所以就设置摄像头的图像分辨率为320X240,使用RGB565编码,这样后期摄像头显示就不用转码了。

// Initialize the camera driver.
	camera_init(CAMERA_FREQ);
	printf("nnCamera Examplen");

	slaveAddress = camera_get_slave_address();
	printf("Camera I2C slave address: %02xn", slaveAddress);

// Obtain the manufacturer ID of the camera.
	ret = camera_get_manufacture_id(&id);

	if (ret != STATUS_OK) {
		printf("Error returned from reading camera id. Error %dn", ret);
		return -1;
	}

	printf("Camera ID detected: %04xn", id);

// Setup the camera image dimensions, pixel format and data acquiring details.

	ret = camera_setup(IMAGE_XRES, IMAGE_YRES, PIXFORMAT_RGB565, FIFO_FOUR_BYTE,
			STREAMING_DMA, dma_channel); // RGB565 stream

	if (ret != STATUS_OK) {
		printf("Error returned from setting up camera. Error %dn", ret);
		return -1;
	}

	MXC_Delay(SEC(1));
	camera_write_reg(0x11, 0xE); // can be set to 0xB in release mode ( -o2 )

// Start capturing a first camera image frame.
	printf("Startingn");
	camera_start_capture_image();

第四步:将摄像头获取到的图片显示到TFT屏幕。工作流程为:摄像头采集图像——>将图像数据存放到DMA——>从DMA读取一行图像数据——>绘制屏幕上的一行——>循环读取DMA直至读取图片完成。

void process_img(void) {
	uint8_t *raw;
	uint32_t imgLen;
	uint32_t w, h;

// Get the details of the image from the camera driver.
	camera_get_image(&raw, &imgLen, &w, &h);
	uint8_t *data = NULL;
	utils_stream_img_to_pc_init(raw, imgLen, w, h, camera_get_pixel_format());

	for (int i = 0; i < h; i++) {
		// Wait until camera streaming buffer is full
		while ((data = get_camera_stream_buffer()) == NULL) {
			if (camera_is_image_rcv()) {
				break;
			}
		};

		MXC_TFT_ShowImageCameraRGB565(X_START, Y_START + i, data, w, 1);
		release_camera_stream_buffer();
	}

	stream_stat_t *stat = get_camera_stream_statistic();
	if (stat->overflow_count > 0) {
		LED_On(LED_RED); // Turn on red LED if overflow detected

		while (1) {
		}
	}
}

效果:

13.jpg12.jpg11.jpg

可以看出,屏幕能将摄像头获得的图片展示出来了。但是分辨率比较低,屏幕刷新很慢,可以看见明显的一帧一帧的图片更新,不确定是屏幕显示慢还是摄像头获取图片的速度慢。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]