Bootstrap

十一、STM32的TIM(二)(定时器定时中断)

介绍:本章通过详细的步骤讲解了STM32定时器的定时中断配置和外部时钟配置。通过理解定时器的工作原理和中断机制,以及如何配置外部时钟源驱动定时器,读者能够在实际应用中更灵活地使用定时器来实现高精度的定时任务和外部事件的同步。

目录

一、 函数的解读

二、定时器定时中断程序

三、定时器定时中断程序的解读 

四、定时器定时中断主程序 

五、 定时器定时中断主程序的解读

六、 程序现象


一、 函数的解读

1.1

TIM_DeInit:将TIMx外设寄存器初始化为默认的重置值。 

1.2

TIM_TimeBaseInit:初始化TIMx时间基准单元外设(时基单元)。 

1.3

TIM_TimeBaseStructInit:用默认值填充每个TIM_TimeBaseInitStruct成员。 

1.4

TIM_Cmd:启用或禁用指定的TIM外设。

1.5

TIM_ITConfig:使能中断外设输出。

1.6

TIM_InternalClockConfig:配置TIMx的内部时钟(RCC)。 

 1.7

TIM_ITRxExternalClockConfig:配置TIMx内部触发器为外部时钟。

1.8

 TIM_TIxExternalClockConfig:配置TIMx触发器为外部时钟。

1.9

TIM_ETRConfig:单独用来配置ETR引脚的预分频器、极性、滤波器的参数。 

1.10

TIM_PrescalerConfig:单独写预分频值。 

1.11

TIM_CounterModeConfig:用来改变计数器的计数模式。 

1.12

TIM_ARRPreloadConfig:自动重装器预装功能配置。 

1.13 

TIM_SetCounter:给计数器写入一个值。 

1.14

TIM_SetAutoreload:给自动重装器一个值。 

1.15

TIM_GetCounter:获取当前计数器的值。 

1.16

TIM_GetPrescaler:获取TIMx预调度器值。

1.17

TIM_GetFlagStatus:检查是否设置了指定的TIM标志(推荐在主程序中使用)。

1.18

TIM_ClearFlag:清除标志位(推荐在主程序中使用)。 

1.19

TIM_GetITStatus: 检查是否设置了指定的TIM标志(推荐在中断程序中使用)。

1.20

TIM_ClearITPendingBit: 清除TIMx的中断挂起位(推荐在中断程序中使用)

二、定时器定时中断程序

2.1接线图:

2.2 程序的实现Timer.c

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

三、定时器定时中断程序的解读 

3.1

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE):开启TIM2的时钟

3.2

TIM_InternalClockConfig(TIM2):配置时钟源;选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟。 

3.3

TIM_TimeBaseInit:时基单元初始化。

1.TIM_ClockDivision:时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能。

2.TIM_CounterMode:计数器模式,选择向上计数。 

3.TIM_Period:计数周期,即ARR的值;

4.TIM_Prescaler:预分频器,即PSC的值。

5.TIM_RepetitionCounter:重复计数器,高级定时器才会用到。

3.4

TIM_ITConfig:开启TIM2的更新中断。

3.5

NVIC_PriorityGroupConfig:配置NVIC为分组2。

 3.6

NVIC_Init:NVIC初始化(之前章节讲过)。

3.7

TIM_Cmd:使能TIM2,定时器开始运行。 

四、定时器定时中断主程序 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{
	OLED_Init();
	Timer_Init();
	
	OLED_ShowString(1, 1, "Num:");
	
	while (1)
	{
		OLED_ShowNum(1, 5, Num, 5);
	}
}

void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

五、 定时器定时中断主程序的解读

5.1

TIM2_IRQHandler:在启动文件中找到的对应中断函数名称(startup_stm32f10x_md.s )。

5.2

TIM_GetITStatus :检查是否设置了指定的TIM标志。

5.3

TIM_ClearITPendingBit:清除标志位。 

 

六、 程序现象

可以观察到每一秒计数器加一。

到此本篇文章结束。

At the end of this article, applaud yourself again!!

;