9016|9

2955

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

LPC1114之SysTick计算 [复制链接]

LPC1114的SysTick延时时间的计算方式如下图

我用这个延时做了一个LED闪烁的例子,现在共享给大家。下面是源代码,附件里有工程文件。

#include "LPC11xx.h"                        /* LPC11xx definitions */
#include "gpio.h"

uint32_t flag = 0;
/*----------------------------------------------------------------------------
  SysTick_Handler
 *----------------------------------------------------------------------------*/
void SysTick_Handler(void)
{
 uint32_t temp;
 temp = SysTick->CTRL;
 if(flag)
 {
  // Turn LED on, then wait
  GPIOSetValue( 0, 7, 1 );
  flag = 0;
 }
 else
 {
  flag = 1;
  // Turn LED off, then wait
  GPIOSetValue( 0, 7, 0 );
 }
}
/* Main Program */

int main (void) {
   /* Basic chip initialization is taken care of in SystemInit() called
    * from the startup code. SystemInit() and chip settings are defined
    * in the CMSIS system_<part family>.c file.
    */

  GPIOInit();

  /* Set port 0_7 - LED2 on LPCXpresso board to output */
  GPIOSetDir( 0, 7, 1 );

  if (SysTick_Config(SystemCoreClock / 3)) { /* Setup SysTick Timer for 330 msec interrupts  */
    while (1);                                  /* Capture error */
  }

  while (1)                                /* Loop forever */
  {
  ;
  }
}

程序本身也比较简单,用到了SysTick的一个库函数SysTick_Config(uint32_t ticks),和中断函数SysTick_Handler(void)。中断函数很简单,就是首先读取中断标志位以清零该位值,后面用一个标志位flag来实现每进一次中断翻转一下LED的IO口,从而实现LED的闪烁。库函数SysTick_Config(uint32_t ticks)的原型如下,

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 判断该计数值是否超限即超过24位 */
                                                              
  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*/
}

该函数如果设置成功则返回0,设置失败则返回1。

关于延时时间的计算公式为T=(reload+1)/Fcclk,即reload= Fcclk*T - 1;我这里用的是330ms的延时即1/3S的延时,因此我函数里用的是SystemCoreClock / 3,但是一定要注意一点就是reload的值一定不能超过24位的。

systick.rar (62.08 KB, 下载次数: 151)

[ 本帖最后由 lixiaohai8211 于 2010-5-31 22:33 编辑 ]
此帖出自NXP MCU论坛

最新回复

算是搞定了,在网上核对了一下,只不过寄存器名跟user manual里不太一样而已  详情 回复 发表于 2015-2-19 01:38
点赞 关注
个人签名不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
学习啊!!!!!!!!!!!
此帖出自NXP MCU论坛
 
 
 

回复

107

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

学习!

学习 !!!
此帖出自NXP MCU论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 

回复

谢谢楼主分享,学习了
此帖出自NXP MCU论坛
 
 
 

回复

790

帖子

66

TA的资源

五彩晶圆(初级)

5
 
学习了!!!!
此帖出自NXP MCU论坛
 
个人签名行动才有结果,知识并非力量 !
 
 

回复

327

帖子

0

TA的资源

纯净的硅(高级)

6
 
感觉有点多线程的意味,只是感觉,还要仔细体会。谢谢
此帖出自NXP MCU论坛
 
个人签名Python全文搜索引擎:<url>http://code.google.com/p/ming-search/</url>
 
 

回复

113

帖子

0

TA的资源

一粒金砂(中级)

7
 
mark!!!
此帖出自NXP MCU论坛
 
个人签名中国人民解放军总装备部
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

8
 
有一点注意的是system tick 是24位的counter, 就是最高到0xFFFFFF, 所以tick的时间间隔是有限制的. 比如不可能实现10秒一个tick(指interrupt的间隔).
其实简单的任务可以直接在tick handler里面做,比如简单地设置GPIO,复杂的在while loop里面做,也就是时间分片的方式了。

LED闪烁的例子再稍微进一步,比如10s闪一次,就需要增加额外的flag和计时counter了。

Reload value计算:
SysTick->LOAD  = ((SystemCoreClock / (1/(time scale in second))) & 0xFFFFFF) - 1;
此帖出自NXP MCU论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

9
 
能不能直接通过写寄存器值来控制system tick啊?为什么我写寄存器比如“SYST_RVR“,lpcxpresso都说没有定义,明明别的寄存器都写得好好的,求解答,谢谢
此帖出自NXP MCU论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

10
 
算是搞定了,在网上核对了一下,只不过寄存器名跟user manual里不太一样而已
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表