以下是将GD32H759I-EVAL开发板上的OV2640摄像头例程移植到GD32H759I-START开发板的具体步骤和代码示例,包括端口修改差异说明:
1.硬件连接
确保OV2640摄像头与GD32H759I-START开发板的DCI接口正确连接。OV2640通过并行数据线(D0-D7)、控制信号(如VSYNC、HSYNC、PCLK等)以及SCCB接口(SCL、SDA)与MCU相连。如果硬件接口存在差异,需要根据GD32H759I-START的引脚定义重新配置连接。
2.移植摄像头驱动
(1)添加驱动文件
将GD32H759I-EVAL开发板的OV2640摄像头驱动文件(如`ov2640.c`和`ov2640.h`)添加到GD32H759I-START的工程中。
(2)配置GPIO
根据GD32H759I-START的引脚定义,重新配置与OV2640相关的GPIO引脚。以下是示例代码:
void dci_gpio_config(void){
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_GPIOH);
rcu_periph_clock_enable(RCU_GPIOG);
/* DCI GPIO AF configuration */
gpio_af_set(GPIOE, GPIO_AF_13, GPIO_PIN_3); // DCI_PIXCLK
gpio_af_set(GPIOB, GPIO_AF_13, GPIO_PIN_7); // DCI_VSYNC
gpio_af_set(GPIOA, GPIO_AF_13, GPIO_PIN_4); // DCI_HSYNC
gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_3);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_4);
}
(3)初始化摄像头
调用摄像头初始化函数(如`ov2640_init()`),完成摄像头的复位、寄存器配置等操作。以下是示例代码:
void ov2640_init(void)
{
// 初始化SCCB接口
OV2640_IIC_Init();
// 写入OV2640寄存器配置
OV2640_WriteReg(0x3008, 0x00); // 设置输出格式为RGB565
OV2640_WriteReg(0x3009, 0x00); // 设置分辨率
// 其他寄存器配置...
}
3.配置DCI和DMA
(1)DCI配置
将DCI的捕获模式从连续捕获模式改为快照捕获模式,以便采集图像可控。以下是示例代码:
void dci_config(void)
{
dci_parameter_struct dci_struct;
dma_single_data_parameter_struct dma_single_struct;
rcu_periph_clock_enable(RCU_DCI);
dci_struct.capture_mode = DCI_CAPTURE_MODE_SNAPSHOT; // 设置为快照模式
dci_struct.capture_rate = DCI_CAPTURE_RATE_ALL_FRAME;
dci_struct.vsync_polarity = DCI_VSYNC_POLARITY_LOW;
dci_struct.hsync_polarity = DCI_HSYNC_POLARITY_LOW;
dci_struct.pixel_clock_polarity = DCI_PIXCLK_POLARITY_RISING;
dci_struct.data_width = DCI_DATA_WIDTH_8BIT;
dci_struct.line_length = IMAGE_WIDTH;
dci_struct.frame_length = IMAGE_HEIGHT;
dci_struct.capture_enable = DCI_CAPTURE_ENABLE;
dci_init(&dci_struct);
dci_interrupt_enable(DCI_INT_FRAME);
nvic_irq_enable(NVIC_DCI_IRQn, 0, 0);
// DMA配置
dma_single_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_single_struct.periph_memory_width = DMA_PERIPH_WIDTH_32BIT;
dma_single_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE;
dma_single_struct.priority = DMA_PRIORITY_HIGH;
dma_single_data_mode_init(DMA1, DMA_CH7, &dma_single_struct);
dma_channel_enable(DMA1, DMA_CH7);
dci_enable();
dci_capture_enable();
}
(2)DMA配置
配置DMA用于图像数据的传输,确保DMA的传输地址和传输数量正确。示例代码已在上述DCI配置中包含。
4.显示图像
如果需要将采集到的图像显示在LCD屏幕上,需要移植LCD驱动。以下是示例代码:
void InitLCD(void)
{
// 配置LCD时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_GPIOH);
rcu_periph_clock_enable(RCU_GPIOG);
rcu_periph_clock_enable(RCU_TLI);
// 配置GPIO
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_4);
// 其他GPIO配置...
// 配置TLI
tli_parameter_struct tli_struct;
tli_struct.scan_mode = TLI_SCAN_MODE_NORMAL;
tli_struct.screen_orientation = TLI_SCREEN_ORIENTATION_PORTRAIT;
tli_struct.screen_width = 480;
tli_struct.screen_height = 272;
tli_struct.pixel_format = TLI_PIXEL_FORMAT_RGB565;
tli_struct.frame_buffer = (uint32_t)SDRAM_ADDR;
tli_init(&tli_struct);
tli_enable();
}
5.调试与优化
(1)编译与烧录
将移植后的代码编译并烧录到GD32H759I-START开发板上。
(2)调试
观察摄像头的图像采集和显示效果,根据需要调整摄像头寄存器参数或DCI配置。如果遇到问题,可以参考以下建议:
• 确保SCCB接口初始化正确,能够读取到OV2640的设备ID。
• 检查DCI和DMA的配置是否正确,确保像素时钟(PCLK)和行场同步信号(HSYNC、VSYNC)的极性与硬件一致。
端口修改差异
• GPIO配置:在GD32H759I-EVAL开发板上,DCI接口的GPIO引脚配置如下:
• `DCI_PIXCLK`:PE3
• `DCI_VSYNC`:PB7
• `DCI_HSYNC`:PA4
• 数据线(D0-D7):根据具体连接配置
• 在GD32H759I-START开发板上,可能需要根据硬件设计重新分配这些引脚。
• SCCB接口:在GD32H759I-EVAL开发板上,SCCB接口通常使用I2C引脚。在GD32H759I-START开发板上,可能需要根据硬件设计重新分配SCCB接口的引脚。例如,可以使用以下引脚:
• `SDA`:PB7
• `SCL`:PB6。
通过以上步骤和代码示例,可以将GD32H759I-EVAL开发板上的OV2640摄像头例程成功移植到GD32H759I-START开发板上。
|