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