在ARM Cortex-M3内核中有一个Systick定时器,一个24bit的倒计数定时器,当计数到0时,它就会从Load寄存器中自动重装定时初值,只要不把CTRL寄存器中的ENABLE清0,它就永不停。对于滴答定时器的理解主要分为下面几项:
1. 滴答定时器的时钟来源
看上面的图会有一个错觉,以为滴答定时器是系统时钟的1/8,其实不是,滴答定时器的时钟既可以是HCLK/8,也可以是HCLK,这个是通过CTRL寄存器进行设定的,了解这一点,对于操作系统的时钟计算很重要,因为要精确计算时钟时间。
2. 滴答定时器的寄存器。
3. 滴答定时器的库函数
1)寄存器的定义: 在core_cm3.h中(此文件在我的eclipse工程目录:D:c_workspacertuarchst-m3lstlibcmsis)
此结构体被define为SysTick:
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!《 SysTick configuration struct */
2)设定步骤:
①选择时钟源:misc.c(D:c_workspacertuarchst-m3lstlibsrc)
其中这两种时钟源 :
SysTick_CLKSource_HCLK_Div8 外部时钟 72/8=9M
SysTick_CLKSource_HCLK 内部时钟 HCLK=72M
②设定重载数
③开启中断
④启动滴答定时器
②③④:core_cm3.h
解析:
作用: 使能Systick定时器,开启SysTick中断,配置中断时间间隔
参数ticks: 设置多少个Systick时钟周期产生一次中断
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) 》 SysTick_LOAD_RELOAD_Msk) return (1); /* ticks参数有效性检查 */
SysTick-》LOAD = ticks - 1; /* 设置重装载值,
-1:因为装载时消耗掉一个systick时钟周期*/
NVIC_SetPriority (SysTick_IRQn, (1《《__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt 配置NVIC */
SysTick-》VAL = 0; /* 初始化VAL=0,使能Systick后立刻进入重装载 */
SysTick-》CTRL = SysTick_CTRL_CLKSOURCE_Msk | *选择时钟源*
SysTick_CTRL_TICKINT_Msk | *开启Systick中断*
SysTick_CTRL_ENABLE_Msk; /* 使能Systick定时器 */
return (0); /* Function successful */
}
SysTick_Handler()处理:
void SysTick_Handler(void)
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
说明:我的工程是eclipse工程,用的是rt_thread系统。
在ARM Cortex-M3内核中有一个Systick定时器,一个24bit的倒计数定时器,当计数到0时,它就会从Load寄存器中自动重装定时初值,只要不把CTRL寄存器中的ENABLE清0,它就永不停。对于滴答定时器的理解主要分为下面几项:
1. 滴答定时器的时钟来源
看上面的图会有一个错觉,以为滴答定时器是系统时钟的1/8,其实不是,滴答定时器的时钟既可以是HCLK/8,也可以是HCLK,这个是通过CTRL寄存器进行设定的,了解这一点,对于操作系统的时钟计算很重要,因为要精确计算时钟时间。
2. 滴答定时器的寄存器。
3. 滴答定时器的库函数
1)寄存器的定义: 在core_cm3.h中(此文件在我的eclipse工程目录:D:c_workspacertuarchst-m3lstlibcmsis)
此结构体被define为SysTick:
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!《 SysTick configuration struct */
2)设定步骤:
①选择时钟源:misc.c(D:c_workspacertuarchst-m3lstlibsrc)
其中这两种时钟源 :
SysTick_CLKSource_HCLK_Div8 外部时钟 72/8=9M
SysTick_CLKSource_HCLK 内部时钟 HCLK=72M
②设定重载数
③开启中断
④启动滴答定时器
②③④:core_cm3.h
解析:
作用: 使能Systick定时器,开启SysTick中断,配置中断时间间隔
参数ticks: 设置多少个Systick时钟周期产生一次中断
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) 》 SysTick_LOAD_RELOAD_Msk) return (1); /* ticks参数有效性检查 */
SysTick-》LOAD = ticks - 1; /* 设置重装载值,
-1:因为装载时消耗掉一个systick时钟周期*/
NVIC_SetPriority (SysTick_IRQn, (1《《__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt 配置NVIC */
SysTick-》VAL = 0; /* 初始化VAL=0,使能Systick后立刻进入重装载 */
SysTick-》CTRL = SysTick_CTRL_CLKSOURCE_Msk | *选择时钟源*
SysTick_CTRL_TICKINT_Msk | *开启Systick中断*
SysTick_CTRL_ENABLE_Msk; /* 使能Systick定时器 */
return (0); /* Function successful */
}
SysTick_Handler()处理:
void SysTick_Handler(void)
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
说明:我的工程是eclipse工程,用的是rt_thread系统。
举报