stm32定时器实验学习

需要用到的文件和函数如下:
(1)stm32f10x_tim.c
(2)stm32f10x_tim.h
(3) 自定义的定时器初始化函数
void TIM3_Int_Init(u16 arr,u16 psc)
(4)定时器时钟使能
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟

(5)定时器参数初始化函数
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

(6)使能定时器方式函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);//使能定时器3更新使能中断

(7)设置中断向量分组以及中断初始化
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

NVIC_Init(&NVIC_InitStrure);

(8)打开定时器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

TIM_Cmd( TIM3, ENABLE);//打开定时器

(9)编写定时器中断函数
void TIM3_IRQHandler(void)—定时器中断处理函数名必须要用文件中固定的,否则不起作用

(10)获取某种中断的状态
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)

	TIM_GetITStatus(TIM3, TIM_IT_Update)

(11)清除中断状态标志位
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

1…定时器实验中在库函数文件夹中需要先加入两个头文件

(1)stm32f10x_tim.c
(2)stm32f10x_tim.h

2…在创建的timer.c文件中记得调用加入的 文件

3…对定时器进行初始化

void TIM3_Int_Init(u16 arr,u16 psc)

(1)对定时器时钟进行使能

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟

(2)初始化定时器参数

void TIM_TimeBaseInit(TIM_TypeDef TIMx, TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct)**

周期和预分频值再主函数中初始化时进行设置 TIM3_Int_Init(4999,7199);
TIM_TimeBaseStructure.TIM_Period=arr;//tim周期
TIM_TimeBaseStructure.TIM_Prescaler=psc;//预分频值

创建定时器初始化参数结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//定时器参数初始化(周期,预分频,计数模式,时钟分频,重复计数)
TIM_TimeBaseStructure.TIM_Period=arr;//tim周期	
TIM_TimeBaseStructure.TIM_Prescaler=psc;//预分频值
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频,不分频,就是72Mhz
//TIM_TimeBaseStructure.TIM_RepetitionCounter=//重复计数(高级定时器才能用到)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

(3)使能定时器中断

void TIM_ITConfig(TIM_TypeDef TIMx, uint16_t TIM_IT, FunctionalState NewState)*

TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);//使能定时器3更新使能中断

(4)设置中断向量分组以及中断初始化

void NVIC_Init(NVIC_InitTypeDef NVIC_InitStruct)*

设置中断通道这个参数,在函数中是找不到的,需要到core文件夹
启动头文件 startup_stm32f10x_hd.s中找到
NVIC_InitStrure.NVIC_IRQChannel=TIM3_IRQn;//通道3

	创建中断初始化参数结构体
	NVIC_InitTypeDef NVIC_InitStructure;
	//中断分组参数初始化
	NVIC_InitStrure.NVIC_IRQChannel=TIM3_IRQn;//通道3
	NVIC_InitStrure.NVIC_IRQChannelPreemptionPriority=2;抢占优先级
	NVIC_InitStrure.NVIC_IRQChannelSubPriority=1;//响应优先级
	NVIC_InitStrure.NVIC_IRQChannelCmd=ENABLE;//使能
	NVIC_Init(&NVIC_InitStrure);

(5)打开定时器

void TIM_Cmd(TIM_TypeDef TIMx, FunctionalState NewState)*

TIM_Cmd( TIM3, ENABLE);//打开定时器

4.写定时器中断处理函数

void TIM3_IRQHandler(void)—定时器中断处理函数名必须要用文件中固定的,否则不起作用

TIM3_IRQHandler 以及各个函数名均在core文件夹中的
启动头文件中startup_stm32f10x_hd.s找到

(1)获取某种中断的状态

ITStatus TIM_GetITStatus(TIM_TypeDef TIMx, uint16_t TIM_IT)*

TIM_GetITStatus(TIM3, TIM_IT_Update)

(2)清除中断状态标志位

void TIM_ClearITPendingBit(TIM_TypeDef TIMx, uint16_t TIM_IT)*

TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

总体代码如下

void TIM3_Int_Init(u16 arr,u16 psc)
{
	
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStrure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
	
//定时器参数初始化
TIM_TimeBaseStructure.TIM_Period=arr;//tim周期	
TIM_TimeBaseStructure.TIM_Prescaler=psc;//预分频值
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;////计数模式,向上计数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频,不分频,就是72Mhz
//TIM_TimeBaseStructure.TIM_RepetitionCounter=//重复计数(高级定时器才能用到)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

//使能定时器中断
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
	
	//中断分组参数初始化
	NVIC_InitStrure.NVIC_IRQChannel=TIM3_IRQn;
	NVIC_InitStrure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStrure.NVIC_IRQChannelSubPriority=1;
	NVIC_InitStrure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStrure);


TIM_Cmd( TIM3, ENABLE);//打开定时器
}
//定时器 3 中断服务程序⑥
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)
	{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除
			LED0=!LED0;
			LED1=!LED1;

	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永栀哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值