欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32学习过程记录5——内部中断+PWM

程序员文章站 2024-02-25 18:22:03
...

目录

第五课,定时器中断(内部定时器的使用)

一.32的定时器中断简述

1.功能模式简述:

2.时钟周期计算:

3.时间值的寄存器

二.寄存器的设置过程

1.过程简述

2.配置代码(与上面对应)

3.快捷模板


第五课,定时器中断(内部定时器的使用)

一.32的定时器中断简述

1.功能模式简述:

三种记数模式,对应值预设值的不同:

STM32学习过程记录5——内部中断+PWM

一般基本上都是选用的内部时钟。

2.时钟周期计算:

AHB时钟通过APB1时钟的预分频,分给我们的时钟使用:而时钟频率计算规则为:当AHB/APB1=1时,我们所使用的定时器时钟的周期为APB1的周期,也就是说CK_Int = AHB = APB1。当AHB/APB1 ≠ 1时,那么我们定时器的周期等于APB1的两倍。

也就是说:AHB/APB1=1,CK_INT=APB1。AHB/APB1≠1,CK_INT=APB1x2

而CK_INT并不是最终的时钟,而是将CK_INT÷系数 得到CK_CNT 得到最终使用的时钟

3.时间值的寄存器

计数器当前值寄存器CNT

STM32学习过程记录5——内部中断+PWM

预分频寄存器TIMx_PSC

STM32学习过程记录5——内部中断+PWM

自动重装载寄存器(TIMx_ARR)
STM32学习过程记录5——内部中断+PWM

控制寄存器1(TIMx_CR1)
STM32学习过程记录5——内部中断+PWM

DMA中断使能寄存器(TIMx_DIER)

STM32学习过程记录5——内部中断+PWM

二.寄存器的设置过程

1.过程简述

①使能定时器时钟。
②初始化定时器,配置ARR,PSC。
③开启定时器中断,配置NVIC。
④使能定时器。
⑤编写中断服务函数。

注意:需要包含FWLIB目录下需要包含 tim.c

2.配置代码(与上面对应)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//第一个是中断所选择的中断时钟
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Period = 4999;
//记数次数 - 1	 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
//该值+1 确定一个记数的时间周期 算法 CN_INT / (该值+1) = 一次时钟的记数时间
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//设置时钟分割:TDTS = Tck_tim 没讲过 配置着重在于其他三个系数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//记数模式,TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//初始化 前者与第一步声明的定时器一样
//然而需要在声明之前进行中断分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/*------------------------*/
NVIC_InitTypeDef NVIC_InitStructure;

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开启中断 时钟 时钟模式 使能开启

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//检查指定的TIM中断发生与否
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除TIMx的中断待处理位:TIM中断源 
		LED1 = !LED1;
	}
}

3.快捷模板

配置函数

void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

	TIM_TimeBaseStructure.TIM_Period = arr;
	TIM_TimeBaseStructure.TIM_Prescaler =psc;  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	TIM_Cmd(TIM3, ENABLE);
}

中断函数

void TIM3_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update); 
		LED1=!LED1;
	}
}