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=FCLKPSC×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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!