STM32
登录
直播中
温暖镜头
9年用户
999经验值
擅长:电源/新能源 制造/封装
私信
关注
[问答]
STM32通用定时器中断是什么意思
开启该帖子的消息推送
STM32
通用定时器
中断
通用定时器的工作过程是怎样的?
STM32
通用定时器中断是什么意思?
回帖
(1)
张清华
2021-11-24 16:15:18
本次博客以正点原子战舰资料以及STM32中文参考资料为主要参考。
本次博客主要讲解通用定时器中断,先讲解一下相关概念,然后在进行代码的实现。
**
通用定时器工作过程:
**(在定时器中断中,我们只是用到了定时器的时基单元)
**
时钟源
**
在介绍时基单元之前,我们还需要了解时钟源。从通用定时器的工作过程图我们可以看到,定时器的时钟来源有很多。而我们常用的便是来自RCC的TIMxCLK。
通用定时器是挂载在APB1总线上的,APB1的时钟最高为36MHZ。
这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx 的时钟是 APB1时钟的2倍。
由STM32时钟系统框图以及默认调用SystemInit函数情况下,我们可以得出:CK_INT时钟为72MHz。即通用定时器的时钟频率是 72MHz。
**
时基单元
**
知道了时钟源后我们在来看时基单元。(大家在看下面概念的时候结合上面的图会更好的理解。)
时基单元包含:
● 预分频器寄存器 (TIMx_PSC)
● 计数器寄存器(TIMx_CNT)
● 自动装载寄存器 (TIMx_ARR)
1.TIMx_PSC预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
2.计数器由预分频器的时钟输出CK_CNT驱动 。
3.自动装载寄存器是预先装载的, 当计数器达到溢出条件(向下计数时的下溢条件) 产生更新事件。Arr的重装周期是1~65535。
**
计数器模式
**
计数器模式有三种,分别是:向上计数,向下计数,向上向下计数
**
定时器中断时间计算
**
最后再来介绍进入定时器中断的时间,它的计算公式为:
附上小白个人理解:
以上便是关于定时器中断的相关理论知识,接下来通过库函数来配置代码。
**
代码实现
**
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
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寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
LED1=!LED1;
}
}
1) TIM3 时钟使能。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。
2) 初始化定时器参数,设置自动重装值, 分频系数,计数方式等。
这里主要说一下TIM_ClockDivision与TIM_Prescaler这两个参数。
在本实验中,我们并没有用到这个参数。所以我们通常把他设置为TIM_CKD_DIV1
3) 设置 TIM3_DIER 允许更新中断。
如果不设置的话,无法进入进入定时器中断
4) TIM3 中断优先级设置。
关于中断优先级的详细讲解,小白在外部中断讲过,附上链接,有兴趣可以去看一下。
https://blog.csdn.net/weixin_44221205/article/details/107516171
5) 允许 TIM3 工作,也就是使能 TIM3。
定时器的配置完成后,必须使能定时器,否则定时器不运行。
6) 编写中断服务函数。
需要注意的是,定时器中断函数要与定时器名字对应。比如上面定时器3的中断函数TIM3_IRQHandler,小白没有在函数中找到,如果有知道大佬,帮忙评论一波,学习一下。
这次的实验现象就不演示了,它就是通过定时器来使灯进行亮灭操作。
本次博客以正点原子战舰资料以及STM32中文参考资料为主要参考。
本次博客主要讲解通用定时器中断,先讲解一下相关概念,然后在进行代码的实现。
**
通用定时器工作过程:
**(在定时器中断中,我们只是用到了定时器的时基单元)
**
时钟源
**
在介绍时基单元之前,我们还需要了解时钟源。从通用定时器的工作过程图我们可以看到,定时器的时钟来源有很多。而我们常用的便是来自RCC的TIMxCLK。
通用定时器是挂载在APB1总线上的,APB1的时钟最高为36MHZ。
这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx 的时钟是 APB1时钟的2倍。
由STM32时钟系统框图以及默认调用SystemInit函数情况下,我们可以得出:CK_INT时钟为72MHz。即通用定时器的时钟频率是 72MHz。
**
时基单元
**
知道了时钟源后我们在来看时基单元。(大家在看下面概念的时候结合上面的图会更好的理解。)
时基单元包含:
● 预分频器寄存器 (TIMx_PSC)
● 计数器寄存器(TIMx_CNT)
● 自动装载寄存器 (TIMx_ARR)
1.TIMx_PSC预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
2.计数器由预分频器的时钟输出CK_CNT驱动 。
3.自动装载寄存器是预先装载的, 当计数器达到溢出条件(向下计数时的下溢条件) 产生更新事件。Arr的重装周期是1~65535。
**
计数器模式
**
计数器模式有三种,分别是:向上计数,向下计数,向上向下计数
**
定时器中断时间计算
**
最后再来介绍进入定时器中断的时间,它的计算公式为:
附上小白个人理解:
以上便是关于定时器中断的相关理论知识,接下来通过库函数来配置代码。
**
代码实现
**
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
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寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
LED1=!LED1;
}
}
1) TIM3 时钟使能。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。
2) 初始化定时器参数,设置自动重装值, 分频系数,计数方式等。
这里主要说一下TIM_ClockDivision与TIM_Prescaler这两个参数。
在本实验中,我们并没有用到这个参数。所以我们通常把他设置为TIM_CKD_DIV1
3) 设置 TIM3_DIER 允许更新中断。
如果不设置的话,无法进入进入定时器中断
4) TIM3 中断优先级设置。
关于中断优先级的详细讲解,小白在外部中断讲过,附上链接,有兴趣可以去看一下。
https://blog.csdn.net/weixin_44221205/article/details/107516171
5) 允许 TIM3 工作,也就是使能 TIM3。
定时器的配置完成后,必须使能定时器,否则定时器不运行。
6) 编写中断服务函数。
需要注意的是,定时器中断函数要与定时器名字对应。比如上面定时器3的中断函数TIM3_IRQHandler,小白没有在函数中找到,如果有知道大佬,帮忙评论一波,学习一下。
这次的实验现象就不演示了,它就是通过定时器来使灯进行亮灭操作。
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32
通用定时器
中断
怎样去使用
STM32
通用
定时器
的
定时中断
功能呢
2021-11-17
969
STM32
通用
定时器
的重要知识点
2021-09-26
1511
如何去编写
STM32
通用
定时器
更新事件
中断
的代码
2021-11-16
725
怎样去配置
STM32
F103
通用
定时器
的
定时中断
2021-11-23
1133
STM32
通用
定时器
的基本工作原理是什么
2021-11-24
1480
stm32
通用
定时器
是如何进行工作的
2021-11-23
1020
怎样去计算
STM32
通用
定时器
的时钟
2021-11-24
1188
怎样去使用
STM32
通用
定时器
呢
2021-11-23
959
STM32
通用
定时器
看完你就懂了
2021-11-16
543
STM32
通用
定时器
的原理是什么?
2021-11-24
602
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分