2016-11-26 13 views
1

TM4C123GH6PM7에서 작동하도록 SysTick 인터럽트를 얻으려고했습니다. 이것은 피질 m4 기반 마이크로 컨트롤러입니다. Keil 디버거를 사용할 때 Systick 인터럽트가 int NVIC를 보류하고 있지만 핸들러를 실행하지 않음을 알 수 있습니다. 다른 예외는 사용할 수 없으며 PRIMASK 레지스터를 지 웠습니다. 나는 그것이 모든 인터럽트를 마스크 디버거 수 있다는 것을 발견 검색을 많이 후SysTick 인터럽트가 보류 중이지만 실행되지 않습니다. 디버그 인터럽트 마스크 문제가 있습니까?

systck_init LDR R0,=NVIC_ST_CTRL_R 
      LDR R1,=NVIC_ST_RELOAD_R 
      LDR R2,=NVIC_ST_CURRENT_R 
      MOV R3,#0 
      STR R3,[R0] 
      STR R3,[R2] 
      MOV R3,#0x000020 
      STR R3,[R1] 
      MOV R3,#7 
      STR R3,[R0] 
      LDR R3,=NVIC_EN0_R 
      LDR R4,[R3] 
      ORR R4,#0x00008000 
      STR R4,[R3] 
      CPSIE I 
      MOV R3,#0x3 
      MSR CONTROL,R3 

: 아래의 코드는 내가 인터럽트를 초기화하는 방법입니다. 이것을 제어하는 ​​비트는 디버그 중지 상태 및 제어 레지스터라는 레지스터에 있습니다. 비록 디버거에서 보거나 디버그 명령을 사용하여 읽기/쓰기를 할 수는 없지만.

Keil에서 제공 한 Startup.s을 사용했고 벡터/레이블이 정확하다고 알 수 있습니다.

그리고 알고 있습니다. 왜 어셈블리에서 모든 것을 해내 느냐.

모든 아이디어는 크게 감사하겠습니다. 처음 :

답변

0

를 올리기는 내가 Systick 인터럽트 INT NVIC는

Systick은 어느 쪽도 사용하지 않았다 출원이나 NVIC에서 레지스터 비트를 보류되는 것을 볼 수 있습니다. 이는 MCU 코어 자체와 밀접하게 연결되는 특별한 방법입니다.

다시로드 값으로 0x20을 사용하면 위험 할 수도 있습니다. 다음 인터럽트가 너무 일찍 트리거되므로 Systick Handler에서 "멈춤"할 수 있습니다. Cortex M4는 인터럽트 핸들러에 들어가고 나가기 위해 적어도 12 클럭이 필요하다는 것을 기억하십시오. 이것은 32 사이클 중 24 사이클을 소모합니다.

추가 힌트 : 마지막 명령은 SP에 사용 된 레지스터를 MSP에서 PSP로 변경하지만 PSP를 먼저 설정하는 코드는 표시되지 않습니다. Hardfault_Handler를 구현하십시오. 코드가이를 유발할 가능성이 큽니다.

+0

도움을 주셔서 감사합니다! 만약 Systick이 NVIC을 통해 결합되지 않았다면 예외이므로 하드웨어 인터럽트에 의해 선점 될 수 없습니까? 모든 코드를 게시하지 않아서 죄송합니다. 많은 코드가 있습니다. 하지만 PSP를 다른 곳에서 설정합니다. 0x20을 사용하여 핸들러로 곧바로 건너 뜁니다. 오늘 Keil 시뮬레이터를 사용하고 핸들러가 올바르게 실행되지만 여전히 회로 디버거와 함께 작동하지 않습니다. – MHilton

+0

'SCB'에 'SHP'레지스터를 사용하여 Systick (및 다른 시스템 인터럽트)에 우선 순위를 설정할 수 있습니다. –

+0

코드를 빨리 읽었을뿐입니다 (코드에 주석 달기!) 카운터를 시작하기 전에 카운터를 지우지 않는 것으로 보입니다. 나는 카운터 값이 시작시에 정의되지 않았다고 생각한다. (그러나 에뮬레이터는 그것을 0으로 만들 수도있다.) 카운터가 0x21이고 다시로드를 0x20으로 설정하면 해고되기 전에 다시로드 할 때까지 기다려야합니다. 즉, SysTick 카운터가 24 비트에 불과하다는 것은 아닙니다. –