1.systick時鐘來源
2.SysTick庫函數
3.源碼
/**
*@}
*/
/** @defgroup SysTick_clock_source
*@{
*/
#define SysTick_CLKSource_HCLK_Div8? ? ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK? ? ? ? ?((uint32_t)0x00000004)
#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \
((SOURCE) == SysTick_CLKSource_HCLK_Div8))
/**
*@brief? Configures the SysTick clocksource.
*@param? SysTick_CLKSource: specifies theSysTick clock source.
*? ?This parameter can be one ofthe following values:
*? ? ?@argSysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clocksource.
*? ? ?@arg SysTick_CLKSource_HCLK:AHB clock selected as SysTick clock source.
*@retval None
*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
/*##################################? ?SysTick function ############################################ */
#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)
/**
*@brief? Initialize and start the SysTickcounter 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.
*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk)? return (1);? ? ? ? ? ? /* Reload value impossible */
SysTick->LOAD? = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;? ? ? /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1VAL? ?= 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
#ifdefSYSCLK_FREQ_HSE
uint32_t SystemCoreClock? ? ? ? ?= SYSCLK_FREQ_HSE;? ? ? ? /*!#elif defined SYSCLK_FREQ_24MHz
uint32_t SystemCoreClock? ? ? ? ?= SYSCLK_FREQ_24MHz;? ? ? ? /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock? ? ? ? ?= SYSCLK_FREQ_36MHz;? ? ? ? /*!#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock? ? ? ? ?= SYSCLK_FREQ_48MHz;? ? ? ? /*!#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock? ? ? ? ?= SYSCLK_FREQ_56MHz;? ? ? ? /*!#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock? ? ? ? ?= SYSCLK_FREQ_72MHz;? ? ? ? /*!#else /*!< HSI Selected as System Clock source */
uint32_t SystemCoreClock? ? ? ? ?= HSI_VALUE;? ? ? ? /*!< System Clock Frequency (Core Clock) */
#endif
///
/* Configure the SysTick */
SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);//8000000/1000=>1ms
/**
*This is the timer interrupt service routine.
*
*/
void SysTick_Handler(void)
{
/* enter interrupt */
rt_interrupt_enter();
rt_tick_increase();
/* leave interrupt */
rt_interrupt_leave();
}
本網站轉載的所有的文章、圖片、音頻視頻文件等資料的版權歸版權所有人所有,本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如果本網所選內容的文章作者及編輯認為其作品不宜公開自由傳播,或不應無償使用,請及時通過電子郵件或電話通知我們,以迅速采取適當措施,避免給雙方造成不必要的經濟損失。