注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
dj狂人的个人空间 https://home.eeworld.com.cn/space-uid-525697.html [收藏] [复制] [分享] [RSS]
日志

SysTick

已有 1779 次阅读2014-12-17 21:58

                                       
         SysTick是一个24位的定时器,采用递减方式计数,作为cortex-M3的标配,SysTick是学stm32或者是RTos不得不面对的,


只要是基于cortex-M3内核的单片机都有一个SysTick这对在程序移植的时候可以省去不少功夫。今天就用SysTick小试牛刀,做了


个呼吸灯,可是折腾了半天,程序老报错,说函数没有定义,可明明是按用户手册上说明来做的,最后才发现原来是我固件库的


问题,固件库是3.5版本的,移除了一些老版本上关于SysTick的驱动函数。新版本的话只要调用SysTick_Config(uint32_t ticks)这

个函数,然后用SysTick_Handler(void) 编写中断服务程序就可以使用SysTick了。

         调用SysTick_Config(uint32_t ticks)需要我们传一个计数值进去,比如系统系统位72MHz,那么机器周期就是1/72000000,这


是计一个数所花的时间,那么如果我们需要定时1S的话,需要计  1/1/72000000 也就是72000000个数,但是由于我们的SysTick


是24位的,他最大能计2的24次方 也就是 16777215 个数,所以如果我们要定时1S的话,还需在程序上再处理一下。

        SysTick_Config(uint32_t ticks)定义在 core_cm3.h文件中, 他的函数原型是这样的


static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
         if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);                      //这里是判断计数值ticks是否大于 16777215,若大于,退出

         SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;        //将计数值加载到寄存器中
         NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  //设置systick定时器中断优先级
         SysTick->VAL   = 0;                                          
         SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                                         SysTick_CTRL_TICKINT_Msk   |
                                            SysTick_CTRL_ENABLE_Msk;                     //使能systick定时器及中断   
          return (0);                                             
}

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章