US-延时的实现方法2-NXP的OS时基

mac2026-04-12  4

这个办法是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)