stm32-7SysTicks

8349 단어 stm32

stm32-7SysTicks


1. 시스템 타이머 관련 구성


우선 일부 코드를 추적하고, 다음은 타이머를 초기화하는 함수
    /*   SysTick 10ms    */
    SysTick_Init();

bsp 로 추적SysTicks.c 파일에서 그에 대한 정의
/**
  * @brief         
  * @param  
  * @retval 
  * @attention:         ,          
  */
void SysTick_Init(void)
{
    /*         
     * SystemFrequency / 1000    1ms    
     * SystemFrequency / 100000  10us    
     * SystemFrequency / 1000000 1us    
     */
//  if (SysTick_Config(SystemFrequency / 100000))   // ST3.0.0   
    if (SysTick_Config(SystemCoreClock / 100000))   // ST3.5.0   
    { 
        /* Capture error */ 
        while (1);
    }
        //          
    SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}

여기서 함수 SysTickConfig(SystemCoreClock/100000) 구성 중단 간격, 구성 실패 반환 1, corecm3.h중:
/* #####################    SysTick function  ######################## */

#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)

/**
 * @brief  Initialize and start the SysTick counter and its interrupt.
 *
 * @param   ticks   number of ticks between two interrupts
 * @return  1 = failed, 0 = successful
 *
 * Initialise the system tick timer and its interrupt and start the
 * system tick timer / counter in free running mode to generate 
 * periodical interrupts.
 * ticks         ,    =ticks*    
 */
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{   //           ,ticks  <=fffffff
    if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
    // ticks-1    RELOAD, ticks-1  0 ticks
    SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
    //           SysTick      
    NVIC_SetPriority (SysTick_IRQn, (1<<__nvic_prio_bits class="hljs-number">1);  /* set Priority for Cortex-M0 System Interrupts */
    //       STK_CTRL:   、    、  
    SysTick->VAL   = 0;                                   /* Load the SysTick Counter Value */ 
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;               
    /* Enable SysTick IRQ and SysTick Timer */
    return (0);                                             /* Function successful */
}

#endif
/* ###################    Reset function  ############################# */

이 커널의 함수에서 비트 지시 매크로와 비트 차단 매크로를 사용했습니다. 먼저 코드를 올리십시오. 이것은corecm3.h에서 SysTick 레지스터에 대한 정의
/* SysTick Control / Status Register Definitions */
#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */
#define SysTick_CTRL_COUNTFLAG_Msk         (1ul << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */

#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */

#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */

#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */

/* SysTick Reload Register Definitions */
#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */

/* SysTick Current Register Definitions */
#define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */
#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFul << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */

레지스터 비트 표시 매크로: SysTickxxx_Pos, 매크로가 확장되면 xxx가 해당 레지스터에 있는 위치입니다(예: SysTick 클록 소스를 제어하는 SysTick).CTRL_CLKSOURCE_Pos, 매크로 전개는 2입니다. 이 레지스터 위치는 바로 레지스터 STKCtrl의 Bit2
레지스터 비트 차단 매크로: SysTickxxx_Msk, 매크로 확장은 xxx의 비트를 모두 1로 설정한 후 SysTickxxx_Pos 비트SysTick 클록 소스를 제어하는 SysTickCTRL_CLKSOURCE_sk, 宏展 (1ul << SysTick Ctrl CLKSOURCE Pos) 로, 무기호 장정형 수치 (ul) 1을 왼쪽으로 두 자리 옮기면 Bit2: CLKSOURCE 비트만 1, 다른 비트는 0 의 수치를 얻을 수 있습니다. 이런 수치는 비트 조작과 맞물려 (비트와), | (비트와 맞물려) 레지스터의 일부 위치를 쉽게 수정할 수 있습니다.만약 CLKSOURCE를 제어하는 데 네 개의 레지스터 위치가 필요하다면, 이 매크로는 (0xf ul < SysTick CTRL CLKSOURCE Pos) 로 바뀌어야 한다. 그러면 CLKSOURCE의 네 자리가 1로 설정된 값을 얻을 수 있고, 이 매크로의 매개 변수는 이렇게 확정된다.

2. 똑딱이 타이머를 이용하여 정확한 시간 지연 실현


드롭 타이머 시간 정밀 지연 함수 사용 정보:
/**
  * @brief      us    ,10us     »
  * @param  
  * @arg nTime: Delay_us( counts )     counts * 10us
  * @retval     TimingDelay     
  */
void Delay_us(__IO u32 nTime)
{ 
    TimingDelay = nTime;    
    //       
    SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;
    //  TimingDelay  0,    
    while(TimingDelay != 0);
}

호출이 필요한 TimingDelay 자감 함수 끊기
/**
  * @brief         
  * @param  
  * @retval 
  * @attention    SysTick      SysTick_Handler()  
  */
void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00)
    { 
        TimingDelay--;
    }
}

브레이크 함수 SysTickHandler(), stm32f10xit.h에서 사용자가 작성하고 끊길 때마다 TimingDelayDecrement();TimingDelay=0
/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
    TimingDelay_Decrement();    
}

주의
한 파일에서 다른 파일의 함수를 호출하려면 이 파일에서 extern으로 설명해야 합니다. 그렇지 않으면 오류가 발생합니다.
End

좋은 웹페이지 즐겨찾기