单片机的DCMI口对接摄像头的输出口;3 DMA传输视频数据到显存
摄像头配置的输出时序为数字摄像头时序;
摄像头接口也stm32的DCMI接口对接;
DCMI接口配置时要小心其读取视频数据的中断函数是高电平有效还是低电平有效;
DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;//DCMI_VSPolarity_High;
DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;//DCMI_HSPolarity_Low;
DCMI中的FIFO缓冲接收到的数据、重组数据;比如摄像头口是8位的,而DCMI的数据寄存器是32位的,FIFO将接受到的八位的数据缓存为32位的;而在液晶上显示的是rgb565的是16位的,在DMA传输时一次传输16为,数据才不会乱;这种情况下DMA传输的源数据宽度为32、目的数据宽度为16位;
DCMI有帧中断、行中断;其中断服务函数都指向DMA传输;
摄像头的原始数据是RGB RAW格式,这个原始数据的排列格式是 RGRG/GBGB排列的,我们叫做 Bayer pattern(这个最最常见)。
DMA是从DCMI的数据寄存器(0x50050028)搬移数据到显存地址(液晶会自动显示该地址的内容);4 stm32时钟树
DCMI中的FIFO缓冲接收到的数据、重组数据;比如摄像头口是8位的,而DCMI的数据寄存器是32位的,FIFO将接受到的八位的数据缓存为32位的;而在液晶上显示的是rgb565的是16位的,在DMA传输时一次传输16为,数据才不会乱;这种情况下DMA传输的源数据宽度为32、目的数据宽度为16位;一次传输16位(一个RGB)可以防止像素乱序;
我们在编程时一般都会明确指定一个传输数量,在完成一次数目传输后DMA_SxNDTR计数值就会自减,当达到零时就说明传输完成。
/*行中断到来时、一行一行将数据传输到显存,行中断来了一定是新一行的数据,FSMC_LCD_ADDRESS + lcd_width*2*line_num保证为液晶屏的新一行的开始地址;一行图像的字节为 img_width*2/4;*/
OV2640_DMA_Config(FSMC_LCD_ADDRESS + lcd_width*2*line_num,img_width*2/4); // +(lcd_width*2*(lcd_height-line_num-1))
DCMI_ClearITPendingBit(DCMI_IT_LINE);
///液晶屏的分辨率
uint16_t lcd_width=800, lcd_height=480;
///摄像头采集图像的大小
uint16_t img_width=1280, img_height=800;
倍频器形状:
分频器形状;
选择器形状:
更多回帖