#include "delay_cfg.h"
///////////////////////////////////////////////////////////////////////////////
//////函 数: void Delay_us(UINT32_T us)
//////功 能: 微妙的延时函数
//////输入参数: 延时时间
//////输出参数: 无
//////说 明:
//////////////////////////////////////////////////////////////////////////////
void Delay_us ( UINT32_T us )
{
DelayN_us ( us );
}
///////////////////////////////////////////////////////////////////////////////
//////函 数: void Delay_ms(UINT32_T ms)
//////功 能: 毫秒的延时函数
//////输入参数: 延时时间
//////输出参数: 无
//////说 明:
//////////////////////////////////////////////////////////////////////////////
void Delay_ms ( UINT32_T ms )
{
if (ms!= 0 )
{
//---等待延时到达
SysTickTask_WaitDecTick ( ms );
}
}
///////////////////////////////////////////////////////////////////////////////
//////函 数: void Delay_s(UINT32_T ms)
//////功 能: 秒延时
//////输入参数: 延时时间
//////输出参数: 无
//////说 明:
//////////////////////////////////////////////////////////////////////////////
void Delay_s ( UINT32_T s )
{
if ( s != 0 )
{
while ( s-- )
{
Delay_ms ( 1000 );
}
}
}
///////////////////////////////////////////////////////////////////////////////
//////函 数: void DelayN_us(UINT32_T us)
//////功 能: 查询的方式,使用系统滴答定时器的作为延时计算
//////输入参数: 微妙的延时时间
//////输出参数: 无
//////说 明:
//////////////////////////////////////////////////////////////////////////////
void DelayN_us ( UINT32_T us )
{
if ( us != 0 )
{
//---系统中断关闭
CLI ();
if (us> 6 )
{
//---等待时间的到达
SysTickTask_WaitTimer ( us );
}
else if (us> 1 )
{
//---软件NOP延时
Delay_nop ( ( (us- 1 )* us+ 1 ) * ( SYS_CLOCK_MHZ - 1 ) );
}
//---系统中断打开 SEI ()
; }
} /////////////////////////////////////////////////////////////////////////////// //////函 数: void DelayN_ms(UINT32_T ms) //////功 能: 查询的方式,使用系统滴答定时器的作为延时计算 //////输入参数: 毫秒的延时时间 //////输出参数: //////说 明: ////////////////////////////////////////////////////////////////////////////// void DelayN_ms ( UINT32_T ms
) { if ( ms
!= 0 ){
while ( ms
-- ){
DelayN_us (
1000 )
; WDT_RESET ()
; }}
} /////////////////////////////////////////////////////////////////////////////// //////函 数: void DelayN_s(UINT32_T s) //////功 能: 查询的方式,使用系统滴答定时器的作为延时计算 //////输入参数: 秒的延时时间 //////输出参数: //////说 明: ////////////////////////////////////////////////////////////////////////////// void DelayN_s ( UINT32_T s
) { if ( s
!= 0 ){
while ( s
-- ){
DelayN_ms (
1000 )
; }}
} /////////////////////////////////////////////////////////////////////////////// //////函 数: void Delay_nop(UINT32_T nop) //////功 能: 系统时钟的延时 //////输入参数: 系统时钟延时的个数 //////输出参数: 无 //////说 明: ////////////////////////////////////////////////////////////////////////////// void Delay_nop ( UINT32_T nop
) { if ( nop
!= 0 ){
while ( nop
-- ){
__asm (
"NOP" )
; }}
} /////////////////////////////////////////////////////////////////////////////// //////函 数: void Delay_1us(UINT32_T us) //////功 能: 使用nop延时函数,进行1us的整数倍的延时时间的计算 //////输入参数: us延时的个数 //////输出参数: 无 //////说 明: ////////////////////////////////////////////////////////////////////////////// void Delay_1us ( UINT32_T us
) { UINT32_T i
= 0 ; if ( us
!= 0 ){
for ( i
= 0 ; i
< us
; i
++ ){
Delay_nop (
( SYS_CLOCK_MHZ - 1 ) )
; }}
} #ifndef DELAY_CFG_H
#define DELAY_CFG_H
//////////////////////////////////////////////////////////////////////////////////////
//---使用包含的头文件
#include "complier_lib.h"
#ifdef USE_MCU_STM32
#include "systick_task.h"
#endif
//---函数定义
void Delay_us ( UINT32_T us ) ;
void Delay_ms ( UINT32_T ms ) ;
void Delay_s ( UINT32_T s ) ;
void DelayN_us ( UINT32_T us ) ;
void DelayN_ms ( UINT32_T ms ) ;
void DelayN_s ( UINT32_T s ) ;
void Delay_nop ( UINT32_T nop ) ;
void Delay_1us ( UINT32_T us ) ;
//////////////////////////////////////////////////////////////////////////////////////
#endif /*DELAY_CFG_H */
#ifndef DELAY_CFG_H
#define DELAY_CFG_H
//////////////////////////////////////////////////////////////////////////////////////
//---使用包含的头文件
#include "complier_lib.h"
#ifdef USE_MCU_STM32
#include "systick_task.h"
#endif
//---函数定义
void Delay_us ( UINT32_T us ) ;
void Delay_ms ( UINT32_T ms ) ;
void Delay_s ( UINT32_T s ) ;
void DelayN_us ( UINT32_T us ) ;
void DelayN_ms ( UINT32_T ms ) ;
void DelayN_s ( UINT32_T s ) ;
void Delay_nop ( UINT32_T nop ) ;
void Delay_1us ( UINT32_T us ) ;
//////////////////////////////////////////////////////////////////////////////////////
#endif /*DELAY_CFG_H */
#ifndef SYSTICK_CFG_H
#define SYSTICK_CFG_H
//////////////////////////////////////////////////////////////////////////////////////
//---使用包含的头文件
#include "complier_lib.h"
//---变量定义
//---结构体声明
typedef struct _SysTick_HandlerType SysTick_HandlerType;
//---结构体指针的声明
typedef struct _SysTick_HandlerType * pSysTick_HandlerType;
//---定义滴答的计数计数方式
typedef enum
{
SysTick_1MS_FREQ = 1000U ,
SysTick_10MS_FREQ = 100U ,
SysTick_100MS_FREQ = 10U ,
SysTick_FREQ = SysTick_1MS_FREQ ,
} SysTickFreqType;
//---滴答定时器的结构体
struct _SysTick_HandlerType
{
VLTUINT32_T msgTickInc; //---定时器递加计数器
VLTUINT32_T msgTickDec; //---定时器递减计数器
VLTUINT32_T msgTickOverFlow; //---定时计数器溢出
VLTUINT32_T msgFuncTickTaskInc; //---任务计数器
VLTUINT32_T msgFunTickTaskMaxInc; //---任务计数上限
void (* msgHalTickTask )(void ); //---hal库的计数方式
void (* msgFuncTickTask )(void ); //---注册任务函数
UINT8_T (* msgTask )( SysTick_HandlerType * SysTickHandlerType, UINT8_T msg ); //---任务处理函数
} ;
//---命令消息体
#define SysTick_MSG_Init 0
#define SysTick_MSG_DeInit 1
#define SysTick_MSG_IRQTick 2
//---函数定义
UINT8_T SysTick_Init ( UINT32_T tickInc, void ( * pHalTickInc )( void ) ) ;
UINT8_T SysTick_DeInit ( void ) ;
UINT8_T SysTick_TickTask ( UINT32_T tickFreq, void ( * pLEDTickInc )( void ) ) ;
UINT8_T SysTick_WaitDecTick ( UINT32_T waitDecTick ) ;
UINT32_T SysTick_GetTick ( void ) ;
UINT8_T SysTick_IRQTick ( void ) ;
UINT8_T SysTick_WaitTimer ( UINT32_T usTimer ) ;
//////////////////////////////////////////////////////////////////////////////////////
#endif /* SYSTICK_CFG_H */ #include "systick_cfg.h"
//---变量定义
SysTick_HandlerType g_SysTick;
pSysTick_HandlerType pSysTick = & g_SysTick;
extern HAL_TickFreqTypeDef uwTickFreq;
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_Suspend ( void )
{
#ifdef USE_MCU_STM32
//---不使能系统滴答定时器的中断
SysTick -> CTRL &= ~ SysTick_CTRL_TICKINT_Msk ;
#endif
return OK_0 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_Resume ( void )
{
#ifdef USE_MCU_STM32
//---使能系统滴答定时器的中断
SysTick -> CTRL |= SysTick_CTRL_TICKINT_Msk ;
#endif
return OK_0 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明: 最好1ms的滴答定时器
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_Init ( UINT32_T tickInc, void (* pHalTickInc)(void ))
{
#ifdef USE_MCU_STM32
//---产生1ms的时间滴答器---该初始化函数没有注册中断
LL_InitTick (SystemCoreClock, tickInc);
//---设置中断抢占分组
NVIC_SetPriorityGrouping (NVIC_PRIORITYGROUP_4 );
//---配置滴答定时器中断---设置为最低优先级
NVIC_SetPriority (SysTick_IRQn , NVIC_EncodePriority (NVIC_GetPriorityGrouping (), 0 , 0 ));
//---使能滴答定时的中断---默认是1ms
SysTick_Resume ();
//---hal定时计数器
if ((pHalTickInc!= NULL )&& (pSysTick!= NULL ))
{
uwTickFreq = HAL_TICK_FREQ_DEFAULT ;
pSysTick-> msgHalTickTask = pHalTickInc;
}
else
{
return ERROR_1 ;
}
#endif
return OK_0 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_DeInit ( void )
{
#ifdef USE_MCU_STM32
SysTick_Suspend ();
#endif
return OK_0 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_TickTask ( UINT32_T tickFreq, void (* pLEDTickInc)(void ))
{
if ((pLEDTickInc!= NULL )&& (pSysTick!= NULL ))
{
//---注册任务函数
pSysTick-> msgFuncTickTask = pLEDTickInc;
//---清零任务计数函数
pSysTick-> msgFuncTickTaskInc = 0 ;
//---设置任务函数的最大计数上限
pSysTick-> msgFunTickTaskMaxInc = tickFreq;
}
return OK_0 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_WaitDecTick ( UINT32_T waitDecTick)
{
if (pSysTick!= NULL )
{
//---计时函数
pSysTick-> msgTickDec = waitDecTick;
//---等待时间到达
while (pSysTick-> msgTickDec != 0 )
{
WDT_RESET ();
}
return OK_0 ;
}
return ERROR_1 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT32_T SysTick_GetTick ( void )
{
if (pSysTick!= NULL )
{
return pSysTick-> msgTickInc;
}
return 0 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_IRQTick ( void )
{
if (pSysTick!= NULL )
{
//---递加计数
pSysTick-> msgTickInc++;
pSysTick-> msgFuncTickTaskInc++;
//---判断是否溢出
if (pSysTick-> msgTickInc== 0 )
{
pSysTick-> msgTickOverFlow++;
}
//---注册hal延时函数
if (pSysTick-> msgHalTickTask != NULL )
{
pSysTick-> msgHalTickTask ();
}
//---判断任务函数
if ((pSysTick-> msgFunTickTaskMaxInc!= 0 )&& (pSysTick-> msgFunTickTaskMaxInc== pSysTick-> msgFuncTickTaskInc)&& (pSysTick-> msgFuncTickTask != NULL ))
{
pSysTick-> msgFuncTickTaskInc = 0 ;
pSysTick-> msgFuncTickTask ();
}
//---递减计数
if (pSysTick-> msgTickDec!= 0 )
{
pSysTick-> msgTickDec--;
}
return OK_0 ;
}
return ERROR_1 ;
}
///////////////////////////////////////////////////////////////////////////////
//////函 数:
//////功 能:
//////输入参数:
//////输出参数:
//////说 明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T SysTick_WaitTimer ( UINT32_T usTimer)
{
#ifdef USE_MCU_STM32
UINT32_T load = SysTick -> LOAD ;
UINT32_T ctrl = SysTick -> CTRL ;
//---关闭定时器,时钟选择为系统时钟,不进行8分频
SysTick -> CTRL = 0x00000004 ;
//---计算装载值
SysTick -> LOAD = usTimer* (SYS_CLOCK_MHZ - 1 ); //---清零计数器 SysTick -> VAL = 0x00 ; //---使能计数器计数 SysTick -> CTRL |= 0x01 ; //---等待计数到0 while (
! (
SysTick -> CTRL & 0x00010000 )){
WDT_RESET ()
; }
//---关闭定时器,时钟选择为系统时钟,不进行8分频 SysTick -> CTRL = 0x00000004 ; //---恢复装载值 SysTick -> LOAD = load
; //---清零计数器 SysTick -> VAL = 0x00 ; //---恢复计数器配置 SysTick -> CTRL = ctrl
; #endif return OK_0 ; }