| 本帖最后由 zpwang 于 2023-12-26 20:10 编辑 
 #include "timer_delay.h"
 
 /* **************************************************************
 函数功能: 通用定时器6初始化/定时中断,提供 systick 以外的定时延时
 
 说明:
 定时器没有使能定时中断,杜绝了非阻塞延时频繁的中断抢占CPU资源
 120MHz APB1时钟分频12分频后为定时器时钟10MHz
 定时没计数一次为0.1uS.以提高非阻塞us级定时响应速度而减少误差
 TMR6 为16位定时器,其最大计数值 0xFFFF
 *************************************************************** */
 void Delay_tmr_init(void)
 {
 crm_periph_clock_enable(CRM_TMR6_PERIPH_CLOCK, ENABLE);
 
 tmr_base_init(TMR6, 0xFFFF, 11);
 tmr_cnt_dir_set(TMR6, TMR_COUNT_UP);
 
 tmr_counter_enable(TMR6, ENABLE);
 }
 
 uint16_t get_delay_cont(void)
 {
 return(tmr_counter_value_get(TMR6));
 }
 
 void tmr_delay_us(uint16_t xus)
 {
 uin616_t delay_us = 0;
 uint16_t delay_start= get_delay_cont();
 while(delay_us < xus)
 {
 if(get_delay_cont() > delay_start)
 {
 delay_us = (get_delay_cont() - delay_start)/10;
 }
 else
 {
 delay_us = (MAX_DEAY - delay_start + get_delay_cont())/10;
 }
 }
 
 return;
 }
 
 void tmr_delay_ms(uint16_t xms)
 {
 uint16_t delay_ms = 0;
 uint16_t delay_start= get_delay_cont();
 
 while(delay_ms < xms)
 {
 if(get_delay_cont() > delay_start)
 {
 if((get_delay_cont() - delay_start) == 10000)
 {
 delay_ms ++;                               delay_start= get_delay_cont();
 }
 }
 else
 {
 if((MAX_DEAY - delay_start + get_delay_cont()) == 10000)
 {
 delay_ms ++;
 delay_start= get_delay_cont();
 }
 }
 }
 }
 
 void tmr_delay_s(uint16_t xs)
 {
 uint16_t delay_s = 0;
 uint16_t delay_start= get_delay_cont();
 
 while(delay_s < xs)
 {
 if(get_delay_cont() > delay_start)
 {
 if((get_delay_cont() - delay_start) == 10000)
 {
 delay_ms ++;
 delay_start= get_delay_cont();
 }
 }
 else
 {
 if((MAX_DEAY - delay_start + get_delay_cont()) == 10000)
 {
 delay_ms ++;
 delay_start= get_delay_cont();
 }
 }
 if(delay_ms == 1000)
 {
 delay_ms = 0;
 delay_s ++;
 }
 }
 }
 
 /* ******************************************************************************
 //非阻塞型定时延时,以达到延时不独占CPU资源目的.
 调用延时前需先调用起始函数初始化,再根据延时函数是否返回set判断定时到期.
 ******************************************************************************* */
 uint16_t ub_delay_us = 0;
 
 void ub_delay_us_start(void)
 {
 ub_delay_us = 0;
 delay_start= get_delay_cont();
 }
 
 FlagStatus ub_delay_us(uin16_t nus)
 {
 if(ub_delay_us < xus)
 {
 if(get_delay_cont() > delay_start)
 {
 ub_delay_us = (get_delay_cont() - delay_start)/10;
 }
 else
 {
 ub_delay_us = (MAX_DEAY - delay_start + get_delay_cont())/10;
 }
 }
 else
 {
 return SET;
 }
 
 return RESET;
 }
 
 uint16_t ub_delay_ms = 0;
 
 void ub_delay_ms_start(void)
 {
 ub_delay_ms = 0;
 delay_start= get_delay_cont();
 }
 
 FlagStatus ub_delay_ms(uin16_t nms)
 {
 if(ub_delay_ms < xms)
 {
 if(get_delay_cont() > delay_start)
 {
 if((get_delay_cont() - delay_start) >= 10000)
 {
 ub_delay_ms ++;
 delay_start= get_delay_cont();
 }
 }
 else
 {
 if((MAX_DEAY - delay_start + get_delay_cont()) >= 10000)
 {
 ub_delay_ms ++;
 delay_start= get_delay_cont();
 }
 }
 }
 else
 {
 return SET;
 }
 
 return RESET;
 }
 
 |