STM32F1与STM32CubeIDE快速入门-定时器定时模式

定时器定时模式

在这里插入图片描述

1、定时器的定时模式介绍

在定时器模式下,定时器模块从具有已知频率的内部时钟源获得时钟。 因此时钟频率是已知的,溢出时间也可以由预加载寄存器计算和控制以获得任意选择的时间间隔。 每次定时器溢出时,定时器都会向 CPU 发出一个中断信号,指示指定的时间间隔结束。

这种操作模式通常用于在每个特定时间间隔完成特定操作。 并实现系统中各种任务和事件之间的计时和同步。 它还可以替代各种情况下的延迟,以获得更好的系统响应。

在这里插入图片描述

定时器输出时间如下:

T



O


U


T

T

i

c

k

C

o

u

n

t

s

×

T

i

c

k

T

i

m

e

T_{OUT} = TickCounts \times TickTime

TOUT​=TickCounts×TickTime

T



O


U


T

P

S

C

×

P

r

e

l

o

a

d

F

C

L

K

T_{OUT} = \frac{PSC \times Preload}{F_{CLK}}

TOUT​=FCLK​PSC×Preload​

从上述公式可以输出时间间隔由预分频器值、时钟频率和定时器预加载寄存器的值决定。比如STM32F103VE的最高运行频率是72MHz,即





F



C


L


K

72

M

H

z

F_{CLK} = 72MHz

FCLK​=72MHz。假设预分频器的值设置为10000,输出时间为1秒,则预载值(Preload)可以通过公式得到7200:

1


s


e


c

10000

×

P

r

e

l

o

a

d

72

M

H

z

1sec = \frac{10000 \times Preload}{72MHz}

1sec=72MHz10000×Preload​

2、定时器的定时模式配置

第一步、创建工程

在这里插入图片描述

第二步、选择芯片

在这里插入图片描述

第三步、配置系统时钟

在这里插入图片描述

在这里插入图片描述

第四步、配置Timer

1)使能并配置TIM2

在这里插入图片描述

2)配置TIM2中断

在这里插入图片描述

3)配置LED引脚

在这里插入图片描述

第五步、开户系统调试配置

在这里插入图片描述

保存配置,并生成工程代码。

3、生成代码及功能实现

配置工程生成的代码如下:

1)TIM2初始化代码

main.c文件中:

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
35
36
37
38
39
40
41
42
/\*\*
\* @brief TIM2 Initialization Function
\* @param None
\* @retval None
\*/
static void MX\_TIM2\_Init(void) {

/\* USER CODE BEGIN TIM2\_Init 0 \*/

/\* USER CODE END TIM2\_Init 0 \*/

TIM_ClockConfigTypeDef sClockSourceConfig = { 0 };
TIM_MasterConfigTypeDef sMasterConfig = { 0 };

/\* USER CODE BEGIN TIM2\_Init 1 \*/

/\* USER CODE END TIM2\_Init 1 \*/
htim2.Instance = TIM2;
htim2.Init.Prescaler = 10000;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 7200;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL\_TIM\_Base\_Init(&htim2) != HAL_OK) {
Error\_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL\_TIM\_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) {
Error\_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL\_TIMEx\_MasterConfigSynchronization(&htim2, &sMasterConfig)
!= HAL_OK) {
Error\_Handler();
}
/\* USER CODE BEGIN TIM2\_Init 2 \*/

/\* USER CODE END TIM2\_Init 2 \*/

}

2)LED引脚初始化代码

main.c文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/\*\*
\* @brief GPIO Initialization Function
\* @param None
\* @retval None
\*/
static void MX\_GPIO\_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = { 0 };

/\* GPIO Ports Clock Enable \*/
\_\_HAL\_RCC\_GPIOC\_CLK\_ENABLE();
\_\_HAL\_RCC\_GPIOA\_CLK\_ENABLE();

/\*Configure GPIO pin Output Level \*/
HAL\_GPIO\_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);

/\*Configure GPIO pin : LED0\_Pin \*/
GPIO_InitStruct.Pin = LED0_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL\_GPIO\_Init(LED0_GPIO_Port, &GPIO_InitStruct);

}

3)TIM2中断初始化

main.c文件中:

1
2
3
4
5
6
7
8
9
10
11
/\*\*
\* @brief NVIC Configuration.
\* @retval None
\*/
static void MX\_NVIC\_Init(void)
{
/\* TIM2\_IRQn interrupt configuration \*/
HAL\_NVIC\_SetPriority(TIM2_IRQn, 0, 0);
HAL\_NVIC\_EnableIRQ(TIM2_IRQn);
}

4)TIM2中断响应处理

stm32f1xx_it.c文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/\*\*
\* @brief This function handles TIM2 global interrupt.
\*/
void TIM2\_IRQHandler(void)
{
/\* USER CODE BEGIN TIM2\_IRQn 0 \*/

/\* USER CODE END TIM2\_IRQn 0 \*/
HAL\_TIM\_IRQHandler(&htim2);
/\* USER CODE BEGIN TIM2\_IRQn 1 \*/

/\* USER CODE END TIM2\_IRQn 1 \*/
}

函数HAL_TIM_IRQHandler用于处理Timer的中断响应,HAL_TIM_IRQHandler函数中,调用了HAL_TIM_PeriodElapsedCallback回调函数,因此只需要实现HAL_TIM_PeriodElapsedCallback即可实现应用功能。在stm32f1xx_it.c文件中添加如下代码:

1
2
3
4
5
6
7
8
9
/\* USER CODE BEGIN 1 \*/
void HAL\_TIM\_PeriodElapsedCallback(TIM_HandleTypeDef \*htim) {

if (htim->Instance == TIM2) {
HAL\_GPIO\_TogglePin(LED0_GPIO_Port, LED0_Pin);
}
}
/\* USER CODE END 1 \*/

5)程序入口

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
35
36
37
38
39
40
41
42
43
44
/\*\*
\* @brief The application entry point.
\* @retval int
\*/
int main(void)
{
/\* USER CODE BEGIN 1 \*/

/\* USER CODE END 1 \*/

/\* MCU Configuration--------------------------------------------------------\*/

/\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
HAL\_Init();

/\* USER CODE BEGIN Init \*/
/\* USER CODE END Init \*/

/\* Configure the system clock \*/
SystemClock\_Config();

/\* USER CODE BEGIN SysInit \*/

/\* USER CODE END SysInit \*/

/\* Initialize all configured peripherals \*/
MX\_GPIO\_Init();
MX\_TIM6\_Init();
/\* USER CODE BEGIN 2 \*/
// 启动定时器
HAL\_TIM\_Base\_Start\_IT(&htim2);
/\* USER CODE END 2 \*/

/\* Infinite loop \*/
/\* USER CODE BEGIN WHILE \*/
while (1)
{
/\* USER CODE END WHILE \*/

/\* USER CODE BEGIN 3 \*/
}
/\* USER CODE END 3 \*/
}

文章来源: https://iotsmart.blog.csdn.net/article/details/123301864