在线时间4812 小时
UID3441752
注册时间2017-11-21
NXP金币75887
TA的每日心情 | 开心 2025-7-11 08:53 |
---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 40221
- 最后登录
- 2025-9-9
|
CSI和FlexIO模块的使用与示例
为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。
本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。
点此回顾往期内容:
GPIO详解
FAST GPIO模块详解与使用示例
ADC模块和QTIMER模块
PIT模块详解与使用示例
UART模块详解与使用示例
各位朋友好,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来投稿啦!今天分享CSI和FLEXIO两个模块的使用,主要讲解如何利用这两个模块分别驱动灰度摄像头和彩色摄像头,分别实现图像采集。
感谢恩智浦的支持,感谢梁平老师的支持以及帮忙检查修改文中错误,感谢关注“逐飞科技”。
接下来进入我们今天分享的主题----“CSI模块详解与使用示例”&“FLEXIO模块详解与使用示例”:
CSI模块详解与使用示例
1. CSI功能
CSI(CMOS Sensor Interface)是专用的图像传感器接口,RT1064的CSI接口支持8位、10位、16位并行接口。CSI模块内嵌DMA因此不需要占用MCU的DMA外设。
2. CSI库函数
以下函数均位于zf_csi.c和zf_csi.h:
csi_init函数参数
csi_add_empty_buffer函数参数
csi_get_full_buffer函数参数
CSI使用示例
CSI灰度摄像头采集(以逐飞总钻风摄像头采集为例)
- #include "headfile.h"
-
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
-
- ips200_init(); //初始化2寸 并口屏幕
- mt9v03x_csi_init();//使用CSI接口采集总钻风
-
- EnableGlobalIRQ(0);
-
- while(1)
- {
- if(mt9v03x_csi_finish_flag)//采集完成标志位
- {
- mt9v03x_csi_finish_flag = 0;
- //显示图像
- ips200_displayimage032(mt9v03x_csi_image[0],MT9V03X_CSI_W,MT9V03X_CSI_H);
- }
- }
- }
复制代码 编程要点1:CSI底层函数不需要自己调用,直接调用摄像头初始化函数即可。
编程要点2:关于CACHE一致性问题,摄像头驱动文件已经做好了,用户只需要直接使用图像数组即可。
编程要点3:有细心童鞋问总钻风CSI不是有两个buffer?mt9v03x_csi1_image和mt9v03x_csi2_image两个数组,但是为啥在显示图像的时候并不是使用这两个数组呢,这是因为两个buffer在使用的时候需要用户手动的去切换,可能不是很方便,因此我们在编写驱动的时候特意定义了一个指向数组的指针mt9v03x_csi_image,在采集完成的中断里进行动态切换,用户使用时当做普通的二维数组使用即可,请勿使用sizeof计算mt9v03x_csi_image大小。因为这仅仅是一个指针而已。在第四章中的摄像头小节中有更详细的讲解。
CSI彩色摄像头采集(以逐飞凌瞳彩摄采集为例)
- #include "headfile.h"
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
-
- ips200_init(); //初始化2寸 并口屏幕
- scc8660_csi_init();//使用CSI接口采集总钻风
-
- EnableGlobalIRQ(0);
-
- while(1)
- {
- if(scc8660_csi_finish_flag)//采集完成标志位
- {
- scc8660_csi_finish_flag = 0;
- //显示图像
- ips200_displayimage8660_zoom(scc8660_csi_image[0],SCC8660_CSI_PIC_W,SCC8660_CSI_PIC_H,SCC8660_CSI_PIC_W,SCC8660_CSI_PIC_H);
- }
- }
- }
复制代码 编程要点:与上面总钻风采集要点一致,请参考上一步
FLEXIO模块
1. FLEXIO功能
FLEXIO(Flexible I/O)是一种高度可配置的模块,提供众多功能。可支持UART、I2C、SPI、I2S、Camera IF、Motorola 68K/Intel 8080 bus、PWM/Waveform generation协议等等。本章节主要FLEXIO实现摄像头采集的功能。
2. FLEXIO库函数
以下函数位于zf_camera.c和zf_camera.h:
flexio_camera函数参数
flexio_enable函数参数
flexio_dma_init函数参数
FLEXIO使用示例
1. 摄像头采集
- #include "headfile.h"
-
- #define TEST_ROW 120//定义图像高度
- #define TEST_COL 188//定义图像宽度
-
- //定义图像数组大小 务必4字节对齐
- AT_DTCM_SECTION_ALIGN(uint8 image_test[TEST_ROW][TEST_COL],4);
-
- void camera_dma(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds)
- {
- //dma完成中断
- //L1CACHE_CleanInvalidateDCacheByRange((uint32)image_test[0],TEST_COL*TEST_ROW);
- //如果数据存放在TCM则可以不需要这句话
- }
-
- void GPIO2_Combined_0_15_IRQHandler(void)
- {
- //场中断
- dma_restart(image_test[0]);//重新加载目的地址
- }
-
-
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
-
- dma_mux_init();//dma复用初始化
- //设置C8-C15为数据引脚 C5为像素时钟引脚 C6为行引脚
- flexio_camera(FLEXIO2_D08_C8, FLEXIO2_D05_C5, FLEXIO2_D06_C6);
- //设置存储图像的地址 图像字节数 dma回调函数
- flexio_dma_init(image_test[0], TEST_COL*TEST_ROW, camera_dma);
- //使能flexio
- flexio_enable_rxdma();
-
- //初始化IO中断 用于接收场中断信号
- gpio_interrupt_init(C7, FALLING, GPIO_INT_CONFIG);
- //设置场中断优先级 范围0-15 越小优先级越高
- NVIC_SetPriority(GPIO2_Combined_0_15_IRQn,0);
-
- EnableGlobalIRQ(0);
- while(1)
- {
-
- }
- }
复制代码 编程要点1:定义的图像数组必须4字节对齐。
编程要点2:采集的图像列宽最好是4的倍数。
编程要点3:flexio camera接口并不包含场信号,场信号需要自己开IO中断来实现。
编程要点4:建议用户使用seekfree_peripheral文件夹下已编写好的总钻风或者凌瞳驱动来直接采集摄像头数据。
本期逐飞科技“基于RT1064的智能车应用入门指导”之“CSI模块详解与使用示例”&“FLEXIO模块详解与使用示例”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足及建议请及时联系“逐飞科技”:
逐飞科技__智能车③部:824575535;
AI电磁组交流群--逐飞科技:1077051054;
我们将尽快完善。感谢关注“逐飞科技”,下期再见!
文章出处:恩智浦MCU加油站
|
|