STM32学习过程记录5——内部中断+PWM
程序员文章站
2024-02-25 18:22:03
...
目录
第五课,定时器中断(内部定时器的使用)
一.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;
}
}
上一篇: STM32F030xx硬件SPI调试记录
下一篇: 利用python抓取ZOL手环的参数数据