这个办法是NXP-RC663源码看到的 比较高级

US延时知识之一

可以过一段时间去做一件事情

他比较暴力

每次用完摧毁tim下次再init tim

他的参数很精彩!

他不需要init--因为每次内部都需要自己init--deinit

他的调用时前台 他需要一个后台LOOP

这就是他的三元组吧

#include "phdriver_timer.h"


static pphDriver_TimerCallBck_t pTimerIsrCallBack;//回调函数 承接传入的参数!
static volatile uint32_t dwTimerExp;//作为延时调出的标识
static void phDriver_TimerIsrCallBack ( void ) { dwTimerExp = 1;}///回调函数的缺损值


//need HW -STM32TIM
extern TIM_HandleTypeDef htim6;

static void NXP_TIM6_Init( phDriver_Timer_Unit_t eTimerUnit, uint32_t dwTimePeriod )
{//MX做的全局接口 屏蔽掉 现在我们在这里封装一成
	TIM_MasterConfigTypeDef sMasterConfig = {0};
	htim6.Instance = TIM6;
	htim6.Init.Prescaler = ( SystemCoreClock / ( eTimerUnit * 1000 ) ) - 1;   
	htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
	htim6.Init.Period = dwTimePeriod * 1000;
	htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;


	if ( HAL_TIM_Base_Init ( &htim6 ) != HAL_OK )
	{
	Error_Handler();
	}
	sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
	sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
	if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
	{
	Error_Handler();
	}
}



uint8_t phDriver_TimerStart ( phDriver_Timer_Unit_t eTimerUnit, uint32_t dwTimePeriod, pphDriver_TimerCallBck_t pTimerCallBack )
{

    if ( pTimerCallBack == NULL )/*传入是NULL也就是没有定时回调函数 我们就给它一个缺损函数 就是延时功能!*/
    {
        dwTimerExp = 0;
        pTimerIsrCallBack = phDriver_TimerIsrCallBack;
    }
    else
    {
        pTimerIsrCallBack = pTimerCallBack;
    }
	/*经历上面 pTimerIsrCallBack 这个函数指针一定已经赋值了*/


    NXP_TIM6_Init ( eTimerUnit, dwTimePeriod );
    __HAL_TIM_CLEAR_IT ( &htim6, TIM_IT_UPDATE ); 
    HAL_TIM_Base_Start_IT ( &htim6 );

	/*经历上面 我们暴力初始化了TIM*/
    if ( pTimerCallBack == NULL )
    {
        while ( !dwTimerExp );  /* 一直毒蛇延时 */
    }


    return 1;
}

void phDriver_TimerStop ( void )
{
    HAL_TIM_Base_Stop_IT ( &htim6 );
    HAL_TIM_Base_DeInit ( &htim6 );
}



//在main.c找过来的

//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//{
//  /* USER CODE BEGIN Callback 0 */

//  /* USER CODE END Callback 0 */
//  if (htim->Instance == TIM7) {
//    HAL_IncTick();
//  }
//  /* USER CODE BEGIN Callback 1 */
//	if (htim->Instance == TIM6) {//时间到了怎么办?1关闭定时器2执行回调函数
//   	  pTimerIsrCallBack();
//	      phDriver_TimerStop();
//  }
//  /* USER CODE END Callback 1 */
//}







/*举例:
延时1S
phDriver_TimerStart(PH_DRIVER_TIMER_SECS,1,NULL);
延时2S
phDriver_TimerStart(PH_DRIVER_TIMER_SECS,2,NULL);
2S以后做一件事
phDriver_TimerStart(PH_DRIVER_TIMER_SECS,2,SHOW);
给OS提供时基
phStatus_t phOsal_StartTickTimer(uint32_t dwTimeMilliSecs)
{
	 phDriver_TimerStart(PH_DRIVER_TIMER_MILLI_SECS, dwTimeMilliSecs, pTickCallBack);
   return PH_OSAL_SUCCESS;
}
static pphDriver_TimerCallBck_t pTickCallBack;
                                pTickCallBack = 
								;

*/

 

 

#ifndef PHDRIVER_TIMER_H
#define PHDRIVER_TIMER_H

#ifdef __cplusplus
extern "C" {
#endif 

/********************************************************************************
 * 开始
 *******************************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>



typedef enum
{
    PH_DRIVER_TIMER_SECS       = 1,             /**< Seconds timer.      S*/
    PH_DRIVER_TIMER_MILLI_SECS = 1000,          /**< Milliseconds timer. MS */
    PH_DRIVER_TIMER_MICRO_SECS = 1000000        /**< Microseconds timer. US */
} phDriver_Timer_Unit_t;


typedef void (*pphDriver_TimerCallBck_t)(void);




/********************************************************************************
 * TIMER API's
 *******************************************************************************/

uint8_t phDriver_TimerStart(phDriver_Timer_Unit_t eTimerUnit, uint32_t dwTimePeriod, pphDriver_TimerCallBck_t pTimerCallBack);



/********************************************************************************
 * 结束
 *******************************************************************************/


#ifdef __cplusplus
}
#endif

#endif 

 

 

 


/* TIM7 init function */
void MX_TIM7_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 1000-1;//------------------
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 80;//------------------
  htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

 


上面是标准TIM7----时钟数他是80MHZ--1MS--计数是【Period 关注他的CNT  0123..80这样跑 MRK】
那么

MX_TIM7_Init();
HAL_TIM_Base_Start_IT(&htim7);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
else if (htim->Instance == TIM7)
{
once_timer_list_loop();
就是1MS执行一次!!
    
    
现在的NXP只是修改2处
    
htim6.Init.Prescaler = ( SystemCoreClock / ( eTimerUnit * 1000 ) ) - 1;   
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = dwTimePeriod * 1000;
看下图

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐