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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
error: #136: struct ""has no field "AHBSTR"RL-TCPNet을 이식할 때 공식 이더넷 DP83848칩의 구동을 추가하여 컴파일할 때 계속 오류를 보고하였다 error: #136: struct ""has no field "AHBSTR" 사용한 것은 처음에 #...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.