STM32F7xx外设驱动2-delay(寄存器)
//源文件 static uint32_t fac_us = 0; // us延时倍乘数 /** * @brief 初始化延迟函数 * 当使用ucos的时候,此函数会初始化ucos的时钟节拍 * SYSTICK的时钟固定为AHB时钟的1/8 * @param SYSCLK 系统时钟频率 */ void DelayPhyConfig() { HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); //SysTick频率为HCLK fac_us = 216; //不论是否使用OS,fac_us都需要使用 } /** * @brief 延时nus * * @param nus 要延时的us数.值不要大于1000us */ void DelayPhyUs(uint32_t nus) { uint32_t ticks; uint32_t told, tnow, tcnt = 0; uint32_t reload = SysTick->LOAD; //LOAD的值 ticks = nus * fac_us; //需要的节拍数 told = SysTick->VAL; //刚进入时的计数器值 while (1) { tnow = SysTick->VAL; if (tnow != told) { if (tnow < told) tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了. else tcnt += reload - tnow + told; told = tnow; if (tcnt >= ticks) break; //时间超过/等于要延迟的时间,则退出. } }; } /** * @brief 延时nms * * @param nms 要延时的ms数 */ void DelayPhyMs(uint16_t nms) { uint32_t i; for (i = 0; i < nms; i++) DelayPhyUs(1000); } //头文件 /*****************************delay************************************/ void DelayPhyConfig(void); void DelayPhyUs(uint32_t nus); void DelayPhyMs(uint16_t nms); /**********************************************************************/