US-延时的实现方法2-NXP的OS时基
这个办法是NXP-RC663源码看到的 比较高级US延时知识之一可以过一段时间去做一件事情他比较暴力每次用完摧毁tim下次再init tim他的参数很精彩!他不需要init--因为每次内部都需要自己init--deinit他的调用时前台 他需要一个后台LOOP这就是他的三元组吧#include "phdriver_timer.h"static p...
这个办法是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;
看下图
更多推荐
所有评论(0)