一,定时器原理
1,官方板子上的定时器资源
2,可以到 比赛资料数据手册的这一章找相关定时器的复用管角。
3,两个关键参数
1)预分频器里面的分频系数----想20分频就写19
2)重装载寄存器arr,想要记1000就写999,
举例,系统时钟80MHz,利用定时器六想定时一秒,分频给7999,因为是基本定时器只能向上计数,又因为是最大16位即65535。那arr就给9999,
每记到一次10000,就出发中断,然后再重新计时进行循环。
二,CuneMX的相关配置
1,定时器的配置
2,中断配置
三,移植
timer.c
#include "basic_timer6/bsp_basic_timer6.h"
TIM_HandleTypeDef htim6;
void BASIC_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6;
htim6.Init.Prescaler = 7999;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 9999;
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();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6)
{
__HAL_RCC_TIM6_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
}
}
timer.h
#include "main.h"
extern TIM_HandleTypeDef htim6;
void BASIC_TIM6_Init(void);
main.h
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
i++;
sprintf((char*)Lcd_Disp_String,"timer: %03d",(unsigned int )i);
LCD_DisplayStringLine(Line5,Lcd_Disp_String);
HAL_TIM_Base_Start_IT(&htim6);
}
//别忘了在初始化之后加上
HAL_TIM_Base_Start_IT(&htim6);
it.c
void TIM6_DAC_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_DAC_IRQn 0 */
/* USER CODE END TIM6_DAC_IRQn 0 */
HAL_TIM_IRQHandler(&htim6);
/* USER CODE BEGIN TIM6_DAC_IRQn 1 */
/* USER CODE END TIM6_DAC_IRQn 1 */
}