[技术问答] 关于NUC100的SysTick的问题

[复制链接]
2361|7
 楼主| boshao 发表于 2015-1-25 20:16 | 显示全部楼层 |阅读模式
#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */

void SysTimerDelay(uint32_t us)
{
if(us==0)
  us = 1;
    SysTick->LOAD = (us * 6)&0xffffff; /* 12/2  */
    SysTick->VAL   =  (0x00);
    SysTick->CTRL = (1<<SysTick_CTRL_ENABLE_Pos);
    /* Waiting for down-count to zero */
    while((SysTick->CTRL & (1 << 16)) == 0);
}

void SysTimerDelay(uint32_t us)
{
if(us==0)
us = 1;
SysTick->LOAD = (us * 6)&0xffffff; /* 12/2 */
SysTick->VAL = (0x00);
SysTick->CTRL = (1<<SysTick_CTRL_ENABLE_Pos);
/* Waiting for down-count to zero */
while((SysTick->CTRL & (1 << 16)) == 0);
SysTick->CTRL = (0<<SysTick_CTRL_ENABLE_Pos);       //关SysTick
}
第一个函数运行没有什么问题,但第二个函数(第二个函数比第一个函数多了红色的语句)运行一小段时间后,会卡在while((SysTick->CTRL & (1 << 16)) == 0);
出不来。这是什么原因呢?
bobde163 发表于 2015-1-25 23:01 | 显示全部楼层
SysTick->CTRL = (0<<SysTick_CTRL_ENABLE_Pos);       //关SysTick
这一句执行完后,SysTick定时器的的时钟选择位被设置为0,根据寄存器定义,0表示使用外部参考时钟源作为时钟,但是一般情况下此定时器会使用内核时钟作为时钟源,因此你需要去检查一下在执行这一句之前时钟的情况
zxf0168 发表于 2015-1-26 09:38 | 显示全部楼层
滴答定时器
戈卫东 发表于 2015-1-26 11:25 | 显示全部楼层
这样写才能避免影响其他位
SysTick->CTRL = SysTick->CTRL & ~(1ul<<SysTick_CTRL_ENABLE_Pos);
骗子的片子 发表于 2015-1-26 15:53 | 显示全部楼层
戈卫东 发表于 2015-1-26 11:25
这样写才能避免影响其他位
SysTick->CTRL = SysTick->CTRL & ~(1ul

:)高人
lovecat2015 发表于 2015-1-29 12:40 来自手机 | 显示全部楼层
是高人啊
yyglucky 发表于 2017-8-8 15:56 | 显示全部楼层
天灵灵地灵灵 发表于 2017-8-8 20:05 | 显示全部楼层
如果选用不同的时钟源,这个是不是需要修改?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部