高级会员

- 积分
- 800
- 金钱
- 800
- 注册时间
- 2011-11-18
- 在线时间
- 5 小时
|
工作忙了一通又有点时间泡泡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个格子的小柜子???
望原子老大解答一个.
|
|