| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #include "delay.h"
- static u8 fac_us=0;//us延时倍乘数
- static u16 fac_ms=0;//ms延时倍乘数
- //初始化延迟函数
- //SYSTICK的时钟固定为HCLK时钟的1/8
- //SYSCLK:系统时钟
- void delay_init(void)
- {
- systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);
- fac_us = SystemCoreClock / 8000000;
- fac_ms = (u16)fac_us * 1000;
- }
- void delay_us(u32 nus)
- {
- u32 ctl;
- SysTick->LOAD = (u32)(nus * fac_us);
- SysTick->VAL = 0x0000U;
- do {
- ctl = SysTick->CTRL;
- } while((ctl & SysTick_CTRL_ENABLE_Msk) && !(ctl & SysTick_CTRL_COUNTFLAG_Msk));
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- SysTick->VAL = 0x0000U;
- }
- //延时nms
- //注意nms的范围
- //SysTick->LOAD为24位寄存器,所以,最大延时为:
- //nms<=0xffffff*8*1000/SYSCLK
- //SYSCLK单位为Hz,nms单位为ms
- //对72M条件下,nms<=1864
- void delay_ms(u16 nms)
- {
- u32 ctl;
- /* reload the count value */
- SysTick->LOAD = (u32)(nms * fac_ms);
- /* clear the current count value */
- SysTick->VAL = 0x0000U;
- /* enable the systick timer */
- SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
- /* wait for the COUNTFLAG flag set */
- do {
- ctl = SysTick->CTRL;
- } while((ctl & SysTick_CTRL_ENABLE_Msk) && !(ctl & SysTick_CTRL_COUNTFLAG_Msk));
- /* disable the systick timer */
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
- /* clear the current count value */
- SysTick->VAL = 0x0000U;
- }
|