STM32时钟系统和TIMER配置(溢出中断/PWM)实例

news/2024/5/4 5:08:22/文章来源:https://blog.csdn.net/fengel_cs/article/details/127026816

目录:

1. STM32时钟系统

2. STM32的定时器典型配置之溢出中断

3. STM32的定时器典型配置之PWM输出

1. STM32时钟系统

(1)Clock tree

        可以在官方手册(Stm32x-series-Reference-manual)的clock tree中可以对相应MCU的时钟系统有个大致了解。

        也可以从中了解到STM32哪些外设挂在哪一条总线上,然后根据Cube中配置的时钟频率和各种分频就可以得到各总线的时钟频率,注意挂在这些总线上的外设还需要在配置时经过分频得到外设的时钟频率。

(2)STM32总线与时钟配置

        假如STM32时钟源为HSE高速外部晶振,HSE一般为8MHz,经过x分频和y倍频后得到系统时钟,即PLLCLK = (8/x)*y MHz。

        AHB总线上时钟由系统时钟PLLCLK经过z分频得到,HCLK = PLLCLK/z。

        APB2上的总线时钟PCLK2经过HCLK的m分频得到,PCLK2 = HCLK/m。

        APB1上的总线时钟PCLK1经过HCLK的n分频得到,PCLK1 = HCLK/n。

外设时钟举例: 挂在高速总线APB2上的ADC时钟经过APB2总线时钟2分频得到,即ADCCLK = PCLK2/2 。

外设时钟举例:挂在低速总线APB1上的TIM2时钟经过APB1总线时钟2分频得到,即TIM2CLK = PCLK1/2 。

2. STM32的定时器典型配置之溢出中断

(1)定时器分类

        STM32的物理定时器解决了MCU单任务运行使用CPU计数对性能的影响,定时器根据功能从多到少分为高级定时器、通用定时器、基本定时器。低功耗定时器、看门狗定时器、某些MCU还有HRTIM等。

(2)定时器挂在哪条总线上

        以STM32F10x系列的MCU为例,TIM1/8挂在APB2高速总线上,TIM2-7挂在APB1低速总线上。

 (3)定时器初始时钟频率

        有人说如果APB1和APB2经过HCLK都进行1分频,那么TIM1/8的时钟为APB2的时钟,TIM2-7的时钟为APB1的时钟。

        如果APB1和APB2经过HCLK进行分频,分频系数不为1,那么TIM1/8的时钟为APB2时钟的两倍,TIM2-7为APB1的时钟的两倍。

        在实际应用中,要根据不同的MCU和时钟系统配置得到相应定时器的初始时钟频率。

 (4)定时器计数时钟频率

        所谓计数时钟频率,就是上面提到每种外设具体时钟频率还要经过外设本身的外设分频(PSC)配置,从而得到最终定时器时钟频率,这个频率就是定时器每计数一次花的时间。

(5)在CubeMX中定时器的配置

        下面是对TIM2配置的实例:

                                                                        图1

         选中左侧TIM2,然后在Clock Source选择Internal Clock,在下面Parameter Settings处就会展示出相关参数,主要需要配置PSC,Mode,ARR值。

        PSC即Prescaler,预分频系数,就是上面第(4)点中提到的再次分频系数,基于第(3)点的时钟频率分频。比如要配置定时器每一微妙(最终定时器技术频率为1MHz)计数一次,那么首先看第(3)点的时钟频率是多少:

        从系统时钟树配置中可以看出,APB1总线时钟频率为72MHz,TIM2挂在APB1总线上,然后根据第(3)点的规则可知TIM2的初始频率为72MHz,那么要让TIM2的计数频率为1MHz,那么PSC就应该配置为72-1,这就是图1中72的由来。 注意这里是16bit位值,因此这个值不能超过65535,另外,STM32手册中提到这里PSC的值一定是你想要的值减1,可能是从0开始的吧,所以这里是72-1。

        Counter Mode可以选择计数模式,这里选择向上计数。

        Counter Period即上面提到的ARR值,即重装载值。即定时器计到这个值后响应一个事件(一般可以配置中断),然后重新开始计时。这个值也是有限制的,这里从图1中可以知道它是一个32bit的数。同样,由于TIM2是1us计数一次,如果我们希望500ms响应一次中断,那么就需要把ARR的值配置为500000,即TIM2计数500000次后响应中断,每次1us,500000刚好500ms。同样配置时的值是实际想要的值减1,即500000-1。

        如果要使用中断方式,需要配置中断:

         上图中可以选中TIM2的global interrupt,即使能了中断,然后根据实际应用配置中断优先级。                        

(6)Cube生成代码

        1) 开启定时器

        HAL_TIM_Base_Start_IT(&htimx); htimx是一个结构体变量,这里就是TIM2的句柄。这个函数的作用是开启定时器及溢出中断。

         HAL_TIM_Base_Stop_IT(&htimx); 这个函数是关闭定时器及溢出中断HAL库函数。

         HAL_TIM_Base_Start(&htimx); 这个函数是开启定时器,但是不开启中断的HAL库函数。

         HAL_TIM_Base_Stop(&htimx); 这个函数是关闭定时器的HAL库函数。

        2) 定时器中断处理函数

        当定时器的计数到达ARR的值后,就会产生溢出中断,最终调用到中断完成回调函数,我们一般都是会改写这个函数,在这个函数里面执行相应逻辑。根据上面的配置,这个回调函数将500ms调用一次。void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)

3. STM32的定时器典型配置之PWM输出

(1)PWM占空比

        什么是PWM呢,比如LCD背光就可以用PWM方式控制,当高电平时间比低电平时间长,那么肉眼感受到LCD亮的时间就比灭的时间长,如果继续减少低电平时间,甚至感受不到LCD有灭,那么通过这样的方式就可以实现LCD亮度控制。

        一般来说PWM都是方波,那么高电平和低电平持续时间构成一个周期,高电平持续时间处于周期*100%,就是占空比,即Duty值。

(2)定时器比较值

        一般比较值位于0到ARR重装载值之间,当定时器计数值处于0到比较值之间时,定时器的某个通道对应的GPIO输出高电平,如果计数值处于比较值到ARR重装载值之间,那么定时器的某个通道对应的GPIO输出低电平,由此可知通过改变比较值的大小就可以改变定时器的占空比。

 

(3)Cube配置

         选中左侧相应定时器,选中右侧的Activated(如果只有后Activated就选中,如果是其他选项就选中Internal Clock即可),然后选中PWM Generation CH1。

        参数那里PSC选择72-1,即计数频率是1MHz,即计数一次1us,ARR值为1000-1,即1000us响应一次中断,也就是1ms一次中断,中断频率就是1/0.1s=1000Hz。

        1000Hz的频率肉眼是看不出来的,最后就是GPIO要选择对。

(4)代码编写

        打开定时器PWM,HAL_TIM_WM_Start(&htimx,TIM_CHANNEL_2); 然后通过调用下面函数修改比较值,从而修改了占空比,从而实现亮度的控制。

        __HAL_TIM_SetCompare(&htimx,TIM_CHANNEL_2,比较值); 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_13314.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字信号处理——多速率信号处理(1)

目录 引言 1、抽取 MATLAB仿真代码 仿真结果 抽取滤波器 2、内插

《关于我摸鱼一天后搞定PyCharm这件事》Python环境配置

Anaconda部署 1.下载最新版匹配电脑的版本 我是 WIN-x64 下载Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 我是 Anaconda3-2022.05-Windows-x86_64 下载 社区版本Pycharm Download PyCharm: Python IDE for Professional Develo…

从零玩转jQuery(基础篇)

1.前言 (window.onload和jQuery的相关介绍) 分析一下,元素js的缺点: 1.不能添加多个入口函数(window.onload),如果添加了多个,后面的会把前面的给覆盖。 2.原生js的api名字都太长太难记。 3.原生js有的时候代码冗余。 …

Maven坐标查找方法及Maven-Search 插件的使用(保姆级教学)

目录坐标的概念获取坐标方法一获取坐标方法二坐标的概念 坐标组成是groupid,artifiactld,version。坐标概念来自数学。 坐标作用:确定资源的&#xff0c;是资源的唯一标识。在maven中&#xff0c;每个资源都有坐标。坐标值是唯一的。简称叫gav。 拿servlet依赖举例 <!--serv…

nacos 简介和使用

Nacos 是阿里巴巴开源项目&#xff0c;用于构建微服务应用的服务发现、配置管理和服务管理。 在微服务项目中不同模块之间服务调用时&#xff0c;实现服务注册与发现。 Nacos 使用&#xff1a; Nacos 是java开发的&#xff0c;依赖 Java 环境来运行 Nacos的下载 https://git…

cobbler部署

cobbler部署 #先关闭防火墙和selinux [root@localhost ~]# systemctl disable firewalld [root@localhost ~]# setenforce 0 //cobbler服务,selinux必须得是disabled状态,所以要重启 [root@localhost ~]# vim /etc/selinux/config SELINUX=disabled [root@localhost ~]# reb…

BUUCTF-社团考核

目录 1.[CISCN2019 华东南赛区]Web4 2.[GWCTF 2019]枯燥的抽奖 3.[NCTF2019]Fake XML cookbook 4.[SCTF2019]Flag Shop 5.[GWCTF 2019]mypassword 6.[BSidesCF 2019]Kookie 7.[WUSTCTF2020]朴实无华 8.[网鼎杯 2020 白虎组]PicDown 9.[CISCN 2019 初赛]Love Math 10.攻…

深入ArrayList()源码

深入ArrayList()源码 jdk1.8 java.util; 扩容机制 新数组都将替代旧数组&#xff0c;旧数组作为垃圾被回收 ArrayList() 会使用长度为零的数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};public ArrayList() {this.elementData DEFAULTCAPACITY…

采用 ALSTM 模型的温度和降雨关联预测研究论文学习记录

为了准确和及时预测局部区域的降雨及温度&#xff0c;提出了一种基于 Attention 和 LSTM 组合模型( ALSTM) 的关联多值预测算法。该算法利用天气时间序列中 的前期数据&#xff0c;对下一小时的降雨量和温度进行关联预测&#xff0c;以此实现对天气要素的多值预测。该算法首先对…

一个项目带你走进接口自动化测试

文章目录前言一、项目环境搭建二、项目分析三、框架搭建1、解决登录问题、获取token2、熟悉项目的接口请求方式、二次封装requests请求3、缓解业务请求接口参数臃肿4、重新封装logging日志5、通用方法编写四、编写自动化脚本场景业务需求单接口业务需求五、生成测试报告六、写在…

CSDN线上竞赛编程第六期参赛心得

CSDN编程竞赛报名地址&#xff1a;https://edu.csdn.net/contest/detail/16 &#xff08;请不要删掉此地址&#xff09; CSDN线上竞赛编程第六期参赛心得前言/背景大赛简介参赛流程参赛经历解题思路1、题目名称&#xff1a;严查枪火2、题目名称&#xff1a;鬼画符门3、题目名称…

HDMI/DVI____TMDS编码

一.编码步骤:基本方法:取第一位数据为初值,接下来输入的每一位与前一导出的位(根据判断条件)进行异或XOR或者同或XNOR(最小化传输);最后选择性反转这9bit数据(DC平衡处理)。 ①DE为高电平时,对8位RGB数据编码,第9bit表示采用了XOR / XNOR ,第10bit表示是否翻转。 …

04代码

import datetime #定义一个列表 mot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择。","今天星期二:\n含泪播种的人一定能笑着收获。","今天星期三:\n作对的事情比把事情做对更重要。","今天星期四:\n命运给予我们的不是失…

【NLP】自然语言处理的序列建模

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Teams Bot App 初探

上一篇文章深入讲了incoming webhook。这篇文章我们来看一个稍微复杂点的&#xff0c;正式点的 teams app&#xff1a;bot。 我们先来和之前一样&#xff0c;通过teams toolkit 的 sample gallery来创建一个 Teams bot app。 创建之后我们先来看一下目录结构和生成的文件。 一…

二叉树中求最大路径和

题目来自LeetCode中&#xff0c;链接为124. 二叉树中的最大路径和 一棵树的最大路径和可能存在于哪里&#xff1a; 单纯的存在于以左子树为根节点的子树中单纯的存在于以右子树为根节点的子树中根节点到达左子树B中某节点的路径根节点到达右子树C中某节点的路径左子树中某节…

Android日志分析02-am篇

Android日志分析02-am篇 在日常分析bug时&#xff0c;免不了和系统ActivityManagerService打交道&#xff0c;根据日志去查看各个Activity的生命周期&#xff0c;从而判断是否出现Activity生命周期异常。 先使用adb logcat和adb bugreport再pixel2的模拟器抓取一份从开机到打开…

代码随想录4——链表: 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07链表相交、142.环形链表II

文章目录1.24两两交换链表中的节点1.1.题目1.2.思路1.3.代码实现1.3.1.对next指针的理解1.3.2.编程中要备份哪些节点的指针&#xff1f;1.3.3.代码实现2.19删除链表的倒数第N个节点2.1.题目2.2.思路3.面试题02.07链表相交3.1.题目3.2.解答4.142.环形链表II4.1.题目4.2.思路1.24…

JavaEE——No.1 多线程案例

JavaEE传送门JavaEE JavaEE——No.1 线程安全问题 JavaEE——No.2 线程安全问题 目录多线程案例1. 单例模式饿汉模式懒汉模式2. 阻塞队列阻塞队列的使用阻塞队列的实现多线程案例 1. 单例模式 单例模式是一种常见的设计模式. 设计模式: 软件开发时, 会遇到一些常见的 “问…

存储系统基本概念

内容框图 存储器的层次化结构 由于cpu运行太快&#xff0c;所以中间需要主存&#xff0c;Cache&#xff0c;寄存器去传递。 主存–辅存&#xff08;硬件操作系统&#xff09;&#xff1a;实现虚拟存贮系统&#xff0c;解决了主存容量不够的问题。 Cache–主存&#xff08;硬件自…