在线时间396 小时
UID3313981
注册时间2019-7-22
NXP金币2896
TA的每日心情 | 开心 昨天 10:45 |
---|
签到天数: 727 天 连续签到: 1 天 [LV.9]以坛为家II
金牌会员
 
- 积分
- 4593
- 最后登录
- 2025-8-15
|
下面来一个摄像头与屏一个显示的分享,使用的OV7670摄像头模块.
模块参数:
1.感光阵列640X480。
2.10电压2.5Vto3.0V(内部LDO给核供电1.8V)。
3.功耗工作60mW/15fpsVGAYUV。
4.休眠<20uA。
5.温度操作-30°C到70°℃。
6.稳定工作0°C到50°℃。
7.光学尺寸1/6"。
8.视场角25°。
9.帧率30fpsVGA,灵敏度1.3V/(Lux-sec)。
10.信噪比46 dB.
11.动态范围52dB
12.浏览模式逐行。
13.电子曝光1行到510行14.像素面积3.6umx3.6um。15.暗电流12mV/s at 60°C.
借一个图:
连接在947开发板的图:
刚开始出现的画面不正常,还需要注意几个地方。
开发板原图:
切换到下图:
也就是把SJ16,SJ26,SJ27原本在A位置的切换到B位置处。
这个在官方是可以找到解释的,我也是参考这个方向去进行弄的。
主函数代码:
- smartdma_camera_param_t smartdmaParam; /*!< SMARTDMA function parameters. */
- volatile uint8_t g_camera_buffer[480*320*2];
- volatile uint8_t g_samrtdma_stack[32];
- volatile uint32_t g_camera_complete_flag=0;
- static lcd_impl_flexio_t s_lcd_impl;
- static st7796_lcd_t s_lcd = {
- .config =
- {
- .direction = ST7796_DIR_0,
- .pix_fmt = ST7796_RGB565,
- .bgr_mode = 1,
- .inversion = 1,// 颜色反相设置
- .mirrored = 1,
- },
- .cb =
- {
- .reset_cb = lcd_impl_reset,
- .write_cmd_cb = lcd_impl_write_cmd,
- .write_data_cb = lcd_impl_write_data,
- },
- .user_data = &s_lcd_impl,
- };
- /*******************************************************************************
- * Code
- ******************************************************************************/
- static void SmartDMA_camera_callback(void *param){
- PRINTF("11\r\n");
- g_camera_complete_flag = 1;
- }
- /*!
- * @brief Main function
- */
- int main(void)
- {
- char ch;
- uint32_t address;
- /* Init board hardware. */
- /* attach FRO 12M to FLEXCOMM4 (debug console) */
- CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- /* init I2C0*/
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM7);
- CLOCK_EnableClock(kCLOCK_LPFlexComm7);
- CLOCK_EnableClock(kCLOCK_LPI2c7);
- CLOCK_SetClkDiv(kCLOCK_DivFlexcom7Clk, 1u);
-
- BOARD_InitBootPins();
- BOARD_InitBootClocks();
- BOARD_InitDebugConsole();
- Ov7670_Init();
- g_camera_complete_flag=0;
- PRINTF("hello world.\r\n");
- INPUTMUX_Init(INPUTMUX0);
- INPUTMUX_AttachSignal(INPUTMUX0, 0, kINPUTMUX_GpioPort0Pin4ToSmartDma);//P0_10/EZH_CAMERA_VSYNC
- INPUTMUX_AttachSignal(INPUTMUX0, 1, kINPUTMUX_GpioPort0Pin11ToSmartDma);//P0_11/EZH_CAMERA_HSYNC
- INPUTMUX_AttachSignal(INPUTMUX0, 2, kINPUTMUX_GpioPort0Pin5ToSmartDma);//P0_14/EZH_CAMERA_PCLK
- /* Turn off clock to inputmux to save power. Clock is only needed to make changes */
- INPUTMUX_Deinit(INPUTMUX0);
- for(uint32_t i=0;i<480*320;i++){
- g_camera_buffer[2*i]= 0x0;
- }
- lcd_impl_init(&s_lcd_impl);
- st7796_lcd_init(&s_lcd);
- st7796_lcd_load(&s_lcd, (uint8_t *)g_camera_buffer, 0, 320-1, 0, 480-1);
- SMARTDMA_InitWithoutFirmware();
- SMARTDMA_InstallFirmware(SMARTDMA_CAMERA_MEM_ADDR,s_smartdmaCameraFirmware,
- SMARTDMA_CAMERA_FIRMWARE_SIZE);
- SMARTDMA_InstallCallback(SmartDMA_camera_callback, NULL);
- NVIC_EnableIRQ(SMARTDMA_IRQn);
- NVIC_SetPriority(SMARTDMA_IRQn, 3);
-
- smartdmaParam.smartdma_stack = (uint32_t*)g_samrtdma_stack;
- smartdmaParam.p_buffer = (uint32_t*)g_camera_buffer;
- SMARTDMA_Boot(kEZH_Camera_320480_Whole_Buf, &smartdmaParam, 0x2);
- while (1)
- {
- while(g_camera_complete_flag == 0);
- st7796_lcd_load(&s_lcd, (uint8_t *)g_camera_buffer, 0, 320-1, 0, 480-1);
- g_camera_complete_flag=0;
- }
- }
复制代码 这里有一点要注意一下,刚开始图像显示是反相的,需要更改一下程序,把
- static st7796_lcd_t s_lcd = {
- .config =
- {
- .direction = ST7796_DIR_0,
- .pix_fmt = ST7796_RGB565,
- .bgr_mode = 1,
- .inversion = 1,// 颜色反相设置
- .mirrored = 1,
- },
- .cb =
- {
- .reset_cb = lcd_impl_reset,
- .write_cmd_cb = lcd_impl_write_cmd,
- .write_data_cb = lcd_impl_write_data,
- },
- .user_data = &s_lcd_impl,
- };
复制代码 更改为上图的,就可以正常显示了,如果没有改会出现下图现象。
如果更改后,图像就正常了,出现下图显示。
结束。
|
|