问一个小问题 关于fac_us=SystemCoreClock/8000000; 怎么是1US呢 72MHZ的八分频是9MHZ即SysTick即为9MHZ 那再除8M也不能是1us啊 ?下面的函数不是说明 fac_us ==1us吗? void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } |
答:1us的意思是1us systick需要计的数。systick的时钟是SystemCoreClock的1/8。那么1us systick需要计的数不就是(SystemCoreClock/8)/10000000=SystemCoreClock/80000000了
SYSCLK即SystemCoreClock
HCLK即SYSCLK分频得来(在此未分频),即HCLK==SystemCoreClock
SysTick时钟是HCLK8分频,即SysTick时钟频率==HCLK/8==SystemCoreClock/8,
因此,SysTick一个计数时长(1/(SystemCoreClock/8)),
1us需要计数次数为10^-6÷[1/(SystemCoreClock/8)]=SystemCoreClock/8000000
SysTick时钟是sysclk 8分频,即SysTick时钟频率=sysclk/8, systick 计1次数所需时间为8/sysclk(s)=8*10^6/sysclk(us),由此, SysTick 1微秒计数个数为fac_us=sysclk/8*10^6. 举个例子:当sysclk=8M时,systick 计1次数所需时间为1us,由此,fac_us=1,寄存器加载个数SysTick->LOAD=nus*1; 当sysclk=72M时,systick 计1次数所需时间为1/9us,由此,fac_us=9,寄存器加载个数SysTick->LOAD=nus*9; |
链接:原子论坛