2017-11-20 21 views
0

잠자기 모드에서 시스템에 문제가 있습니다.잠자기 모드에서 깨우기 방해 받기

현재 내 MCU가 라디오를 통해 주기적으로 메시지를 보내는 라디오 칩을 구동 중이므로 라디오 칩에서 메시지를 보낼 때 MCU를 절전 모드로 설정합니다.

하지만 라디오 칩이 데이터를 전송할 때 인터럽트가 발생하고 MCU가 깨어나 데이터 전송이 중단됩니다. 나는 현재 시스템이 irq를 "무작위로"실행할 수있는 많은 작업으로 실행되기 때문에 어느 시스템이 현재 깨어나고있는지를 알지 못한다. 그러나 무선 칩이 전송 될 때 "무작위"irq 중 아무 것도 작동하지 않는다. 메세지.

잠자기 모드에서 사용 된 __WFI()를 중단하려고하면 호출 스택이 이미 새 데이터로 새로 고쳐지고 마지막 실행 된 명령을 볼 수 없습니다.

어떤 irq가 잠자기 시스템을 깨우고 있는지 확인하는 방법을 알고 있습니까?

도움 주셔서 감사합니다.

답변

1

깨우기 직후 NVIC->ISPR[x]SCB->ICSR 레지스터를 검사하십시오. 당신이 핸들러가 실행되기 전에 중단 할 수없는 경우 (당신은 GCC를 사용하지 않는 경우 또는 이에 상응하는 무엇인가),

uint32_t ispr0, ispr1, ispr2, icsr; 
#define __WFI() ({ \ 
    uint32_t primask = __get_PRIMASK(); \ 
    __disable_irq(); \ 
    asm volatile("wfi"); \ 
    ispr0 = NVIC->ISPR[0]; \ 
    ispr1 = NVIC->ISPR[1]; \ 
    ispr2 = NVIC->ISPR[2]; \ 
    icsr = SCB->ICSR;  \ 
    __set_PRIMASK(primask); \ 
}) 

편안 후 내용을 검사 할 수 있도록이 매크로 __WFI()를 교체합니다. ST Cortex-M3 프로그래밍 매뉴얼에서 레지스터 이름을 가져 왔으므로이 프로세스는 다른 코어와 비슷해야합니다.