硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1418|回复: 6
收起左侧

[摄像头] 【问题】使用STM32H7+OV5640+DCMI+DMA, 使用SDRAM做显存,但是DMA中断只进入一次

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2022-5-28 21:56:56 | 显示全部楼层 |阅读模式
使用STM32H743, 配合DCMI+LTDC+SDRAM, SDRAM已经能读写,地址0xD0000000, LCD也可以点亮,现在的问题是摄像头获取的数据无法放入SDRAM, 使用串口打印DCMI->DR有数据变化,证明摄像头已经正常输出图像数据,但是执行HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)LCD_FB_START_ADDRESS,48300),DMA中断只进入一次,显存数据也没有刷新,lcd屏幕显示花屏,应该是DMA没有正常工作...
MPU已经设置启用,以下是相关设置:有大神能指点一下是什么问题吗?
image.png

image.png

image.png

image.png

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#define Bank2_SDRAM_ADDR    ((uint32_t)(0xD0000000)) //SDRAM¿aê¼μØÖ·

uint32_t pSDRAM[2];
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
        OV5640_IDTypeDef OV5640_Camera_ID;
  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
  SCB_EnableDCache();

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_FMC_Init();
  MX_USART1_UART_Init();
  MX_DCMI_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  MX_LTDC_Init();
  /* USER CODE BEGIN 2 */


  HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)LCD_FB_START_ADDRESS,38400);










image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2022-5-29 17:10:05 | 显示全部楼层
二次开启有点注意事项,试试我们这个:

https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

image.png
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-5-30 00:08:36 | 显示全部楼层
eric2013 发表于 2022-5-29 17:10
二次开启有点注意事项,试试我们这个:

https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

你好,我看例程里面在DMA中断里面关闭了DCMI, CAM_STOP(); 但是别的地方没有在重新开启,那DCMI岂不是不工作了吗?我看的是V7-030 例程,求大神指点~

void DMA1_Stream7_IRQHandler(void)
{
        /* ′«êäíê3éÖD¶Ï */
        if((DMA1->HISR & DMA_FLAG_TCIF3_7) != RESET)
        {
               
                /* 1رÕéãÏñ */
                CAM_Stop();
                g_tCam.CaptureOk = 1;                /* ±íê¾DMA′«êä½áêø */

                /* Çå3y±êÖ¾ */
                DMA1->HIFCR = DMA_FLAG_TCIF3_7;
        }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2022-5-30 15:45:03 | 显示全部楼层
Eddygan 发表于 2022-5-30 00:08
你好,我看例程里面在DMA中断里面关闭了DCMI, CAM_STOP(); 但是别的地方没有在重新开启,那DCMI岂不是不 ...

image.png
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-5-31 14:36:21 | 显示全部楼层

我发现一个说STM32CUBEmx的重大BUG, 使用cubemx自动生成的代码,DCMI_Init是放在DMA_Init之前的,这样的代码会产生问题,就是DMA只能传输1次,之后就没有数据了,之前调试一直就是LTDC画面显示静止,查了LTDC,DMA,SDRAM的代码都没问题,死活就是数据不正常,今天把初始化的顺序调换了一下之后,LCD画面竟然就有图像运动了!!!看来DMA的时钟要先于外设的时钟开启才行...!
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-5-31 16:04:36 | 显示全部楼层

我发现用cubeMX的一个bug,用cubeMX自动生成的初始化代码里面,DCMI_INITZ在DMA_INIT之前,这样会有问题,之前调试每次DMA只会传输一次,今天调整了一下初始化的顺序,DMA工作竟然正常了!!!DMA的初始化要放在外设初始化之前,困扰好几天的为题终于查到了……!!!
cubeMX DCMI_DMA初始化BUG.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2022-5-31 18:14:31 | 显示全部楼层
Eddygan 发表于 2022-5-31 16:04
我发现用cubeMX的一个bug,用cubeMX自动生成的初始化代码里面,DCMI_INITZ在DMA_INIT之前,这样会有问题 ...

估计又是DMA时钟还没有开启就去配置DMA了,你方便的话,具体看下是不是这个问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 19:27 , Processed in 0.187120 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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