내 생각에 CPU와 DMA 컨트롤러 사이의 버스는 32 비트 액세스 작업 만 허용합니다.
하드 장애 인터럽트 내부에서 인쇄하거나 메모리로 덤프 할 수 있습니다.
인쇄하거나 (덤프해야하는) CPU는 특히 문제가 무엇인지 더 잘 보여줄 수있는 레지스터입니다. 예를 들어
:
void HardFault_Handler(unsigned int* hardfault_args)
{
printf("R0 = 0x%.8X\r\n",hardfault_args[0]);
printf("R1 = 0x%.8X\r\n",hardfault_args[1]);
printf("R2 = 0x%.8X\r\n",hardfault_args[2]);
printf("R3 = 0x%.8X\r\n",hardfault_args[3]);
printf("R12 = 0x%.8X\r\n",hardfault_args[4]);
printf("LR = 0x%.8X\r\n",hardfault_args[5]);
printf("PC = 0x%.8X\r\n",hardfault_args[6]);
printf("PSR = 0x%.8X\r\n",hardfault_args[7]);
printf("BFAR = 0x%.8X\r\n",*(unsigned int*)0xE000ED38);
printf("CFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED28);
printf("HFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED2C);
printf("DFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED30);
printf("AFSR = 0x%.8X\r\n",*(unsigned int*)0xE000ED3C);
printf("SHCSR = 0x%.8X\r\n",SCB->SHCSR);
while (1);
}
아니면 단순히 하드 오류 인터럽트 내부 중지하고 IDE에서 그 레지스터를 볼 수 있습니다 ... STM32F4 데이터 시트에서
:
The MPU attributes don't affect DMA data accesses to the memory/peripherals address
spaces. therefore, in order to protect the memory areas against inadvertent DMA accesses,
the MPU must control the SW/CPU access to the DMA registers.
DMA 레지스터에 액세스하는 것과 관련하여 몇 가지 제한 사항이있는 것처럼 보입니다.
대답은 PaulR의 의견에 따라 영업 확장 :
문서 파고 그 이유는 DMA AHB 슬레이브 프로그래밍 인터페이스의 제한 사항입니다 확인합니다.
DM00031020 챕터 10.2 DMA 주요 기능 분명히 "32 비트 액세스 만 지원하는 AHB 슬레이브 프로그래밍 인터페이스"라고 쓰여 있습니다. 반대로, 예를 들어. DMA2D는 8 비트, 16 비트 및 32 비트 액세스를 지원하므로 바이트 단위로 액세스 할 수 있으며 버스 오류를 일으키지 않습니다.
하드 장애 인터럽트 내부에 인쇄물을 놓거나 로컬 어레이에 덤프 할 수 있습니다. 인쇄 (또는 덤프)해야 할 것은 특히 CPU가 문제의 원인을 더 잘 보여줄 수있는 레지스터입니다. 내 생각에 - CPU와 DMA 컨트롤러 간의 버스는 32 비트 액세스 작업 만 허용합니다. – goodvibration
고마워, 제안. 버스 결함 상태 레지스터는 DMA 영역이 시작된 후 1 바이트의 정렬되지 않은 주소 인 0x40026401에서 정확한 버스 오류를 가리 킵니다. 정렬되지 않은 방식으로 읽는 것이 불가능한 것처럼 보입니다. 다른 모든 주변 장치가이 접근 방식을 받아들이므로 이유를 이해하려고합니다. – jedzej
좋아요, 나는 답을 올렸습니다. 이제 DMA에 관한 정보를 데이터 시트에서 추가했습니다. – goodvibration