HAL库 - 时基单元

以中断方式启动时基单元

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
参数htim:填写定时器句柄指针。例如:&htim1

回调函数

1234567
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){	if(htim == &htim1)//多个定时器共用此回调函数,需要对句柄进行判断	{		currentMiliSeconds++;//时间自增	}}

CubeMX

由于APB2的时钟频率为8MHZ,想要设置时基单元,产生1ms的update事件。
CubeMX
预分频器PSC的值,设置为7,因此分频系数为8。8MHz÷8=1MHz。因此经过分频后得到的时钟频率为1MHz。
计数器的奇数方向为上计数。
自动重装寄存器ARR,设置为999,此时定时器的定时周期为1000。
因此溢出的频率为1MHZ÷1000=1kHz
重复计数器RCR的值设置为0,这样每1ms产生一次update事件。

保险起见,auto-reload preload(ARR寄存器的自动重装预加载)最好使能。

NVIC配置
在NVIC选项卡,设置NVIC中断。
使能TIM1 update interrupt中断。

示例:自制延时函数

12345678910111213141516171819202122232425262728293031323334
/* Private variables ---------------------------------------------------------*/TIM_HandleTypeDef htim1;//计时器的句柄 /* USER CODE BEGIN PV */static volatile uint32_t currentMiliSeconds = 0;//定义一个变量,当前的毫秒数/* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);static void MX_GPIO_Init(void);static void MX_TIM1_Init(void);/* USER CODE BEGIN PFP */static void MyDelay(uint32_t Delay);static uint32_t MyGetTick(void);/* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */static void MyDelay(uint32_t Delay){	uint32_t expireTime = MyGetTick() + Delay;	while(MyGetTick() < expireTime){}}static uint32_t MyGetTick(void){	return currentMiliSeconds;}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//回调函数{	if(htim == &htim1)//多个定时器共用此回调函数,需要对句柄进行判断	{		currentMiliSeconds++;//每次中断,加1,每1s产生一次更新事件	}}

main

1234567891011121314
/* USER CODE BEGIN WHILE */	HAL_TIM_Base_Start_IT(&htim1);//以中断方式启动时基单元  while (1)  {		HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);		MyDelay(1000);		HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET);		MyDelay(1000);    /* USER CODE END WHILE */     /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */}
🔍 ×