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