Systick_config :神舟IV

Systick_config
 1 void Systick_config(uint16_t loadvalue)
 2 {
 3   SysTick_Config(loadvalue);
 4 
 5  /* Configure the SysTick handler priority */
 6   NVIC_SetPriority(SysTick_IRQn, 0x0);
 7 
 8 }
 9 volatile uint32_t i=0;
10 
11 /*   SystemCoreClock / 100 Setup SysTick Timer for 10 msec interrupts  */ 
SysTick_Handler
 1 extern uint32_t i;
 2 void SysTick_Handler(void)
 3 {
 4     if(i<1000)
 5     {
 6      i++;
 7     }
 8     else
 9     {
10      i=0;
11      if(GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2))
12      {
13           Led_Turn_on_all();
14          printf("on\r\n");
15      }
16      else
17      {
18           Led_Turn_off_all();
19          printf("off\r\n");
20      }
21     }
22     
23                           
24 }

 

SysTick_Config(uint32_t ticks
 1  * @brief  Initialize and start the SysTick counter and its interrupt.
 2  *
 3  * @param   ticks   number of ticks between two interrupts
 4  * @return  1 = failed, 0 = successful
 5  *
 6  * Initialise the system tick timer and its interrupt and start the
 7  * system tick timer / counter in free running mode to generate 
 8  * periodical interrupts.
 9  */
10 static __INLINE uint32_t SysTick_Config(uint32_t ticks)
11 { 
12   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
13                                                                
14   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
15   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
16   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
17   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
18                    SysTick_CTRL_TICKINT_Msk   | 
19                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
20   return (0);                                                  /* Function successful */
21 }

 

SysTick_Config(SystemFrequency / 10)   函数的形参就是systick重装定时器的值。

 

systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。

SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源

STK_CSR,        0xE000E010  --  控制寄存器
STK_LOAD,     0xE000E014  --  重载寄存器
STK_VAL, 0xE000E018 -- 当前值寄存器
STK_CALRB,   0xE000E01C  --   校准值寄存器

官方库定义

typedef struct
{
  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
} SysTick_Type;


首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义 
第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟,外部参考时钟;1:使用HCLK作为Systick时钟,内部参考时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零

STK_LOAD  重载寄存器:
Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。 

STK_VAL当前值寄存器:
也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。


STK_CALRB  校准值寄存器:
这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:
位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用
位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms
位[23:0] :Calibration value

写个systick关闭的函数,直接操作寄存器

Systick_Close
1 void Systick_Close()
2 {
3         SysTick->CTRL=0x0;
4 }

 

 

 

posted @ 2013-03-13 12:23  wwjdwy  阅读(1106)  评论(0编辑  收藏  举报