|
void SysTick_ConfigInit(void)
{
while (SysTick_Config(SystemCoreClock / 10));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
追踪SysTick_Config(SystemCoreClock / 10)得:
/**
* @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.
*/
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, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
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 */
}
分析如下:
一、if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);输入参数检查,
如果参数大于SysTick_LOAD_RELOAD_Msk则返回值“1”,表示 failed既失败;
二、追踪SysTick_LOAD_RELOAD_Msk(位屏蔽宏)得到:
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos) 这样的宏定义;
再次追踪SysTick_LOAD_RELOAD_Pos(位指示宏)得到:
#define SysTick_LOAD_RELOAD_Pos 0 其后的“0”正好是LOAD在STK_CTRL寄存器中的位置,既Bit0;
三、0xFFFFFF后的ul表示什么呢?
ul表示无符号长整型既unsigned long的缩写;其整体的含义是0xFFFFFF为无符号长整型数据;
总结:第一句的含义为检查输入的参数是否大于0xFFFFFF;因为这是其允许的最大计数值;
四、对SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
此语句是将寄存器CTRT的各个位(CLKSOURCE/TICKINT/ENABLE)为分别进行位移操作,从而使各个位置
位或复位;
然后再通过位或运算赋值给CTRT寄存器,从而完成寄存器的配置的! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|