OpenEdv-开源电子网

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

学习心得-->3

[复制链接]

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
发表于 2011-12-2 02:51:32 | 显示全部楼层 |阅读模式
工作忙了一通又有点时间泡泡ARM了.......
今天看懂了 systick->CTRL &=fffffffb; 是等于:

systick-> ENABLE =1;

systick-> TICKINT =1;

systick-> CLKSOURCE =0;

systick-> COUNTFLAG =1;

还有一样不明白,没有定义.就是0xb二进制是: 1011.后三位上边定义了,但高位的第四位是啥意呢.能不能是0011能?
systick->CTRL &=fffffffb; 能不能写成 systick->CTRL &=fffffff3; ???? 
那个高4位的1难道就是传说中的systick->CALIB???

等原子老大解答.

sysTick -> xxxxx   结构定义是Uv3里边定义的. 不要在C里边找 "->"符号.个人认为 "->" 改成中指竖起的符号 "凸" 更加和谐.

systick-> ENABLE 是说 systick->CTRL 下边有32个小弟,这里有4个特别搓的小弟 其中一个搓人叫ENABLE 另三个叫 TICKINT ,CLKSOURCE ,COUNTFLAG. 因为他们经常给点名,给个名字好叫一点.
4个小弟用51行话来说就是 bit TICKINT ,CLKSOURCE ,COUNTFLAG ;

相当于 bit 日期 ->年,日期 ->月,日期 ->日 ;

样板里写成  systick-> ENABLE  是便好认它是来自===> systick 控制及状态寄存器 的第0位.(Cortex-M3权威指南Cn    134页)

fac_us = SYSCLK/8 如晶振和学习板不同,那这行指令就不能代表 1个微秒了.要按实际的晶振算 fac_us = SYSCLK/N    就是SYSCLK 除于 N  要等于1个微秒.如用16M的晶振就要定成 fac_us = SYSCLK/16了.
如这样的蕊片用我们51常用的11.XXX的晶振做一个工控程式,分分钟给机器剁了你一只手都不知什么回事.

fac_ms = (u16)fac_us * 1000; <===这行对于我这个51民工来说有点囧.  (u16)<===直接定义右边fac_us * 1000是16位数. 我们这样的51民工一开始就不太习惯.难道f ac_ms 在头文件里不是定义好是16位的吗???

接下来 sysTick->LOAD 就好明白了.他代表 sysTick重装载数值寄存器.它里边有24个格子,能放24个鸡蛋或香肠.(古人是用绳子打结算数数,我们现代人用鸡蛋和香肠放在格子里算数数),相当于倒数秒表的初值.

同理,sysTick->VAL 就是 sysTick当前数值寄存器.它里边也有24个格子,能放24个鸡蛋或香肠.它放的是机器数数的数值.说是将sysTick->LOAD 格子里的数拿来做减1的小数一年级的数学作业.

如果你问他,它会将24个格子放的是蛋还是香肠的情况都告诉你.(多勤劳呀=.=),当减到0时.名叫:systick-> COUNTFLAG的搓人会高举一个牌子,上边画着一根香肠.如果你看到这个搓人举一个香肠牌子.就明白你给的作业 机器作完了. 

有一样不明白:

例子void delay_us(u32 nus) 里.

SysTick -> CTRL=0x01;  <==== 这个不明白.这是个32位的寄存器.这样不是将前边 void delay_init(u8 SYSCLK)里边定义的"systick->CTRL &=fffffffb; "里边的香肠全变鸡蛋了只剩一个香肠了吗.
难道每个函数都能分到一个"SysTick -> CTRL"的有32个格子的小柜子???

望原子老大解答一个.
 
我的工作就是天天在玩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2011-11-19
在线时间
4 小时
发表于 2011-12-2 07:37:19 | 显示全部楼层
鸡蛋和香肠? 我想起自己刚学英语的时候,在单词旁边都用汉字来注音。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2011-12-2 09:47:10 | 显示全部楼层
回复【楼主位】chinafox:
---------------------------------
1,你的理解错了.
systick->CTRL &=fffffffb; 只是把第二位清零.其他位维持原样.
2,不要在C里边找 "->"符号.又错了.
->是标准的c语言符号.
3,如用16M的晶振就要定成 fac_us = SYSCLK/16了,这句话也错了.
16M晶振依旧是 SYSCLK/8. 此句的参数是SYSCLK,你的SYSCLK频率多少,就写多少.与外部晶振无关.
4,fac_ms = (u16)fac_us * 1000; 这句话很好理解.因为fac_us是u8类型的,如果一个u8*1000,就会超过u8的范围.所以要先强制转换为u16.
6,SysTick -> CTRL=0x01;  这句话确实不妥,但是可以正常工作.因为恰好就没影响.正确的写法是:SysTick -> CTRL|=0x01;  
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2011-12-2 23:16:10 | 显示全部楼层
1,你的理解错了. 
systick->CTRL &=fffffffb; 只是把第二位清零.其他位维持原样<===其实我没理解错.只是写成:

systick-> ENABLE =1;

systick-> TICKINT =1;

systick-> CLKSOURCE =0;

systick-> COUNTFLAG =1;


大家更好理解一点而已.
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2011-12-2 23:18:59 | 显示全部楼层
6,SysTick -> CTRL=0x01;  这句话确实不妥,但是可以正常工作.因为恰好就没影响.正确的写法是:SysTick -> CTRL|=0x01;

这就没错了.............书上看得偶一头雾水.
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2011-12-2 23:21:52 | 显示全部楼层
3,如用16M的晶振就要定成 fac_us = SYSCLK/16了,这句话也错了. 
16M晶振依旧是 SYSCLK/8. 此句的参数是SYSCLK,你的SYSCLK频率多少,就写多少.与外部晶振无关. 

我还没看懂,我再琢磨一下.....................T.T
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2011-12-3 00:38:13 | 显示全部楼层
这下就不太明白了,板上用的8M晶振这样写是没错的.用了16M的晶振,8分频后那是0.5微秒呀..................将他定义成1微秒那就不对了.
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2011-12-3 01:53:38 | 显示全部楼层
回复【7楼】chinafox:
---------------------------------
系统时钟还有个PLL啊.
比如你用8M,9倍频,那么是8*9=72M
如果用16M,5倍频,那么是16*5=80M.
所以你在初始化延时函数的时候,设置为delay_init(80)即可.
延时结果和72M一摸一样.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2011-12-4 01:04:02 | 显示全部楼层
啊噢 ...............

赶快学习去.......PLL.......那一页呢..........
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2011-12-4 01:05:37 | 显示全部楼层
我发现现在得从SYS文件夹里的例程学起.一个个来解.然后自己写一个看看.
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2011-12-4 01:54:58 | 显示全部楼层
看了一头雾水......朦胧中有一点懂......
看来又要改一下.先由得他半懂,先玩IO再说.SYS里边的东东会自己配置了就离毕业不远了........=.=!!
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-21
在线时间
0 小时
发表于 2012-8-21 14:19:07 | 显示全部楼层
有意思……不是思维的错误,而是思维角度的不同导致了歧义
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 10:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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