SWRU543B January 2019 – June 2025 CC3230S , CC3230SF , CC3235MODS , CC3235MODSF , CC3235S , CC3235SF
MAP_PRCMPeripheralClkEnable(PRCM_CAMERA, PRCM_RUN_MODE_CLK);
MAP_PRCMPeripheralReset(PRCM_CAMERA);
CameraXClkConfig(CAMERA_BASE, 120000000, 5000000)CameraXClkConfig(CAMERA_BASE, 120000000, 10000000)The maximum supported division is 30; a 2-MHz XCLK cannot be derived by using a 120-MHz MCLK.
CameraThresholdSet(CAMERA_BASE, 8);CameraIntEnable(CAMERA_BASE, CAM_INT_FE)CameraDMAEnable(CAMERA_BASE)DMASetupTransfer(UDMA_CH22_CAMERA, UDMA_MODE_PINGPONG, <total_dma_elements>>, UDMA_SIZE_32,
UDMA_ARB_8, (void *)CAM_BUFFER_ADDR, UDMA_SRC_INC_32,
(void *)<data_buffer>,UDMA_DST_INC_32); <data_buffer>+=<total_dma_elements>;/* Setup the buffer for pong */
DMASetupTransfer(UDMA_CH22_CAMERA|UDMA_ALT_SELECT,
UDMA_MODE_PINGPONG, <total_dma_elements>,UDMA_SIZE_32, UDMA_ARB_8, (void *)CAM_BUFFER_ADDR,
UDMA_SRC_INC_32, (void *)<data_buffer>,UDMA_DST_INC_32);<data_buffer> += <total_dma_elements>;/* Setup buffer for next ping */The following code snippet is for handling the camera interrupts:
void <camera_interrupt_handler>() {
/* Stop capture on receiving a frame-end */
if(CameraIntStatus(CAMERA_BASE) &CAM_INT_FE)
{
CameraIntClear(CAMERA_BASE, CAM_INT_FE);
CameraCaptureStop(CAMERA_BASE, true);
}
/* Check if ‘CAM_THRESHHOLD_DMA_DONE’ is active */
if(<write_register>(DMA_DONE_INT_STS_RAW) & (1<<8))
{
/* Clear the interrupt */
<write_register>(DMA_DONE_INT_ACK) |= 1 << 8; <total_dma_elements> += <total_dma_elements> * <32-bits>; /* For every iteration, set either the ping or pong transactions */
if(<check condition for even iterations>)
{
DMASetupTransfer(UDMA_CH22_CAMERA, UDMA_MODE_PINGPONG,<total_dma_elements>, UDMA_SIZE_32,
UDMA_ARB_8, (void *)CAM_BUFFER_ADDR, UDMA_SRC_INC_32,
(void *)<data_buffer>, UDMA_DST_INC_32);
}
else(<check condition for odd iterations>) {
DMASetupTransfer(UDMA_CH22_CAMERA|UDMA_ALT_SELECT,
UDMA_MODE_PINGPONG, <total_dma_elements>, UDMA_SIZE_32, UDMA_ARB_8, (void *)CAM_BUFFER_ADDR,
UDMA_SRC_INC_32, (void *)<data_buffer>, UDMA_DST_INC_32);
}
/* Setup the buffer for the next ping/pong */<data_buffer> += <total_dma_elements>; if (<on an error>)
{
/* Disable DMA and mask ‘CAM_THRESHHOLD_DMA_DONE’ */
UDMAStopTransfer(UDMA_CH22_CAMERA);<write_register>(0x44026090) |= 1 << 8;
}
}