STM32 하드웨어 디버깅 도중 Delay질문

1607 단어 ARM
프로그램이 LCD를 초기화하는 과정에서 끊기고 하드웨어 디버깅을 통해 Delayms() 함수, 정의로 이동Delayus의 매크로 정의 함수:
#define Delay_ms(x) Delay_us(1000*x)//  ms

즉, 지연 x 단위 ms, Delayus() 함수 정의:
void Delay_us(__IO u32 nTime)
{ 
    TimingDelay = nTime;    
    while(TimingDelay != 0);
}

매개변수
TimingDelay가 0이 아니면 여기는while 사순환입니다. 연구를 통해 TimingDelay 매개 변수는 시스템 타이머 인터럽트 중 점차적으로 감소해야 한다는 것을 발견했습니다. 즉,
/**@filename stm32f10x_it.c 
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
    TimingDelay_Decrement();
}

함수.
TimingDelay_Decrement() 정의는 다음과 같습니다.
/*-------------------------------------------------------------------------------
    :TimingDelay_Decrement
    :      0  
    : 
    : 
      :       SysTick_Handler()   
---------------------------------------------------------------------------------*/
void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00)
    { 
    TimingDelay--;
    }
}

프로그램이 끊긴 이유는 끊긴 거예요.
함수 SysTickHandler(void)에 TimingDelay에 대한 체감(호출 함수 TimingDelay Decrement()가 없어서 사순환을 벗어나지 못합니다.
또 주의해야 할 것은
SysTick을 사용하기 전에 중단이 가능하도록 초기화해야 합니다.
void SysTick_Init(void)
{
     // SystemFrequency / 1000       1ms    
     // SystemFrequency / 100000     10us    
     // SystemFrequency / 1000000    1us    

    if (SysTick_Config(SystemCoreClock / 1000000))    // 1us ST3.5.0   
    { 
        /* Capture error */ 
        while (1);
    }
}
끊을 수 없으면 타이머 중단 함수에 들어갈 수 없고while 순환에서 끊길 수 있습니다.

좋은 웹페이지 즐겨찾기