[技术问答]

关于NUC100的SysTick的问题

[复制链接]
1712|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 | 显示全部楼层

使用特权

评论回复
如果选用不同的时钟源,这个是不是需要修改?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

29

帖子

0

粉丝