RTThread时钟
##### RTThread时钟
```c
void hw_board_init(char *clock_src, int32_t clock_src_freq, int32_t clock_target_freq)
{
....
/* enable interrupt */
__set_PRIMASK(0);
/* System clock initialization */
clk_init(clock_src, clock_src_freq, clock_target_freq);
/* disbale interrupt */
__set_PRIMASK(1);
rt_hw_systick_init();
...
}
/*
* clk_init()是指配置内外时钟、倍频等内容
* rt_hw_systick_init()则是系统时钟节拍(OS)配置
*/
/* SysTick configuration */
void rt_hw_systick_init(void)
{
#if defined (SOC_SERIES_STM32H7)
HAL_SYSTICK_Config((HAL_RCCEx_GetD1SysClockFreq()) / RT_TICK_PER_SECOND);
#else
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / RT_TICK_PER_SECOND);
#endif
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/*
* HAL_SYSTICK_Config()是指调用systick_config 设置最小的节拍
* HAL_RCC_GetHCLKFreq()获取 系统时钟主频,然后除以 RT_TICK_PER_SECOND(初始值位1000)即是表明以1ms为时钟节拍值
*/
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
return SysTick_Config(TicksNumb);
}
uint32_t HAL_RCC_GetHCLKFreq(void)
{
return SystemCoreClock;
}
void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource));
if (CLKSource == SYSTICK_CLKSOURCE_HCLK)
{
SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;
}
else
{
SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK;
}
}
// 这个函数则是选择系统
```
根据cubemx修改的rtt时钟配置 ,如何对单片机的时钟节拍os 产生影响
```c
void rt_hw_us_delay(rt_uint32_t us)
{
rt_uint32_t start, now, delta, reload, us_tick;
start = SysTick->VAL;
reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do {
now = SysTick->VAL;
delta = start > now ? start - now : reload + start - now;
} while(delta < us_tick * us);
}
```
根据cubemx修改的rtt时钟配置 ,如何对单片机的时钟节拍os 产生影响
void rt_hw_us_delay(rt_uint32_t us) { rt_uint32_t start, now, delta, reload, us_tick; start = SysTick->VAL; reload = SysTick->LOAD; us_tick = SystemCoreClock / 1000000UL; do { now = SysTick->VAL; delta = start > now ? start - now : reload + start - now; } while(delta < us_tick * us); }