stm32中的Void delay_us();中的 。

1. void delay_ms(u16 nms)
2. {
3. u32 temp;
4. SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
5. SysTick->VAL =0x00; //清空计数器
6. SysTick->CTRL=0x01 ; //开始倒数
7. do
8. {
9. temp=SysTick->CTRL;
10. }
11. while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达
12. SysTick->CTRL=0x00; //关闭计数器
13. SysTick->VAL =0X00; //清空计数器
14. }
15. #endif
问:1.其中第11行怎么理解,好复杂!
2.寄存器 SysTick->CTRL是一个16位的吗?
3.手册上说SysTick是一个倒计数器,请问是通过自动减一来计数的吗(没有看见像j--之类的语句)?
4.其中SysTick->LOAD=(u32)nms*fac_ms表示的是脉冲的个数,但记录的脉冲个数放在哪个寄存器里啊?
5.根据cotex-m3第133页介绍,寄存器SysTick->CTRL只有0、1、2和16位的描述,为什么没有其他为的描述呢?平时用的时候怎么设置?对第16位的描述怎么理解?

第1个回答  推荐于2016-01-29
解1.7-11是DO——while循环,先执行 循环体一次 再判断停止条件。11行中temp&0x01是满足SysTick->CTRL为0X01,即开始倒数;&& 是与指令,就是前后两个条件要同时满足时,才为1;!(temp&(1<<16))这个是SysTick->CTRL的16位,当SysTick已经数到0时,则该位为1,当该位为1时,!(temp&(1<<16))就变为0,此时(temp&0x01)&&!(temp&(1<<16))为0,就退出循环体,去执行SysTick->CTRL=0x00; //关闭计数器
解2。SysTick都是24位的。只是只用到0,1,2,16位,
解3.这个是TICK本身的自减,也就是倒数,不用我们再用像减一这样的指令去实现。
解4.放在LOAD里面啊
解5,16位解释在解1里就有了。本回答被提问者采纳
第2个回答  2013-04-25
在一个while循环中始终坚持 时间是否到达 如果到达则进行下一步,你看看手册旧明白了追问

语句while((temp&0x01)&&!(temp&(1CTRL是16位的,而0x01是8位的,他们怎么进行&啊?

寄存器SysTick->CTRL(cotex-m3手册的133页)的第16位后面的描述“
如果在上次读取本寄存器后,SysTick 已经数到了
0,则该位为1。如果读取该位,该位将自动清零
“怎么理解。

追答

只进行 低八位相与,不过我认为是你的例子写错了,应该是0x0001,
2,该寄存器为只读写零 寄存器 你看看 寄存器 底下是否有 r0_w1的标志 ,顺便查下手册的开头 有对这些 缩写的描述。

相似回答