0%

HAL库 - 时基单元

以中断方式启动时基单元

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

回调函数

1
2
3
4
5
6
7
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中断。

示例:自制延时函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 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 */
}