STM32H7-RP 보드에는 DCMI 인터페이스를 사용 할수 있어 카메라 모듈을 연결하여 테스트 할 수 있다.
DCMI 핀맵은 아래와 같다.
STM32CubeIDE 에서 DCMI 인터페이스를 설정하고 DMA를 추가 한다.
DMCI 인터럽트도 사용할 수 있도록 설정해 준다.
카메라의 메인 클럭(MCLK)은 RCCMCO 핀(PA8)을 통해 가변 할 수 있도록 할당되어 있기 때문에 MCO를 사용할 수 있도록 설정한다.
카메라 모듈의 설정은 I2C1에 할당되어 있다.
기본적인 코드를 테스트 해보자.
카메라 라인 인터럽트 및 프레임 인터럽트루틴에서 플래그를 보내고 메인루프에서 처리 하도록 했다.
void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
{
gCameraFrameFlag++;
}
void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
{
gCameraLineFlag++;
}
메인루프에서는 TCP 전송이나 수신을 처리하고 필요에 따라 카메라 데이터 인터럽트 플레그를 확인해서 전송 할 수 있도록 했다.
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
ProcessCamTcps(_CAM_SOCK_NUM, ethBuf0, dDestport);
if(gCameraFrameFlag>0)
{
gCameraFrameFlag = 0;
CamImagTransferFrame(_CMD_CAM_FRAME, gLineCnt);
printf(">%d, %d, %x, %x\r\n", gFrameCnt, gLineCnt, FrameBuffer[0], FrameBuffer[100]);
printf("-------------------\r\n");
gFrameCnt++;
gLineCnt = 0;
}
if(gCameraLineFlag>0)
{
gCameraLineFlag = 0;
CamImagTransferLine(_CMD_CAM_LINE, gLineCnt);
gLineCnt++;
}
}
이제 정상적으로 프레임 데이터가 들어온다.
>99302, 480
-------------------
>99303, 480
-------------------
>99304, 480
-------------------
>99305, 480
-------------------
>99306, 480
-------------------
그런데 인터럽트는 정상적으로 발생하지만 데이터를 확인 해 보니 0값만 있다.
왜 CAM 데이터가 없는 것일까?
STM32F4 보드에서는 잘 동작 했던 코드인데...
DMA 메모리에서 정상적으로 값을 가져 오지 못하는 현상 같아 보인다.
STM32H7 은 고속의 처리를 위해 여러가지 기능이 많지만 기존 코드와 호환성이 많이 떨어지는것 같다. 테스트 할때 마다 문제가 발생하고 있다.
DMA 데이터 이면 DCashe와 관련 있지 않을까?
DCashe 를 사용하지 않으니 정상 동작 한다.
int main(void)
{
/* USER CODE BEGIN 1 */
unsigned int data;
SCB_EnableICache();
//SCB_EnableDCache();
MPU_Config();
이렇게 해서 네트웍으로 영상을 보내면 정상적으로 출력 되는것을 확인 할 수 있다.
W5300으로 영상 전송시 네트웍 전송률을 확인해 보면 38Mbps정도로 측정이 된다.
iperf 로 데이터 전송시(80Mbps)와 비교 해보면 많이 차이가 발생한다. 아무래도 데이터 수신후 처리하는 부분에서 시간을 많이 소모하는것 같아 보인다.