stm32使用通用定时器中断的一般流程

news/2025/2/28 4:33:02/

(注:文中的x为数字)

初始化

1.TIMx的外设时钟使能
RCC->APB1ENR |= 1 << n;

2.设定ARR寄存器(计时器自动重装值)
TIMx->ARR = arr;

3.设定预分频器的值
在设定预分频器的值之前,先理解这里的预分频器与时钟系统里的APB1外设的PPRE1不同(由于原子的SYSTEM中时钟初始化函数将PPRE1设为非1,所以外设定时器的时钟就应该加倍了),也就是说进入下面这张图的内部时钟(CK_INT)为72MHZ,而PSC预分频器改变的是时基单元的那个,看到了吗?
在这里插入图片描述

代码格式:
TIMx->PSC = psc;

4.允许更新中断
TIMx->DIER |= 1<< 0;

5.开定时器使能
TIMx->CR1 |= 1 << 0;

6.设置中断分组及优先级
在这里就用原子提供的MY_NVIC_Init();函数
(具体代码看《设置中断流程》)


(注:其实还应该有一个设置定时器是向哪个方向计数:但默认的是边沿对齐向上计数模式;如果要改变计数方向看下图进行相关寄存器(CR1)的修改就可以了)
在这里插入图片描述


写中断服务函数

(注:每次进入中断的最后要清除SR的0位
TIMx->SR &= ~(0x01 << 0))


如何计算装入ARR与PSC的值(在这里采用溯回法讲解)
PSC.:如果要将72MHZ分频7200,则为6199
ARR:这个寄存器中存放的是产生中断间隔的总计时点数,也就是说,当CNT寄存器中每次从0到arr将产生中断(默认向上计数模式),那么变化一次的时间就显得关键了。那么如何计算变化一次数的时间呢?这要配合PSC寄存器来说了。
我们知道,经过PSC分频的频率指的是变化一次所需时间周期的倒数。前面说过,经过原子的时钟初始化使得APB1定时器时钟为72MHZ,而PSC就是分频的72MHZ。举例来说,假如你想要一次产生0.5s的中断,那PSC就设置7200 - 1 = 6199 ARR设置5000 - 1 = 4999,前者设置分频为10kHZ,CNT改变一次0.0001s,后者设置计数总点为5000 中断时间为5000 * 0.0001 = 0.5s
(至于那个为什么-1 可以这样理解,每次溢出(在向上计数模式中),即归0,都要经过arr + 1个间隔,关于PSC,看一段话:
在这里插入图片描述
其实读者自行画一个图就好理解了,在这也就不赘述了)


http://www.ppmy.cn/news/920410.html

相关文章

python中timeit模块用法

转自&#xff1a; http://blog.sina.com.cn/s/blog_6163bdeb0101806e.html http://www.sharejs.com/codes/python/6199 http://blog.csdn.net/rumswell/article/details/7349915 想测试一行代码的运行时间,在python中比较方便,可以直接使用timeit: 看个例子吧 [python] view p…

AIX userid/pass From 得志之家 : usr10080

password: test 登陆方法: telnet efglobe.com 6199即使用端口6199来登陆更多消息请随时关注得志之家论坛http://fandezhi.efglobe.com/modules.php?nameForums谢谢您的支持!

Vue.js实现购物车功能

Vue.js实现购物车功能 1.功能实现 以表格的形式将存放在后端的购物信息展示在前端页面&#xff0c;实现步骤如下&#xff1a; 使用axios技术异步读取json文件里的数据&#xff0c;结合Vue.js的v-for指令将信息逐条迭代存放在表格中&#xff0c;在表格中展示“商品名称”、“商…

oracle表碎片查询整理

模拟插入数据 create table test as select * from dba_objects; insert into test select * from test; insert into test select * from test; insert into test select * from test; commit;收集统计信息 SET TIME ON exec dbms_stats.gather_table_stats(ownname>TEST…

惠普战66五代锐龙版配置 怎么样

惠普战66五代锐龙版轻薄本A/C/D三面采用的是金属机身一体成型工艺&#xff0c;重约1.74kg &#xff0c;厚度19.9mm&#xff1b;屏幕均采用四面窄边框设计&#xff0c;屏占比87.9%&#xff0c;支持180 开合、100%SRGB高色域、400尼特亮度。尤为值得一提的是&#xff0c;惠普战66…

postfix邮件服务配置及各种问题解决

前言&#xff1a;本文总结了一些postfix常见的问题及解决方案&#xff0c;可能并不太全面&#xff0c;望对阅读的你有一些帮助 一、postfix邮件服务安装 1.安装 yum -y install postfix 2.配置 vim /etc/postfix/main.cf myhostname sample.abc.com  设置系统的主机名…

列表中套字典,根据字典的某个key删列表的元素

#根据name删除信息 stu_list [{name:杨杨,age:12,QQ:6199},{name:喜羊羊,age:16,QQ:2471},{name:懒洋洋,age:18,QQ:3569} 方法一&#xff1a;遍历列表&#xff0c;把字典中包含要删除的值不拼接到新列表 def appName(stu_list):new_list []del_name input(请输入你要删除信…

邮件服务器启动postfix时的问题:启动 postfix: [失败]

[rootlinux115 spool]# service postfix start 启动 postfix&#xff1a; [失败] [rootlinux115 log]# postfix start postsuper: fatal: scan_dir_push: open directory defer: Permission denied postfix/postfix-script: fatal: Postfix integrity check failed! [rootlinu…