OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11262|回复: 11

if(SysTick_Config(SystemCoreClock/1000)) while(1);

[复制链接]

8

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-4-13 20:51:13 | 显示全部楼层 |阅读模式
if(SysTick_Config(SystemCoreClock/1000))                   
while(1);
是什么意思,while(1)不是进入死循环了吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2017-8-4
在线时间
3 小时
发表于 2017-8-4 16:17:56 | 显示全部楼层
本帖最后由 youlikesoilove 于 2017-8-4 16:32 编辑

这个原子哥应该解释过了:

因为SysTick_Config();函数中
执行位操作的两个变量STK_LOAD和STK_VAL都是二十四位的。所以你要调用该函数所使用的参数不能超过2的24次方、
所以为了防止出现莫名其妙的错误,传入SysTick_Cofig();函数的值应当小于2的24次方。
SysTick_Config();函数内部集成了对输入参数检查的函数,

if (ticks>SysTick_LOAD_RELOAD_Msk)
return (1);

就是说,如果你输入SysTick_Config();的参数超出2的24次方会立即返回1

if(SysTick_Config(SystemCoreClock / 1000))
while(1);

SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;//关闭系统滴答定时器;

so、原子哥利用SysTick_Config();的返回值判断你是否配置对了,
如果配置错了,你的程序会立即进入死循环。
如果判断对了、
执行下一步。就是关闭滴答定时器。

我是初学者。如果哪点有问题。希望多多包涵。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2014-4-13 21:21:24 | 显示全部楼层
是啊,如果if成立,就死循环。这谁写的代码....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-4-13 22:30:06 | 显示全部楼层

那第41行什么意思
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2014-4-13 22:48:32 | 显示全部楼层
1楼已经回答。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-14 08:50:33 | 显示全部楼层
回复【楼主位】pengxiaokui:
---------------------------------
这个是原子哥检测那个函数是否设置成功的验证吧,不成功就不进行下面的事情
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-3-9
在线时间
10 小时
发表于 2016-4-12 21:40:44 | 显示全部楼层
为什么?
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-3-9
在线时间
10 小时
发表于 2016-4-12 21:41:23 | 显示全部楼层
那个大神么可以告诉
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-4-24
在线时间
16 小时
发表于 2016-9-15 22:09:14 | 显示全部楼层
SysTick_Config(SystemCoreClock/1000),系统时钟(SystemCoreClock)是72M的,除以1000以后变成7200,怎样算也不是1ms呀,还请原子可解惑!
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-4-24
在线时间
16 小时
发表于 2016-9-15 22:12:11 | 显示全部楼层
static __INLINE uint32_t SysTick_Config(uint32_t ticks) {    if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */                                                                   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |                     SysTick_CTRL_TICKINT_Msk   |                     SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */   return (0);                                                  /* Function successful */ },设置成功后返回0,接着执行下面的操作,如果不成功返回非0,就等在这里不再执行!
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-4-24
在线时间
16 小时
发表于 2016-9-15 22:31:51 | 显示全部楼层
mashuntao 发表于 2016-9-15 22:09
SysTick_Config(SystemCoreClock/1000),系统时钟(SystemCoreClock)是72M的,除以1000以后变成7200,怎样 ...

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);系统时钟的8分频,systick就是9M,24位的倒数计算器减7200次,每减1等于9分之1us,减7200等于800us,原子哥你看是吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-9-30
在线时间
0 小时
发表于 2016-9-30 18:17:53 | 显示全部楼层
本帖最后由 我是WC 于 2016-9-30 18:20 编辑
mashuntao 发表于 2016-9-15 22:31
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);系统时钟的8分频,systick就是9M,24位的倒数计 ...

不是啊,72000000/(1000*72000)=1ms,你要分清楚时间和频率撒。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-20 05:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表