#include "drv_systick.h" #include "misc.h" #include static u8 fac_us = 0; // us延时倍乘数 static u16 fac_ms = 0; // ms延时倍乘数 volatile uint32_t systick_ms = 0; // 初始化延迟函数 // 当使用ucos的时候,此函数会初始化ucos的时钟节拍 // SYSTICK的时钟固定为HCLK时钟的1/8 // SYSCLK:系统时钟 void drv_systick_init() { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); if (SysTick_Config(SystemCoreClock / 1000)) { while (1) { } } NVIC_SetPriority(SysTick_IRQn, 0x00); } // 延时nus // nus为要延时的us数. void drv_delay_us(uint32_t nus) { uint32_t 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; // 清空计数器 } // 延时nms // 注意nms的范围 // SysTick->LOAD为24位寄存器,所以,最大延时为: // nms<=0xffffff*8*1000/SYSCLK // SYSCLK单位为Hz,nms单位为ms // 对72M条件下,nms<=1864 void drv_delay_ms(u16 nms) { uint32_t temp; SysTick->LOAD = (uint32_t)nms * fac_ms; // 时间加载(SysTick->LOAD为24bit) 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; // 清空计数器 } uint32_t get_systick_ms(void) { uint32_t tick, tick_ms; __disable_irq(); tick = (SYSTICK_EXT_CLOCK_1MS_CNT - SysTick->VAL); tick_ms = tick / (SYSTICK_EXT_CLOCK_1MS_CNT); tick_ms = tick_ms + systick_ms; __enable_irq(); return tick_ms; }