STM32自学历程——TIM定时器中断

首先感谢

        首先感谢江科大老师的STM32视频教程,真的简单易懂!十分推荐!

TIM定时器中断和EXTI外部中断的区别

       EXTI是外部中断,是通过外部情况作为触发,当产生高低电平变化时就执行中断;

       TIM定时器是靠内部中断,当计数器计到一定值后,就发送高电平,然后执行中断。

时基单元

        以通用定时器举例,如上图所示。

什么是预分频器

        将72Mhz的主频进行分频,因为72Mhz意味着1秒通过72000000个波形,即有72000000个上升沿通过,而计数器的最大计数值为65535,每一个上升沿记一次数,最大计数65535,若寄存器没有设置值,则默认计数到65535计数清零。所以为了让计数值变慢,就要对主频进行分频,预分频器的分频原则如下:

0

不分频

1

分成两个频为:36MHZ

2

分成三个频为:12MHZ

自动重装载寄存器

自动重装载寄存器的作用是给计数器一个计数终点值,如果计数器计到了终点值,则计数器清零

分频器是怎么分频的

CK_CNT是分频后的频率,CK_PSC是主频时钟,PSC是预分频值,这里+1是因为算法。预分频器的工作本质是如果预分频器的值为0,则主频时钟怎么变,就怎么变,如果预分频器的值设为1,则意味着在相邻的0之间插入个1,是0则有波形,不是0就没有波形。预分频值为2,则意味着在相邻的0之前插入1、2,是0则有波形,不是0就没有波形,所以就相当于通过在0与0之间加入非0数字从而实现延时。关系如下:

0

0000000000

1

0101010101

2

0120120120

如何计算自己要计数的间隔

这是官方的计算方法:

这是我的计算方法:

        ARR表示自动重装值,预分频器减1是因为当值为0时,预分频器不分频,而ARR为什么要减1呢?因为ARR是从0开始计数的,从0计到10要计数11次,所以为了便于理解,所以减1。就比如,当预分频系数为7200,要1s计一次数的话,就要让ARR为10000,但此时ARR其实是计数了10001次的,实际上只要计到9999就可以了。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F4系列微控制器中的定时器(TIM)模块可以用于生成定时中断。在使用TIM定时器中断时,通常需要进行以下步骤: 1. 配置TIM定时器的基本参数:选择定时器的时钟源、预分频值和计数模式等,这些参数决定了定时器的工作频率和计数范围。 2. 配置定时器的自动重装载寄存器(ARR)和预分频寄存器(PSC):设置定时器的计数周期和预分频系数,以确定定时器的定时周期。 3. 配置定时器的工作模式:选择定时器的工作模式,比如单脉冲模式、重复模式或连续模式等。 4. 启用定时器中断:使能定时器中断,并设置中断优先级。 5. 编写中断处理函数:在中断处理函数中编写需要执行的代码,比如更改输出状态、处理数据等。 6. 启动定时器:使能定时器开始计数。 下面是一个使用TIM2定时器中断的示例代码: ```c #include "stm32f4xx.h" void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 中断处理代码 // ... TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } int main(void) { // 初始化配置代码 // 使能定时器2中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 配置定时器2 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1000; // 定时周期为1ms TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1; // 预分频系数为8400,定时频率为10kHz TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 清除定时器2的中断标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 使能定时器2的更新中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 启动定时器2 TIM_Cmd(TIM2, ENABLE); while (1) { // 主循环代码 // ... } } ``` 以上代码中,我们使用TIM2定时器,并配置了1ms的定时周期。在中断处理函数`TIM2_IRQHandler`中,可以编写需要执行的代码。在主循环中,可以编写其他的程序逻辑。 希望这个简单的示例对你有所帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值