DCMI_InitTypeDef dcmi = {0};
DCMI_CROPInitTypeDef crop = {0};
PeripheralEnable(PeripheralDCMI, true);
DCMI_CaptureCmd(DISABLE);
DCMI_Cmd(DISABLE);
static const IOEnum pins[] = {
PA6, PH8, PB7, //plck像素时钟,行同步,帧同步
PC6, PH10, PC8, PH12, PH14,PB6, PI6, PI7 //数据引脚
};
//复用功能AF13,无上下拉,高速,使用较低驱动强度配置
for (index = 0U; index < (sizeof(pins) / sizeof(pins[0])); ++index) {
IOSetup(pins[index], MakeIOConfig(IOModeAlternate, GPIO_AF_DCMI,
IOPullNone, IOSpeedHigh, IODriveLow));
}
dcmi.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; //连续模式
dcmi.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; //硬件同步
dcmi.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising; //PCLK上升沿采样
dcmi.DCMI_VSPolarity = DCMI_VSPolarity_Low; //VSYNC低有效
dcmi.DCMI_HSPolarity = DCMI_HSPolarity_Low; //HSYNC低有效
dcmi.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; //每一帧都接收
dcmi.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; //8位数据总线
dcmi.DCMI_ByteSelectMode = DCMI_ByteSelect_Mode_AllByte; //不跳字节
dcmi.DCMI_LineSelectMode = DCMI_LineSelect_Mode_AllLine; //不跳行
DCMI_Init(&dcmi); //确认配置
//TM30的42240字节不是随便切成192×220,它刚好对应协议结构。
// CROP的实际作用
// 启用以后,每帧DCMI只接受:
// 从第0行开始
// 一共220行
// 每行从第0个PCLK开始
// 每行接受192个字节
crop.DCMI_HorizontalOffsetCount = 0U;
crop.DCMI_CaptureCount = (uint16_t)(192 - 1U);
crop.DCMI_VerticalStartLine = 0U;
crop.DCMI_VerticalLineCount = (uint16_t)(220 - 1U); //字节数,不是像素
DCMI_CROPConfig(&crop);
DCMI_CROPCmd(ENABLE);