STM32定时器入门篇——(基本定时器的使用)

news2024/10/7 10:14:02

一、基本定时器的功能介绍:

        STM32F103的基本定时器有:TIM6、TIM7。基本定时器TIM6和TIM7各包含一个16位递增自动装载计数器,最大计数到2^16也就是65536,计数值为0~65535,其拥有的功能有:定时中断、主模式触发DAC的功能。没有输入输出通道,常作为时基,即作为定时功能使用。

二、基本定时器框图介绍:


        时钟源来源于APB1总线(不懂的可以看看时钟树,这里先不做过多详细介绍,一般都为72MHZ)当然,通用定时器和基本定时器都来自这个总线。


        计数器时钟CK_CNT:每来一个时钟,先经过控制器,通过预分频器的分频,0为1分频,也就是不分频,1为2分频,如果时钟为72MHZ的话到达计数器则为36MHZ(预分频器为16位,最大可以写65535,也就是65536分频),即经过预分频器后的时钟为计数器时钟CK_CNT。

                                        公式CK_CNT = TIMxCLK/(PSC + 1)


        计数器CNT:对预分频的时钟计数,每来一个时钟上升沿计数器加1,当等于自动重装载寄存器时的值时,产生溢出中断或DMA请求和更新事件(注:基本定时器只能向上计数递增)。

        可以从图中看见更新事件U回到了自动重装载寄存器了,作用是什么呢?是为了将预装载寄存器的值加载到对应影子寄存器,即实现了自动重装载的功能。自动重装载寄存器起到缓冲的作用,真正其作用的是它的影子寄存器(图中有方框阴影的都有影子寄存器)。


        定时时间的计算:其中有两个寄存器决定着计时的时间,分别是预分频值和自动重装载的值。时间可以看成预分频后的时间乘上自动重装载的值,假如为71分频,此时时钟为1MHz,也就是1us,如果我们要定时500ms,那么自动重装载值也就为500000,因为计数器计一个数代表过了1us,记上500000个数就是500ms了。那么真的可以这样吗?显然不行,自动重装在寄存器也是16位的,最大值依旧为65535,所以我们可以试试719分频,此时计数器记一个数也就过了10us,我们设置自动重装载值为50000就可以了。

        总结一下,定时器定时时间:T =((PSC+1)(ARR+1))/TIMxCLK

三、基本定时器的使用

        其使用方法和通用定时器一样,首先就是开启定时器的时钟,然后是时基单元的初始化,给预分频值和计数值;至于时钟分频因子和计数模式和重复计数器的值都不用管,这些基本定时器都没有,基本定时器只能向上计数。

        如果要开启相应中断还得进行中断的初始化配置,中断来源设置为定时器6;代码如下:注意,F1系列通用型并没有定时器6和7,也就是F103C8没有这个定时器,这里用到的是STM32F103ZET6!!!

#include "stm32f10x.h"                  // Device header
#include "led.h"

uint8_t led_state;

int main(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//开启定时器6的时钟
    
    TIM_TimeBaseInitStructure.TIM_Period = 500000-1;//设置计数值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 710;//设置预分频值
    TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);//时基单元初始化
    
    TIM_ClearFlag(TIM6,TIM_FLAG_Update);//清除中断标志位
    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//开启中断
    TIM_Cmd(TIM6,ENABLE);//定时器使能
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//设置中断分组
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;//中断来源于定时器6
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//主优先级为0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//抢占优先级3
    NVIC_Init(&NVIC_InitStructure);//中断初始化
    LED_Init();//led的初始化

	while (1)
	{
        LED(led_state);//LED500ms闪烁
	}
}

void TIM6_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET)//判断中断标志位
    {
        TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除中断标志位
        led_state = 1 - led_state;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

星戈瑞CY5-DBCO在纳米粒子载体标记与追踪中的应用

随着纳米技术的飞速发展,纳米粒子载体在生物医学领域的应用增多。这些载体能够递送药物、基因和其他生物活性分子到特定的细胞或组织。为了有效监测纳米粒子载体在体内的分布、行为以及与生物分子的相互作用,荧光标记技术成为了一个常见工具。其中&#…

HttpServletRequest・getContentLeng・getContentType区别

getContentLength(): 获取客户端发送到服务器的HTTP请求主体内容的字节数(长度) 如果请求没有正文内容(如GET),或者请求头中没有包含Content-Length字段,则该方法返回 -1 getContentType()&am…

算法与数据结构面试宝典——迭代与递归详解与示例(C#,C++)

文章目录 一、迭代与递归简介迭代递归 二、迭代与递归的应用场景迭代递归 三、迭代与递归的优缺点迭代优缺点递归优缺点 四、迭代与递归的示例及面试策略示例1:斐波那契数列(迭代实现)示例2:快速排序(递归实现&#xf…

vue3+ts:监听dom宽高变化函数

一、效果展示 二、代码 getSize.ts import { ref, Ref, watchEffect } from "vue";export const getWidth (domRef: Ref<HTMLElement | null>) > {const width ref<number>(0);const height ref<number>(0);const observer new ResizeObs…

【机器学习】——【线性回归模型】——详细【学习路线】

目录 1. 引言 2. 线性回归理论基础 2.1 线性模型概述 2.2 最小二乘法 3. 数学基础 3.1 矩阵运算 3.2 微积分 3.3 统计学 4. 实现与应用 4.1 使用Scikit-learn实现线性回归 4.2 模型评估 5. 深入理解 5.1 多元线性回归 5.2 特征选择 5.3 理解模型内部 6. 实战与项…

⭐最新版!SpringBoot正确集成PageHelper姿势,不再被误导!

GGBond&#x1f508; CSDN的朋友们大家好哇&#xff0c;我是新来的Java练习生 CodeCodeBond&#xff01; 什么是PageHelper&#xff1f; 这里给不知道的人儿说明一下~~ 知道的xdm可以跳过了&#xff01; PageHelper顾名思义是一个 页面 帮手。也就是分页查询的一个好用的工具…

Linux 标准IO的fopen和fclose

getchar(),putchar() ‐‐‐‐ 一个字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一个字符&#xff0c;一串字符都可以 fopen函数的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打开一个文件 * param ‐ path…

C++ 模板:全特化和偏特化

目录 全特化&#xff08;Full Specialization&#xff09; 偏特化&#xff08;Partial Specialization&#xff09; 特点和使用场景 注意事项 在C中&#xff0c;模板特化&#xff08;template specialization&#xff09;是一种强大的功能&#xff0c;允许对模板进行特定情…

S-Clustr(影子集群)V3 高并发,去中心化,多节点控制

S-Clustr 项目地址:https://github.com/MartinxMax/S-Clustr/releases/tag/S-Clustr-V3.0 Maptnh Не ограничивайте свои действия виртуальным миром. GitHub: Maptnh Jay Steinberg Man kann die Menschen, die man hasst, in d…

基于SSM+VUE的网上订餐系统(带1w+文档)

基于SSMVUE的网上订餐系统(带1w文档) 网上订餐系统的数据库里面存储的各种动态信息&#xff0c;也为上层管理人员作出重大决策提供了大量的事实依据。总之&#xff0c;网上订餐系统是一款可以真正提升管理者的办公效率的软件系统。 项目简介 基于SSMVUE的网上订餐系统(带1w文档…

绝望中迎来曙光,阿里大模型算法岗 Offer 突然来了!

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

web前端——CSS

目录 一、css概述 二、基本语法 1.行内样式表 2.内嵌样式表 3.外部样式表 4.三者对比 三、选择器 1.常用的选择器 2. 选择器优先级 3.由高到低优先级排序 四、文本,背景,列表,伪类,透明 1.文本 2.背景 3.列表 4.伪类 5.透明 五、块级,行级,行级块标签, dis…

第一百二十七节 Java面向对象设计 - Java枚举方法

Java面向对象设计 - Java枚举方法 因为枚举类型实际上是一个类类型&#xff0c;所以我们可以在枚举类型体中声明一切&#xff0c;我们可以在类体中声明它。 以下代码使用字段&#xff0c;构造函数和方法定义了一个级别枚举。 public enum Level {LOW(30), MEDIUM(15), HIGH(7…

Android跨进程调用,Binder线程池溢出导致ANR

Android跨进程调用&#xff0c;Binder线程池溢出导致ANR 如果发生ANR&#xff0c;找到trace.txt 、/data/anr目录下&#xff0c; "main" prio5 tid1 Native| group"main" sCount1 dsCount0 flags1 obj0x72c33e38 self0x78a64c2a00| sysTid1863 nice0 cgr…

Kivy tutorial 004: Making the GUI do stuff, binding to events

Kivy tutorial 004: Making the GUI do stuff, binding to events – Kivy Blog Central themes: Events and Kivy properties 中心主题&#xff1a;事件和kivy属性 We left the last tutorial with a calculator app GUI with some nice automatic behaviour, but which doe…

Spring Cloud - 开发环境搭建

1、JDK环境安装 1、下载jdk17&#xff1a;下载地址&#xff0c;在下图中红色框部分进行下载 2、双击安装&#xff0c;基本都是下一步直到完成。 3、设置系统环境变量&#xff1a;参考 4、设置JAVA_HOME环境变量 5、在PATH中添加%JAVA_HOME%/bin 6、在命令行中执行&#xff1a;j…

大厂薪资福利篇第五弹:小红书

欢迎来到绝命Coding&#xff01; 今天继续更新大家最关心的 大厂薪资福利系列&#xff01; 为什么计算机学子对大厂趋之若鹜呢&#xff1f;最直接的原因就是高薪资的吸引力。 • 但是薪资可不是简单的数字哦&#xff0c;里面还是有很多“学问”的。 • 很多同学对大厂薪资只有一…

嵌入式C语言中常见寄存器的控制方法

使用C语言对寄存器赋值时,常常需要用到C语言的位操作方法。 把寄存器某位清零 假设a代表寄存器,且其中本来已有值。如果要把其中某一位清零且其它位不变,代码如下。 //定义一个变量 a = 1001 1111 b (二进制数)unsigned char a = 0x9f;//对 bit2 清零a &= ~(1<<…

YOLO系列改进

yolo核心思想&#xff1a;把目标检测转变成一个回归问题。将整个图像作为网络的输入&#xff0c;仅仅经过一个神经网络&#xff0c;得到边界框的位置及其所属的类别。 YOLOv1 CVPR2016 输出7730的张量表示2个框的5个参数和20个种类。leaky ReLU&#xff0c;leaky并不会让负数…

深度学习入门2—— 神经网络的组成和3层神经网络的实现

由上一章结尾&#xff0c;我们知道神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数。接下来会介绍神经网络的概要&#xff0c;然后再结合手写数字识别案例进行介绍。 1.神经网络概要 1.1从感知机到神经网 我们可以用图来表示神经网络&#xff0c;我们把最…