前面方法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 */
}