2017-11-22 3 views
0

STM32F4에서 주변 장치 덤프를 구현 중입니다. 대부분의 주변 장치 레지스터를 바이트 단위로 읽고 UART 인터페이스를 통해 플러시합니다. 거의 모든 주변 장치에서 잘 작동합니다.STM32F4에서 정렬되지 않은 DMA 레지스터 주소를 읽을 때 하드 폴

바이트 단위로 DMA1 (0x40026000 ...) 또는 DMA2 (0x40026400 ...) 레지스터를 읽으려고하면 0x40026401에서 정확한 버스 오류로 실패합니다.

4 바이트 단어로 정렬하려고하면 잘 동작합니다.

내 질문은 : 왜 그것은 SCB, RCC, SPI, UART, TIM 및 다른 것들과 같은 다른 주변 장치가 모두 그것을 할 수 있도록 DMA에서 실패합니까? 특별한 이유가 있습니까?

+0

하드 장애 인터럽트 내부에 인쇄물을 놓거나 로컬 어레이에 덤프 할 수 있습니다. 인쇄 (또는 덤프)해야 할 것은 특히 CPU가 문제의 원인을 더 잘 보여줄 수있는 레지스터입니다. 내 생각에 - CPU와 DMA 컨트롤러 간의 버스는 32 비트 액세스 작업 만 허용합니다. – goodvibration

+0

고마워, 제안. 버스 결함 상태 레지스터는 DMA 영역이 시작된 후 1 바이트의 정렬되지 않은 주소 인 0x40026401에서 정확한 버스 오류를 가리 킵니다. 정렬되지 않은 방식으로 읽는 것이 불가능한 것처럼 보입니다. 다른 모든 주변 장치가이 접근 방식을 받아들이므로 이유를 이해하려고합니다. – jedzej

+0

좋아요, 나는 답을 올렸습니다. 이제 DMA에 관한 정보를 데이터 시트에서 추가했습니다. – goodvibration

답변

1

내 생각에 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 비트 액세스를 지원하므로 바이트 단위로 액세스 할 수 있으며 버스 오류를 일으키지 않습니다.

+0

매뉴얼에서 인용문을 읽는 방법, DMA *에 의한 액세스 *는 MPU의 영향을받지 않습니다.단락은 OP 문제와 관련이 없다고 생각합니다. CPU에서 DMA 제어 레지스터를 읽는 중입니다. – PaulR

+0

@PaulR : 견적의 첫 번째 부분에 대해 - 예. 그러나 인용문의 두 번째 부분은 특별히 'DMA 레지스터에 대한 SW 액세스'를 인용합니다 (인용문을 인용 할 수있는 경우). – goodvibration

+1

[참조 설명서] (http://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files) /DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf)는 초기 추측을 확인합니다. "AHB 종속 포트는 DMA 컨트롤러를 프로그래밍하는 데 사용됩니다 (32 비트 액세스 만 지원함)." – PaulR

관련 문제