US延时3--基于NXP对硬定时器的思路

前面方法2比较温柔 现在的NXP是每次都init  前面的只是一个us的接口 这个可以提供更多

并且我找到过一个问题 
https://mp.csdn.net/postedit/102894436

现在在表达一下:

#include "phdriver_timer.h"



static volatile uint32_t dwTimerExp;//作为延时调出的标识
static void phDriver_TimerIsrCallBack ( void ) { dwTimerExp = 1;}///回调函数的缺损值
pphDriver_TimerCallBck_t pTimerIsrCallBack;//回调函数 承接传入的参数!
/*切糕的方式是在TIM初始化以后设置计数值 比较柔和 这个NXP的风格非常狂暴 每次都是inittime在无情摧毁它 它需要一个对接的硬定时器*/
extern TIM_HandleTypeDef htim7;


static void NXP_TIM_Init( phDriver_Timer_Unit_t eTimerUnit, uint32_t dwTimePeriod )
{//MX做的全局接口 屏蔽掉 现在我们在这里封装一成
	TIM_MasterConfigTypeDef sMasterConfig = {0};
	htim7.Instance = TIM7;
	htim7.Init.Prescaler = ( SystemCoreClock / ( eTimerUnit * 1 ) ) - 1;   
	htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
	htim7.Init.Period = dwTimePeriod * 1;
	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();
	}
}



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_TIM_Init ( eTimerUnit, dwTimePeriod );
    __HAL_TIM_CLEAR_IT ( &htim7, TIM_IT_UPDATE ); 
    HAL_TIM_Base_Start_IT ( &htim7 );

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


    return 1;
}


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



//在main.c找过来的

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

//  /* USER CODE END Callback 0 */
//  if (htim->Instance == TIM7) {
//   	  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>

#include "tim.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);


extern void phDriver_TimerStop ( void );
extern pphDriver_TimerCallBck_t pTimerIsrCallBack;
/********************************************************************************
 * 结束
 *******************************************************************************/


#ifdef __cplusplus
}
#endif

#endif 

它 被 调用的 接口 其实就是一个!MX最开始的init也不要了 因为我会每次start自己init

后台的回调

#include "phdriver_timer.h"
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM6) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  if (htim->Instance == TIM7) {
             pTimerIsrCallBack();
          phDriver_TimerStop();
  }
  /* USER CODE END Callback 1 */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值