使用DCMI接口,但在硬故障前仅接收0xA603A603

使用DCMI接口,但在硬故障前仅接收0xA603A603,c,stm32,C,Stm32,在我的硕士论文中,我尝试使用STM32H742通过DCMI接收数据。作为图像传感器,我使用的是NOIV2SN1300A。它通过10条数据线发送数据,这些数据不同(因此并不总是0xA603A603)。为了减少数据量,我启动了装箱和二次抽样 我正在使用DMA将DCMI接收到的数据传输到地址为0x24000000的内部SRAM中。在几次电报(of0xA603A603)后,uC进入硬故障和无限循环。我不知道为什么会发生这种错误。以下是我的DMA和DCMI配置: /* DCMI DMA Init *

在我的硕士论文中,我尝试使用STM32H742通过DCMI接收数据。作为图像传感器,我使用的是NOIV2SN1300A。它通过10条数据线发送数据,这些数据不同(因此并不总是
0xA603A603
)。为了减少数据量,我启动了装箱和二次抽样

我正在使用DMA将DCMI接收到的数据传输到地址为
0x24000000
的内部SRAM中。在几次电报(of
0xA603A603
)后,uC进入硬故障和无限循环。我不知道为什么会发生这种错误。以下是我的DMA和DCMI配置:

   /* DCMI DMA Init */

   /* DCMI Init */

   hdma_dcmi.Instance = DMA1_Stream0;

   hdma_dcmi.Init.Request = DMA_REQUEST_DCMI;

   hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;

   hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;

   hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE;

   hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;//WORD;

   hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

   hdma_dcmi.Init.Mode = DMA_DOUBLE_BUFFER_M0;

   hdma_dcmi.Init.Priority = DMA_PRIORITY_VERY_HIGH;

   hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

   hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

   hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE;

   //hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;

   if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK)

   {

     Error_Handler();

   }

 

   __HAL_LINKDMA(hdcmi,DMA_Handle,hdma_dcmi);

 

   HAL_NVIC_SetPriority(DCMI_IRQn, 0, 0);

   HAL_NVIC_EnableIRQ(DCMI_IRQn);

 

   HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);

   HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
知道为什么会发生这种错误吗?正如我所说,我接收数据,我确信传感器发送了可行的数据(因此还有其他数据),但在硬故障之前,我只能通过DCMI获得相同的数据。在当前设置下,我传输64个电报,然后出现硬故障。此外,我禁用了SRAM1的缓存,因为存在有关缓存/DMA/CPU一致性的问题。我不太确定如何继续,因为在我看来这是一个设置错误。也许是DCMI超支了

注意:上面的代码实际上不是按此顺序出现的。这只是相关部分(至少从我预期的相关部分)


我找到了其他关于这个问题的帖子,错误是系统时钟慢。由于我的系统时钟为475 MHz,HCLK3时钟(DCMI用于采样)为237.5 MHz,我可以排除时钟问题。数据表显示HCLK时钟必须比DCMI时钟快2.5倍(DCMI时钟由图像传感器设置为62 Mhz)。

首先确定高频的来源。如果您不知道如何安装具有内置HF插件的Atolic studio。它将为您提供所需的所有信息中断源似乎是中断3,即RTC_WKUP_IRQn。我是按照“调试ARM Cortex-M硬故障”中描述的方法进行的。但老实说,RTC_WKUP_IRQn对meit来说毫无意义,因为所有没有单独处理程序的中断都设置为默认处理程序。我问是什么引起了它。这是什么样的高频。到底准确与否?etc等调用似乎来自WWDG_IRQHandler。我还尝试使用故障分析器(使用STM32CubeIDE),但故障分析器似乎没有检测到任何故障。
 hdcmi.Instance = DCMI;

 hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;

 hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;   //Todo:???

 hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;

 hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;

 hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;

 hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_10B;

 hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;

 hdcmi.Init.ByteSelectMode = DCMI_BSM_OTHER;//DCMI_BSM_ALL;

 hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD;

 hdcmi.Init.LineSelectMode = DCMI_LSM_ALL;

 hdcmi.Init.LineSelectStart = DCMI_OELS_ODD;

 if (HAL_DCMI_Init(&hdcmi) != HAL_OK)

 {

   Error_Handler();

 }
uint32_t DataSizeImageSensor = 0xB160;
DMA_BUFFER uint32_t AddressFrameBuffer[0xB160];
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)AddressFrameBuffer, DataSizeImageSensor);
void MPU_Config (void)
{
  MPU_Region_InitTypeDef MPU_InitStruct;

  /* Disable the MPU */
  HAL_MPU_Disable();

  /* Configure the MPU attributes for SDRAM */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x24000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;        //Cache is incoherent with CPU for DMA usage
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /* Enable the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}