单片机/MCU论坛
直播中

高磊

4年用户 4经验值
擅长:嵌入式技术 接口/总线/驱动 处理器/DSP 控制/MCU MEMS/传感技术
私信 关注
[问答]

使用HAL库的DCMI接口问题

背景摄像头模块:ov7670

开发板: Nucleo-H743ZI
IDE:STM32cube
目的:每秒自动拍照一张进行分析,分析过程暂时不考虑,至少要在ram中看到图像数据

情况

配置采用cubeMX进行,采用了HAL库。主频480MHz,MCO0输出24MHz连接XCLK,输出采用QVGA RGB565格式。I2C1与SCCB接口进行通讯,DCMI连接其它对应接口。开启了DCMI的中断以及DMA,DMA配置了FIFO(也试过不开FIFO)。在程序中只是通过断点对数据进行查看,没有其它处理。HAL_DCMI_VsyncEventCallback以及HAL_DCMI_LineEventCallback的中断也没有进行任何处理。


DMA配置如图
[img=110,0][/img]

一些关键代码如下
  1. void ov7670_Stop(void) {
  2.   vlines = 0;
  3.   HAL_DCMI_Stop(&hdcmi);
  4.   HAL_Delay(30);
  5. }

  6. void ov7670_Start(uint32_t data) {
  7.   HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, data, 320*240);
  8. }

  9. void ov7670_Init() {
  10.   ov7670_Stop();
  11.   ov7670_Write_Reg(0x12, 0x80);  // RESET
  12.   HAL_Delay(30);
  13.   for(int i = 0; ov7670_reg[i][0] != REG_BATT; i++) {
  14.     ov7670_Write_Reg(ov7670_reg[i][0], ov7670_reg[i][1]);
  15.     HAL_Delay(1);
  16.   }
  17. }
  1. uint8_t framebuf[320*240*2];

  2. main() {
  3.   ov7670_Init();
  4.   for (int i = 0; i <320*240*2; i++)
  5.   {
  6.   framebuf[i] = 0xff;
  7.   }
  8.   /* USER CODE END 2 */

  9.   /* Infinite loop */
  10.   /* USER CODE BEGIN WHILE */
  11.   while (1)
  12.   {
  13.           HAL_Delay(1000);
  14.                   ov7670_Start((uint32_t) framebuf);
  15.                   HAL_Delay(300);


  16. ov7670_Stop();  

  17.     /* USER CODE END WHILE */

  18.     /* USER CODE BEGIN 3 */
  19.   }



问题
目前摄像头的寄存器配置没有问题,甚至可以从dcmi的DR寄存器读取到32字节的数据。但是dcmi会出现0x41错误,也就是DMA会出现overrun。试过降低摄像头频率,也没有作用。

请问这个问题如何解决?
  • DCMI的DMA配置

回帖(1)

高磊

2020-1-17 15:39:12
感谢这位博主的帮助https://www.cnblogs.com/guanglun/p/12011441.html,通过调换MX_DCMI_Init放到MX_DMA_Init的位置就行了。真是对cubeMX无语。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分