STM32的滴答定时器

SysTick_init(u8SYSCLK){u16fac_us,fac_ms;SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟HCLK... SysTick_init(u8 SYSCLK)
{ u16 fac_us,fac_ms;
SysTick->CTRL&=0xfffffffb; //bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
SysTick->LOAD=(u32)4*fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL |=(1<<0 |1<<1); //开始倒数
/* Function successful */
}
有三个问题需要问,求解答!
1 为什么 fac_us=SYSCLK/8,复值给SysTick->LOAD,就等于延时1us。到底怎么算出来的?
2 fac_us为8位数据,fax_ms为16位数据,为什么如果系统时钟不是8的倍数,就会导致延时函数不准确?
3 滴答定时器,占用CPU的资源吗,为什么有的时候下面之间有一个while(1)?求解答?
展开
 我来答
李威威012
2015-08-17 · TA获得超过268个赞
知道小有建树答主
回答量:144
采纳率:0%
帮助的人:60.1万
展开全部
1,Systick的时钟源你选择的是外部时钟的8分之一,所以需要除以8,得到Systick的时钟频率,例如外部时钟是8M,经过倍频后变为72M,那么Systick的频率就是9M,对应的计数器计9个数就是1us,所以fac_us=72/8=9.

2,如果不是8的倍数,8分频取得的频率是近似值,所以不准确,故推荐使用外部晶振大小为8MHz的晶振。
3,不占用,如果你用作延时函数,你得确定是否时间到了,所以是while的循环,你说的while(1)是什么意思?
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式