以中断方式启动时基单元
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事件。
预分频器PSC的值,设置为7,因此分频系数为8。8MHz÷8=1MHz。因此经过分频后得到的时钟频率为1MHz。
计数器的奇数方向为上计数。
自动重装寄存器ARR,设置为999,此时定时器的定时周期为1000。
因此溢出的频率为1MHZ÷1000=1kHz
重复计数器RCR的值设置为0,这样每1ms产生一次update事件。
保险起见,auto-reload preload(ARR寄存器的自动重装预加载)最好使能。

在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 */} |