OpenEdv-开源电子网

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

Systick寄存器的初始化问题

[复制链接]

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2011-1-16
在线时间
2 小时
发表于 2011-1-16 11:07:14 | 显示全部楼层 |阅读模式
//初始化延迟函数
//SYSTICK的时钟固定为 HCLK时钟的 1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
 SysTick->CTRL&=0xfffffffb;//bit2 清空,选择外部时钟  HCLK/8   此处是将CTRL寄存器设置为外部时钟,其余项都是置位状态
 fac_us=SYSCLK/8;      
 fac_ms=(u16)fac_us*1000;
}


void delay_ms(u16 nms)
{         
 u32 temp;     
 SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD 为 24bit)
 SysTick->VAL =0x00;           //清空计数器  
 SysTick->CTRL=0x01 ;          //开始倒数     而在这一步当中又把CTRL寄存器的相当于 只是把第0位开启了,也就是开启了倒数,而其他的位全部不都是变为了0么?这一点不会对相应的前面的设置造成影响么?  比如CTRL的16位,2位,1位造不成影响么?
 do
 {
  temp=SysTick->CTRL;
 }
 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
 SysTick->CTRL=0x00;       //关闭计数器
 SysTick->VAL =0X00;       //清空计数器        
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2011-1-16 12:04:57 | 显示全部楼层

回复【楼主位】 小虫儿 :
-------------------------------
小虫提的这个问题很好。

第一个问题:
SysTick->CTRL&=0xfffffffb;//bit2 清空,选择外部时钟  HCLK/8   此处是将CTRL寄存器设置为外部时钟,其余项都是置位状态

这里你看看SysTick->CTRL的默认值就知道了,SysTick->CTRL在复位后的状态为0X0000,也就是全零。这里我的SysTick->CTRL&=0xfffffffb;//bit2 清空,其实只是清空bit2,其他位,原来是什么状况,在执行这句之后,还是什么状况。注意这里用的是&。

第二个问题:
SysTick->CTRL=0x01 ;          //开始倒数     而在这一步当中又把CTRL寄存器的相当于 只是把第0位开启了,也就是开启了倒数,而其他的位全部不都是变为了0么?这一点不会对相应的前面的设置造成影响么?  比如CTRL的16位,2位,1位造不成影响么?

这里,其实我的设置真是有不妥的,只是在使用的时候,恰好不影响之前的设置(bit2,本来就该设置为1)。所以结果是正确的。但是这样设置是不妥的。最好就是SysTick->CTRL|=0x0001 ;  这样,就完美了。
同样,在结束延时之后:
SysTick->CTRL=0x00;       //关闭计数器
应该改为:
SysTick->CTRL&=0xFFFE; //关闭计数器


 

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2011-1-16
在线时间
2 小时
 楼主| 发表于 2011-1-16 14:31:30 | 显示全部楼层
谢谢原子的回答,那么看来你的delay.c又要升级了。哈哈
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2011-1-16 14:34:22 | 显示全部楼层
回复【3楼】小虫儿:
-------------------------------
呵呵,暂时不影响使用。
以后会升级的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

98

主题

408

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2010-12-14
在线时间
0 小时
发表于 2011-1-17 02:18:43 | 显示全部楼层
回复【楼主位】小虫儿:
-------------------------------
小虫儿学习很认真仔细,呵呵!
希望openedv能给大家提供一个友好的技术交流平台!
回复 支持 反对

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2011-1-16
在线时间
2 小时
 楼主| 发表于 2011-1-21 16:31:51 | 显示全部楼层
要不根本 就没办法 很好的入门 只有现在仔细了 才能将来 很好的有条理的写出来程序。
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2011-8-11
在线时间
0 小时
发表于 2011-8-12 11:10:38 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
SysTick->CTRL&=0xfffffffb;为什么这里赋值是赋24位 的,下面这个SysTick->CTRL=0x01只有8位呢?还有这个是SysTick->CTRL&=0xFFFE;十六位的?是不是只要是八的倍数而且不超过24位就可以?刚接触stm32,比较菜,希望大侠能解答一下。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2011-8-12 14:16:08 | 显示全部楼层
你的另一个帖子里面已做答
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-8-12 16:12:21 | 显示全部楼层
回复【7楼】autoscut:
---------------------------------
不一定要是八的倍数,小于32位就可以。不够的前边自动补0.
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2012-4-22
在线时间
4 小时
发表于 2013-7-12 21:54:29 | 显示全部楼层
路过,顺便锻炼下胸肌
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2014-3-5
在线时间
0 小时
发表于 2014-4-26 11:03:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
使用外部时钟,非中断,0,1,2位应该为1,0,0.。SysTick->CTRL=0x01 ;没有影响ctrl的2,1位啊,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-26 17:01:51 | 显示全部楼层
回复【11楼】fangxiaoyanzhou:
---------------------------------
眼睛看花了吧?
到底是0,代表外部时钟,还是1代表外部时钟?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2014-3-5
在线时间
0 小时
发表于 2014-4-26 20:00:59 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
最近改论文,调电路板,确实头昏眼花。。老师,我还是没看出1是外部时钟

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-26 20:14:56 | 显示全部楼层
回复【13楼】fangxiaoyanzhou:
---------------------------------
bit2:

0=外部时钟源(STCLK)
1=内核时钟(FCLK)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2015-9-9
在线时间
59 小时
发表于 2016-4-23 23:42:36 | 显示全部楼层
fangxiaoyanzhou 发表于 2014-4-26 20:00
回复【12楼】正点原子:
---------------------------------
最近改论文,调电路板,确实头昏眼花。。老 ...

我也搞到这里了,
这里ClkSource要是设为1的话,我们的HCLK/8这个8分频就没用了,因为选择了FCLK作为时钟源。这个被称作是“内部时钟”
我们应该把ClkSource位设为0,让他用所谓的“外部时钟STCLK”,就是我们的8分频。
应该产生误解的是翻译原因。“内部、外部。。。”



毕业两年才学STM32...
这些都没关系,重点是自己到底成长了没有
回复 支持 反对

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2016-9-10 21:06:44 | 显示全部楼层
WM_CH 发表于 2016-4-23 23:42
我也搞到这里了,
这里ClkSource要是设为1的话,我们的HCLK/8这个8分频就没用了,因为选择了FCLK作为时 ...

请问WM_CH,你在用延时 时 有没卡死在whike里?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 13:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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