STM32
直播中

半导体开发

11年用户 920经验值
擅长:可编程逻辑
私信 关注
[问答]

求助,关于STM32F767的DCMI+TW9912配置逐行BT656内嵌码同步问题求解

需要通过STM32的DCMI接口将tw9912解码去隔行的逐行BT656数据流采集到外置的SDRAM中,已经配置好TW9912,其已正常工作,但是配置的stm32的DCMI内嵌码同步出问题了,无论如何修改内嵌码同步值,帧中断频率都100多HZ;去隔行的tw9912的帧率是50Hz,真是让人头大。另外,参考手册上DCMI_ESUR寄存器也不是它说的那种使用方式。以下是DCMI口配置的代码
    DCMI_Handler.Instance=DCMI;
    DCMI_Handler.Init.SynchroMode=DCMI_SYNCHRO_EMBEDDED;    //硬件同步HSYNC,VSYNC
    DCMI_Handler.Init.PCKPolarity=DCMI_PCKPOLARITY_RISING;  //PCLK 上升沿有效
    DCMI_Handler.Init.CaptureRate=DCMI_CR_ALTERNATE_4_FRAME;        //全帧捕获
    DCMI_Handler.Init.ExtendedDataMode=DCMI_EXTEND_DATA_8B; //8位数据格式DCMI_OEBS_EVEN
    DCMI_Handler.Init.SyncroCode.FrameEndCode = 0xb6;
    DCMI_Handler.Init.SyncroCode.FrameStartCode = 0xab;
    DCMI_Handler.Init.SyncroCode.LineStartCode = 0x80;
    DCMI_Handler.Init.SyncroCode.LineEndCode = 0x9d;



    DCMI_Handler.Init.JPEGMode = DCMI_JPEG_DISABLE;
    DCMI_Handler.Init.ByteSelectMode = DCMI_BSM_ALL;
    DCMI_Handler.Init.ByteSelectStart = DCMI_OEBS_EVEN;
    DCMI_Handler.Init.LineSelectMode = DCMI_LSM_ALL;
    DCMI_Handler.Init.LineSelectStart = DCMI_OELS_ODD;



    HAL_DCMI_Init( DCMI_Handler);
    __HAL_DCMI_DISABLE_IT( DCMI_Handler,DCMI_IT_LINE|DCMI_IT_VSYNC|DCMI_IT_ERR|DCMI_IT_OVR);
    __HAL_DCMI_ENABLE_IT( DCMI_Handler,DCMI_IT_VSYNC);      //使能帧中断
    __HAL_DCMI_ENABLE( DCMI_Handler);   

回帖(1)

wufan931111

2024-4-30 17:42:03
首先,我们需要确保STM32F767的DCMI接口和TW9912摄像头之间的连接正确。接下来,我们将逐步检查和配置DCMI接口以实现逐行BT656内嵌码同步。

1. 确保DCMI时钟已正确配置。在RCC中启用DCMI时钟。

```c
__HAL_RCC_DCMI_CLK_ENABLE();
```

2. 配置DCMI接口的GPIO引脚。

3. 初始化DCMI接口。

```c
DCMI_HandleTypeDef DCMI_Handler;
DCMI_Handler.Instance = DCMI;
DCMI_Handler.Init.SynchroMode = DCMI_SYNCHRO_EMBEDDED;
DCMI_Handler.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;
DCMI_Handler.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
DCMI_Handler.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
DCMI_Handler.Init.CaptureRate = DCMI_CR_ALL_FRAME;
DCMI_Handler.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
DCMI_Handler.Init.JPEGMode = DCMI_JPEG_DISABLE;
DCMI_Handler.Init.BurstAccessMode = DISABLE;
HAL_DCMI_Init(&DCMI_Handler);
```

4. 配置DCMI的内嵌码同步值。根据TW9912的数据手册,找到合适的内嵌码同步值。这里需要根据实际的BT656数据流来设置。

```c
__HAL_DCMI_SET_SYNCHRO(&DCMI_Handler, SYNCHRO_CODE);
```

5. 配置DCMI中断。例如,配置帧中断。

```c
HAL_NVIC_SetPriority(DCMI_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DCMI_IRQn);
```

6. 启动DCMI。

```c
HAL_DCMI_Start_DMA(&DCMI_Handler, (uint32_t)SDRAM_Buffer, SDRAM_BUFFER_SIZE);
```

7. 在DCMI中断服务例程中处理数据。

```c
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
  // 处理帧数据
}
```

8. 如果帧率仍然不正确,请检查TW9912的配置,确保其输出帧率为50Hz。

9. 如果问题仍然存在,请参考STM32F767的参考手册和TW9912的数据手册,仔细检查DCMI配置和内嵌码同步值。

10. 如果需要,尝试更新STM32F767的固件库,以确保使用的是最新版本。

通过以上步骤,应该可以解决STM32F767的DCMI接口逐行BT656内嵌码同步问题。如果问题仍然存在,请提供更多详细信息,以便进一步分析和解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分