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

目录

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

一.32的定时器中断简述

1.功能模式简述:

2.时钟周期计算:

3.时间值的寄存器

二.寄存器的设置过程

1.过程简述

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

3.快捷模板


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

一.32的定时器中断简述

1.功能模式简述:

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

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

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

预分频寄存器TIMx_PSC

自动重装载寄存器(TIMx_ARR)

控制寄存器1(TIMx_CR1)

DMA中断使能寄存器(TIMx_DIER)

二.寄存器的设置过程

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;
	}
}

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

康娜喵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值