发 帖  
原厂入驻New
[问答] 使用HAL库的DCMI接口问题
676 STM32 DCMI DMA
分享
背景摄像头模块: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配置如图


一些关键代码如下
  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. <!--StartFragment-->
  17. ov7670_Stop();<!--EndFragment-->  

  18.     /* USER CODE END WHILE */

  19.     /* USER CODE BEGIN 3 */
  20.   }
复制代码



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

请问这个问题如何解决?
2

DCMI的DMA配置

DCMI的DMA配置
2020-1-15 16:34:23   评论 分享淘帖 邀请回答

相关问题

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

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

我要提问
关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表