12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #include "drv_systick.h"
- #include "misc.h"
- #include <stdint.h>
- 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;
- }
|