主程序 man.c 一些声明文件
man.c创建了所有初始化
d200_camera.c 所有实现
d200_camera_run 实现了拍照
void d200_camera_run(void) {
uint8_t *pic; // 临时存储 JPEG 数据指针
uint32_t jpeg_len; // 临时存储 JPEG 数据长度
if (receive_status == 1) { // 检查是否收到新帧
receive_status = 0; // 重置接收状态
// 获取 JPEG 数据
jpeg_len = bflb_mjpeg_get_frame_info(mjpeg, &pic); // pic 指向 JPEG 数据
bflb_mjpeg_pop_one_frame(mjpeg); // 弹出当前帧(准备下一帧)
bflb_l1c_dcache_invalidate_range(pic, jpeg_len); // 缓存无效化(确保数据最新)
// 加锁(防止多线程冲突)
xSemaphoreTake(camera_muxsem_handle, portMAX_DELAY);
// 将 JPEG 数据复制到 mjpeg_output_buffer
for (int i = 0; i < jpeg_len; i++) {
mjpeg_output_buffer[i] = pic[i];
}
pic_size = jpeg_len; // 更新全局变量 pic_size
xSemaphoreGive(camera_muxsem_handle); // 解锁
// 如果 camera_mode == 1,重新启动摄像头(准备下一帧)
if (camera_mode == 1) {
bflb_mjpeg_update_input_output_buff(mjpeg, dvp_buffer, NULL, mjpeg_buffer, sizeof(mjpeg_buffer));
bflb_mjpeg_start(mjpeg); // 重新启动 MJPEG 编码
bflb_cam_start(cam0); // 重新启动摄像头
}
}
}
(2) 关键点分析
receive_status
控制拍照触发
- 只有当
receive_status == 1
时,才会拍照并处理数据。
- 这个变量可能是由 中断 或 外部代码 设置的(例如 DMA 传输完成时置
1
)。
camera_mode == 1
时自动重启摄像头
- 如果
camera_mode
设为 1
,拍照完成后会自动重启摄像头(bflb_cam_start(cam0)
),实现持续拍照。
- 如果
camera_mode
是 0
,则 只拍一次,不会自动重启。
- 数据存储位置
- JPEG 数据先存放在
pic
(临时指针),然后复制到 mjpeg_output_buffer
。
pic_addr
没有被赋值,所以目前它没有存储有效数据(可能是你想优化掉 mjpeg_output_buffer
直接让 pic_addr = pic
?)。
- 理论代码
删除 ap_web,修复错误
在man.c 就可以 获取
- extern uint8_t *pic_addr;
extern uint32_t pic_size;
- 进行获取 图片 发送
- bl618_camera_task





