本帖最后由 annysky2012 于 2021-2-5 14:19 编辑
有网友在论坛发帖求教,定时器明明初始化时设置的定时值是1us,而自己设置定时值(1S)以后,而实际为4s。
网友帖子(https://bbs.eeworld.com.cn/thread-1156521-1-1.html)在这里。
经过自己对STM32的中文手册的查看,以及使用自己开发板运行后,现象依旧如此,开始也是百思不得其解。通过查看资料得知,原来网友把自动重装值设置的有问题。
现定义几个参数值:
//arr:自动重装值。
// psc:时钟预分频数
//定时器溢出间计算方法 :Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率单位 :Mhz
根据定时器的溢出时间计算方法,自动重装值和分频系数在设置时必须减一。而自动重装值又不能为0(这是不允许的)。所以在配置的时候,我们可以这样:
- TIM_TimeBaseStructure.TIM_Period = 2-1; //2 u second
- TIM_TimeBaseStructure.TIM_Prescaler = 24-1;//PrescalerValue
所以,Tout=((arr+1)*(psc+1))/Ft=(TIM_Period +1)*(TIM_Prescaler+1)/24000000 = 2*24/24000000=2us。
也就是每进一次中断时2us,在设置计数次数时要注意。
以下为回环函数:
/* USER CODE BEGIN 4 */
//定时时间2us
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t TimerCount = 0;
if(htim->Instance==TIM7)
{
TimerCount++;
if(TimerCount>250)//0.5mS
{
TimerCount=0;
HAL_GPIO_TogglePin(LD1_GPIO_Port,LD1_Pin);
}
}
}
/* USER CODE END 4 */
定时器初始化:
/**
* @brief TIM7 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM7_Init(void)
{
/* USER CODE BEGIN TIM7_Init 0 */
/* USER CODE END TIM7_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM7_Init 1 */
/* USER CODE END TIM7_Init 1 */
htim7.Instance = TIM7;
htim7.Init.Prescaler = 108-1;
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
htim7.Init.Period = 2-1;
htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
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();
}
/* USER CODE BEGIN TIM7_Init 2 */
HAL_TIM_Base_Start_IT(&htim7);
/* USER CODE END TIM7_Init 2 */
}
底层函数:
/**
* @brief TIM_Base MSP Initialization
* This function configures the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM7)
{
/* USER CODE BEGIN TIM7_MspInit 0 */
/* USER CODE END TIM7_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM7_CLK_ENABLE();
/* TIM7 interrupt Init */
HAL_NVIC_SetPriority(TIM7_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(TIM7_IRQn);
/* USER CODE BEGIN TIM7_MspInit 1 */
/* USER CODE END TIM7_MspInit 1 */
}
}
中断函数:
/**
* @brief This function handles TIM7 global interrupt.
*/
void TIM7_IRQHandler(void)
{
/* USER CODE BEGIN TIM7_IRQn 0 */
/* USER CODE END TIM7_IRQn 0 */
HAL_TIM_IRQHandler(&htim7);
/* USER CODE BEGIN TIM7_IRQn 1 */
/* USER CODE END TIM7_IRQn 1 */
}
运行结果: