ENABLE(位0) | Systick使能位。 0:关闭Systick功能; 1:开启Systick功能。 |
TICKINT(位1) | Systick中断使能位。 0:关闭Systick中断; 1:开启Systick中断,systick倒数到零时产生systick异常中断。 |
CLKSOURCE(位2) | Systick时钟源选择位。 0:使用HCLK/8作为Systick时钟(外部时钟); 1:使用HCLK作为Systick时钟(内核时钟)。 |
COUNTFLAG(位16) | Systick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。如果读取该位,该位将自动清零。 |
NOREF | 0:HCLK可用; 1:HCLK不可用。 |
SKEW | 0:校准值是准确的10ms; 1:校准值不是准确的10ms。 |
TENMS | 该值是10ms定时的重装值。其值取决于SKEW,它可以是精确的10ms,也可以是接近10ms的值。如果该值为0,则表示无法使用校准功能,这很可能是因为时钟是系统的一个未知输入或者时钟可以动态调节。 |
/*
* Name : main
* Description : ---
* Author : ysloveivy.
*
* History
* --------------------
* Rev : 0.00
* Date : 11/21/2015
*
* create.
* --------------------
*/
int main(void)
{
static int work_status = 0;
led.initialize();
systick.initialize();
//每隔一秒三色灯进行交替循环闪烁
while(1){
if(systick.second_flag == 1){ //每隔一秒标志位置1,执行一次
systick.second_flag = 0;
work_status += 1;
if(work_status > 2)work_status = 0;
}
switch (work_status){
case 0 :
LED_RED_ON;
LED_GREEN_OFF;
LED_BLUE_OFF;
break;
case 1 :
LED_RED_OFF;
LED_GREEN_ON;
LED_BLUE_OFF;
break;
case 2:
LED_RED_OFF;
LED_GREEN_OFF;
LED_BLUE_ON;
break;
default:
/*
* Name : initialize
* Description : ---
* Author : ysloveivy.
*
* History
* -------------------
* Rev : 0.00
* Date : 11/21/2015
*
* create.
* -------------------
*/
static int initialize(void)
{
//定时1ms
if(SysTick_Config(SystemCoreClock / 1000)){
while(1);
}
return 0;
}
/*
* Name : SysTick_Handler
* Description : ---
* Author : ysloveivy.
* History
* -------------------
* Rev : 0.00
* Date : 11/21/2015
*
* create.
* -------------------
*/
void SysTick_Handler(void)
{
static int counter = 0;
if((counter ++ % 1000) == 0){ //每次中断counter自加1,判断是否整秒
systick.second_flag = 1;
}
}
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) //大于重载寄存器最大值0xFFFFFF
{
return (1UL); //重新加载值不可能,返回错误
}
SysTick->LOAD = (uint32_t)(ticks - 1UL); //计数范围0到ticks-1
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
//设置优先级
SysTick->VAL = 0UL; //当前值初始化为0
//接下来设置控制寄存器,以位与的方式实现三个控制位的设置。
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | //选择时钟源
SysTick_CTRL_TICKINT_Msk | //开启中断
SysTick_CTRL_ENABLE_Msk; //使能定时器
return (0UL); //初始化成功返回
}
更多回帖