2014-12-23 3 views
8

라이센스 문제로 인해 Kiel IDE에서 이식하기 위해 GNU 도구 체인을 사용하여 포팅 할 응용 프로그램이 있습니다. 성공적으로 설치, 빌드, 플래시 및 장치에서 응용 프로그램을 실행할 수있게되었습니다.STM32 구성되지 않은 경우 WWDG 인터럽트 실행

GNU 쪽의 응용 프로그램은 무한 루프 인 WWDG의 약한 연결된 IRQ 처리기에 갇혀있는 중입니다. 응용 프로그램은 WWDG를 활성화하지 않고 기본적으로 재설정 할 때 비활성화됩니다. 또한 구성 레지스터가 기본 시작 값에 있는지 확인했습니다.

컴파일러 이외의 유일한 차이점은 링커 및 시작 파일입니다. 그러나 두 도구 체인에서 사용되는 시작 파일과 링커 파일은 모두 STM에 의해 생성되는 기본값입니다.

어떤 원인 일 수 있습니까? 나는 여기서 끝내고있다.

stm32f103XX를 사용하면 다른 정보가 도움이되는지 알려 주시기 바랍니다.

EDIT : 아래의 설명을 사용하여 실제로 발생되는 HardFault_Handler라는 사실을 주장 할 수있었습니다. 는 I는 그

GDB BT 도움이 될 수있다 아래 경우 역 추적 출력 포함 가지고있는

0 HardFault_Handler()

1 (신호 처리기 불림)

2 0x720a3de을 ??()에 foo

3 0x80005534()

역 추적 중지 :이 프레임과 동일 이전 프레임

2 가지 임하지만 더 GDB 전문가, 나에게 눈에 띄는 없습니다 (손상된 스택?). 1) foo는 함수가 아닙니다. char의 const 배열입니다. 2) 0x0720a3de는 유효한 메모리 주소가 아닙니다. 플래시 주소 범위는 0x08000000부터 시작합니다.

+1

정말 WWDG입니까? 또 다른'while (1);'은 최적화로 인해 코드를 공유하고있을 수 있습니다. 지도 파일에 해당 주소의 WWDG 만 표시됩니까? –

+0

뭔가가있을 수 있습니다. .elf 파일에서 모든 기본 irq 기호가 동일한 주소를 가리키는 것으로 보입니다. 이는 WWDG_IRQ 이름이 디버거의 ues라는 것을 의미합니다. 나는 irq에 stong link 함수를 추가 할 것이고 그래서 어느 것이 정확히 범인인지 알아낼 수 있습니다. – gettingSmarter

답변

7

D Krueger의 바지 덕분에 감사합니다. HardFault_Handler가 실제로 호출 된 것임을 알 수있었습니다. 따라서이 게시물에서 실수를 저지르는 사람은 HardFault와 같은 범인을 다루기 위해 임시 함수를 작성하여 진정으로 IRQ가 호출되는지 확인합니다. IRQ 호출에 대한 진정한 문제는 memcpy에 의한 잘못된 메모리 액세스입니다. 다음으로 해결할 수있는 방법입니다.

+0

나는 나쁜 메모리 액세스가 "* by memcpy *"가 아니라 오히려 * 당신의 호출 *을 memcpy로 알게 될 것이라고 확신한다. – Clifford

+2

마지막 범인은 필자가 컴파일 할 올바른 옵션과 관련이없는 것으로 밝혀졌습니다. -mthumb 및 -mcpu = cortex-m3 옵션과 연결하는 것을 잊어 버렸습니다. 그래서 잘못된 c 라이브러리와 연결하고있었습니다. – gettingSmarter

4

STM32F3 디스커버리 보드가 STM32Cube F3 라이브러리 (v1.1.0)로 CooCox Coide 1.7.7에서 컴파일되도록 예제를 이식 할 때 OP (명백한 WWDG 인터럽트, 실제로 HardFault_Handler 인터럽트)와 동일한 오류가 발생했습니다. 코드는 아무런 인터럽트도 사용하지 않는 한 정상적으로 실행되었지만 SysTick 타이머 인터럽트를 켜면 HardFault 예외가 발생했습니다.

문제는 내가 stm32f3xx_it.h 및 stm32f3xx_it.c 파일을 프로젝트에 포함하는 것을 게을리했다는 것이 었습니다. 그들의 부재로 인해 컴파일러 경고/오류가 발생하지 않았습니다. &이 컴파일되면 인터럽트가있는 코드가 제대로 실행됩니다.

0

STM32F2XX 프로세서 용으로 STM32CubeMX에서 별도로 생성 한 두 개의 프로젝트를 병합 할 때 매우 유사한 문제가 발생했습니다. 하나의 프로젝트는 이더넷 주변 장치를 사용하는 반면, 다른 프로젝트는 사용하지 않았습니다. 그 하나의 차이점 외에도 두 프로젝트는 동일한 주변 장치 세트를 사용했습니다.

수동으로 파일을 복사하여 두 프로젝트를 통합 한 후 응용 프로그램은 첫 번째 작업을 시작한 후 (처음 인터럽트가 활성화 된 경우) WWDG_IRQHandler로 끝납니다. 먼저 WWDG 레지스터의 WDGA 비트가 실제로 설정되지 않았으므로 WWDG 주변 장치가 비활성화되었음을 확인했습니다. 다음으로 인터럽트 벡터 테이블이 올바르게 초기화되었는지 확인했습니다. 마지막으로 몇 시간 동안 파고 들자 stn32f2xx_it.c에 ETH_IRQHandler 함수를 정의하지 않았기 때문에 이더넷 인터럽트가 기본 핸들러에 의해 처리되어 WWDG_IRQHandler로 자체적으로 마스킹된다는 것을 깨달았습니다. 최적화 때문일 가능성이 큽니다.

0

awilhite과 같은 근본 원인으로 인해이 문제가 발생했습니다. Atollic TrueStudio 8.0.0을 사용하고 있습니다. 나는 STM32F030을위한 프로젝트를 시작하기 위해 그리고 아마도 (수동으로) ADC1_IRQn (NVIC 설정에서 사용 된 IRQ 채널 번호)을 정의하는 stm32f0xx.h가있는 라이브러리 폴더를 추가했다.

은 내가 내 main.c에에 (무효) ADC1_IRQHandler을 구현 (내가 사용 해요로하고 항상 지금까지 근무 - x_IRQn -> x_IRQHandler)

그러나 이일의 좌절 후, 나는 발견

, 내 프로젝트의 startup_stm32f0xx.s는 ADC1_COMP_IRQHandler를 정의합니다.

궁극적으로 내 ADC 인터럽트 처리기가 정의되지 않았으며 ADC가 인터럽트를 생성하면 프로그램이 중단되었습니다 (WWDG 인터럽트).

나는 이것이 나를 다루는 사람처럼 도움이 되었기를 희망한다.하지만 그들은 실제로 자신의 핸들러를 구현했다고 생각하지만 실제로는 그렇지 않다.