你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
数码小叶 发表于 2015-1-8 10:16 你没理解我的意思,一个定义的是48,一个定义的是72 ,我刚说了啊
在51系列芯片的编程中,通常会用到延时函数,当时我们是用死循环来达到这个效果的;
在STM32电路系统里面,我们就可以用Systick Time这个模块,能够精确延时的目的。
这个模块即使在系统睡眠的时候也是工作的,这样可以用之做一个系统闹钟或者是实现待机唤醒这个功能。这个模块就是一个简单的倒计时器,对于它,有三个常用的寄存器
CTRL 控制状态寄存器
LOAD重装载寄存器
可参照这个理解一下
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
//选择外部时钟 HCLK/8即为9M的时钟
fac_us=SystemCoreClock/8000000;
//每个us需要的systick时钟数
fac_ms=(u16)fac_us*1000;
//每个ms需要的systick时钟数
}
void delay_us(u32 nus)
{
SysTick->VAL=0X00; //清空计数器
SysTick->LOAD=nus*fac_us; //初始值加载
SysTick->CTRL|=0X01; //ENABLE,开始计数
while(!(SysTick->CTRL>>16)); //等待标志位为1
SysTick->CTRL&=0X00; //关闭计数器
}
VALUE当前数值寄存器
每隔1ms之间共有48M/1000个周期。
每隔1us之间共有48M/1000000个周期。
Systick_Config的返回值是函数是不是执行成功。比如参数的值超过了SYSTICK->VAL的最大值,那么返回的是真。所以要捕捉这个函数的错误。
看着一句,如果是F0那么systic计数值就等于(48M/1000),当计数到这么多产生中断,而计一个数的时间为 SystemCoreClock(或者它的1/8),SystemCoreClock/(48M/1000)就等于1000Hz,即为1ms,对于f103同理还是1ms中断一次!
CPU不一样,库文件里定义的uint32_t SystemCoreClock 也不一定相同
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
uint32_t ticks 就是滴答
明白了啊,你不就是说两的时钟不一样吗,一个48,一个72,CPU不一样,怎么能一样,除非你超频
https://www.stmcu.org.cn/module/ ... amp;fromuid=2091303
(出处: 意法半导体STM32/STM8技术社区)
看看我的帖子,比这个好多了