STM32——定时器

news2024/11/17 22:18:00

一、简介

*定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

*16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 

*不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能

*根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

二、定时器区别

1.通用定时器的特点描述

1.位于ABP1低速总线上

2.16位向下,向上/向下(中心对齐模式)计数模式,自动重装载计数器(TIMx_CNT)

3.16位可编程(可以实现修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535任意数值

4.四个独立通道(TIMx_CH1~4),通道用来支持:

①输入捕获

②输出比较

③PWM生成

④单脉冲模式输出

2.通用定时器的计数器模式

STM32通用定时器 可以向上,向下,向上/向下双向计数模式 :

① 向上计数模式:计数值从0 计数到自动加载值(TIM_ARR),产生一个计数溢出事件,然后重新从0开始计数

②向下计数模式:计数器从自动装入的值(TIM_ARR)开始向下计数到0,产生一个计数溢出事件,然后从计数装入值重新开始。

③中央对齐模式:计数器从0开始到(自动装入值-1),产生计数溢出事件,然后向下计数到1,产生定时器溢出事件,然后从0开始计数。

预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。

ARR是自动重装载值(自己设定的)

CNT计数当前值(0到自动重装载值中间的某个值)

CCRX比较寄存器值

PSC是预分频系数

内部时钟源(CK_INT)

三、计数器时钟计算方法

预分频寄存器 :分频系数    (PSC+1) / N = CNT 

定时器配置LED每秒闪烁一次:

Tout =    [  重装载值(ARR+1) * 分频系数(PSC+1)]  /Tclk

Tout =  100000(9999+1) *7200(分频系数  7199+1)   /72M(72 000 000)

计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)

计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)   = CK_PSC / (PSC + 1) / (ARR + 1)

四、输入PWM模式

PWM模式1:

向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;
向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。


PWM模式2:

向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;
向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

五、代码

PWM:

​
void motor_init(void)
{
    TIM_TimeBaseInitTypeDef   TIM_MotorInitStruct;
    GPIO_InitTypeDef   Motor_init;
	  TIM_OCInitTypeDef   TIMPWMMotorinit;

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

	  //结构体配置 (需要放在前面)   //gpio.h
	   Motor_init.GPIO_Mode  =GPIO_Mode_AF_PP; //推挽复用输出
	  Motor_init.GPIO_Pin   =GPIO_Pin_6;
	  Motor_init.GPIO_Speed =GPIO_Speed_50MHz;
	  GPIO_Init(GPIOA,&Motor_init);

	  Motor_init.GPIO_Mode  =GPIO_Mode_AF_PP; //推挽复用输出
	  Motor_init.GPIO_Pin   =GPIO_Pin_5|GPIO_Pin_0|GPIO_Pin_1;
	  Motor_init.GPIO_Speed =GPIO_Speed_50MHz;
	  GPIO_Init(GPIOB,&Motor_init);

	 

    TIM_MotorInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;  // 设置时钟分割   不分频
    TIM_MotorInitStruct.TIM_CounterMode=  TIM_CounterMode_Up; //TIM向上计数模式
    TIM_MotorInitStruct.TIM_Period= 200-1;  //ARR(199+1)
    TIM_MotorInitStruct.TIM_Prescaler=7200-1;  //PSC(7199+1)
	
    TIM_TimeBaseInit(TIM3, &TIM_MotorInitStruct);
	 
    TIMPWMMotorinit.TIM_OCMode    =TIM_OCMode_PWM2;       //选择定时器模式1
	TIMPWMMotorinit.TIM_OutputState =TIM_OutputState_Enable;        //比较输出使能1
	TIMPWMMotorinit.TIM_OCPolarity  =TIM_OCPolarity_High;     //预装载寄存器    选择有效输出极性

	//TIM_OC1Init(TIM3, &TIMPWMMotorinit);
//	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable );	
	//tim3  1
	TIM_OC2Init(TIM3, &TIMPWMMotorinit);
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable );	
	 //2
	TIM_OC3Init(TIM3, &TIMPWMMotorinit);
	TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable );	
	//tim3 	
	TIM_OC4Init(TIM3, &TIMPWMMotorinit);
    TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable );	

	//tim4
	

	TIM_Cmd(TIM3, ENABLE);

	
		
		
		
}

​

定时器:

void tim_config(void)
{
	
	TIM_TimeBaseInitTypeDef timInit;//定义初始化定时器结构体名
	NVIC_InitTypeDef NVICInit;		//定义中断的结构体名
	//1.使能时钟 定时器时钟
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE);
	TIM_InternalClockConfig(TIM2);			 // 配置定时器2为内部时钟模式
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);// 清除更新时的中断标志位,防止更新时程序直接进入中断
	TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);						//定时器中断配置
		
	//2.配置tim的结构体
	timInit.TIM_Period = 10000-1;					//设置自动重装载值
	timInit.TIM_CounterMode = TIM_CounterMode_Up;   //配置计数模式 为向上
	timInit.TIM_Prescaler = 7200 -1 ;				//配置分频系数的值(计数器时钟的分频系数)
	timInit.TIM_ClockDivision = TIM_CKD_DIV1;       //(内部时钟分频)设置分频系数为1,不分频
	TIM_TimeBaseInit(TIM2, &timInit);				//调用初始化函数
	
	
	//定时时间=(重装载值+1)*(计数器分频系数的值+1)/定时器的时钟:10000*7200/72000000(72M)
	//3.打开定时器中断,配置中断结构体
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//配置优先级组,才可以进行抢占优先级和响应优先级设置
	NVICInit.NVIC_IRQChannel = TIM2_IRQn;
	NVICInit.NVIC_IRQChannelPreemptionPriority = 1;
	NVICInit.NVIC_IRQChannelSubPriority = 1;
	NVICInit.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInit);
	TIM_Cmd(TIM2, ENABLE);
	//4.中断服务函数 
}

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

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

相关文章

Autosar Dcm配置-特定NRC实现方式-基于ETAS软件

文章目录 前言工具配置代码编写总结 前言 项目开发过程中&#xff0c;诊断服务一般客户需求或系统需求都会有特定NRC(一般为NRC22-条件不满足)&#xff0c;也就会有特定的条件&#xff0c;需要手动加代码实现。本文介绍ETAS工具中配置的接口及简单实现。 工具配置 对于每一个…

Redis常用命令——Hash篇

前面我们讲述了String的相关操作命令。本篇文章主要讲解Redis中数据结构Hash的相关操作命令。希望会对你有所帮助。 目录 一、Hash哈希 二、命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX HINCRBY 和 HINCRBYFLOAT 三、小结 &#x1f64b;‍♂️ 作者&a…

css 渐变色边框

效果图&#xff1a; 代码&#xff1a; <style>:root{--br-radius: 12px;}.list{position: relative;}.list_tle{margin-top: 15px;margin-bottom: 5px;}.item{position: relative;display: inline-flex;} .br1 {padding: 10px 16px;clip-path: inset(0 round 6px);borde…

【C++】挑战与机遇并存的编程语言—前序

C&#xff1a;挑战与机遇并存的编程语言 一、C的难点与挑战二、C的学习方法与策略三、C的实战应用与代码实例 在当今科技飞速发展的时代&#xff0c;编程语言的选择对于每一个开发者来说都至关重要。C&#xff0c;作为一种历史悠久且功能强大的编程语言&#xff0c;一直在软件开…

el-date-picker限制时间选择,不能选择当前日期之后时间

要求&#xff1a;时间选择不能超过当前日期之后的 效果&#xff1a; 结构代码&#xff1a;&#xff1a; <el-form-item label"时间&#xff1a;"><el-date-pickerv-model"time"type"datetimerange"range-separator"至"start…

【算法】重建二叉树并进行后序遍历的Java实现

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

做抖店如何避免被同行内卷?这5点建议,可以解决这个问题

我是王路飞。 都说2024年的抖店不赚钱了&#xff0c;商家太多了&#xff0c;太内卷了&#xff0c;一点都不好做~ 那为什么依然有很多商家在坚持做呢&#xff1f;为什么依然有很多新手入局呢&#xff1f; 无非是抖店确实能带来可观的利润回报罢了。 那如何避免被同行内卷呢&…

Linux-应用编程学习笔记(二、文件I/O、标准I/O)

一、文件I/O基础 文件 I/O 指的是对文件的输入/输出操作&#xff0c;就是对文件的读写操作。Linux 下一切皆文件。 1.1 文件描述符 在 open函数执行成功的情况下&#xff0c; 会返回一个非负整数&#xff0c; 该返回值就是一个文件描述符&#xff08;file descriptor&#x…

前端开发框架Angular

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Angular概述 Angular是由Google开发并维护的一款开源前端开发框架。它最初被设计为用于构建单页面应用&#xff08;SPA&#xff09;&#xff0c;但随着版本的更新和发展&am…

ssm招聘信息管理系统-计算机毕业设计源码78049

摘 要 由于数据库和数据仓库技术的快速发展&#xff0c;招聘客户管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。招聘客户系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的要求发生重大的变化。…

springboot集成nacos

springboot集成nacos 1.版本2. POM依赖3. nacos服务3.1 下载nacos压缩包3.2 启动nacos 4. yaml配置5.Demo5.1 配置中心简单格式获取方式普通方式还可以再启动类上添加注解完成5.2 获取json格式的demo5.2 自动注册根据yaml配置 1.版本 nacos版本:2.3.2 springboot版本&#xff…

OpenHarmony 实战开发——内核对象队列之算法详解

前言 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09; LiteOS-M 内核是面向 IoT 领域构建的轻量级物联网操作系统内核&#xff0c;具有小体积、低功耗、高性能的特点。在嵌入式领域的开发工作中&#xff0c;无论是自研还是移植系统&#xff0c;均绕不开…

IT行业现状与未来趋势简单分析

你眼中的IT行业现状与未来趋势 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是怎么样的&#xf…

AI视频教程下载:使用ChatGPT进行商务写作

你将学到什么&#xff1f; 学习如何将ChatGPT集成到你的写作过程中&#xff0c;并有效地将其用作商务写作的个人写作助手。 学习如何使用ChatGPT生成想法&#xff0c;提高你的书面沟通的结构、清晰度和连贯性。 你将学习使用ChatGPT的最佳实践&#xff0c;包括如何自定义其设…

【Unity程序】Unity游戏开发中常用的设计模式【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

堆溢出bug定位调试修复

最近代码出了bug&#xff0c;堆溢出。 debug下一切正常&#xff0c; release时随机崩溃到某几个地方&#xff0c; 报错是: Critical error detected c0000374 不是完全随机崩溃&#xff0c;崩溃到某几个正常的地方&#xff0c;开始怀疑是不是这几个地方真的有什么bug, 由于使…

极致产品力|从toB到toC,年销4.2亿份的冻干品牌是如何炼成的?

天野食品是日本冻干食品长红40年的品牌&#xff0c;从制造焦糖的小工厂&#xff0c;转变为日本冻干速食的行业第一&#xff0c;它是如何做到的呢? 深耕TOB业务&#xff0c;如何在ToC业务创造增长 天野公司以冻干食品闻名但并非以此起家。自1940年成立以来&#xff0c;便以染料…

智慧冶金:TSINGSEE青犀AI+视频技术助力打造高效、安全的生产环境

一、建设背景 冶金行业因其特殊的生产环境和工艺要求&#xff0c;对安全生产、环境保护以及质量监控等方面有着极高的要求。因此&#xff0c;将视频智能监控技术引入冶金行业&#xff0c;不仅有助于提升生产效率&#xff0c;更能有效保障生产安全&#xff0c;降低事故风险。 …

5.28 学习总结

一.CSS学习(一) 一、CSS简介 1、什么是CSS CSS&#xff1a;Cascading Style Sheet 层叠样式表是一组样式设置的规则&#xff0c;用于控制页面的外观样式 2、为什么使用CSS 实现内容与样式的分离&#xff0c;便于团队开发样式复用&#xff0c;便于网站的后期维护页面的精确…

跨境卖家必看!亚马逊商品3D建模怎么实现?

亚马逊引领3D内容革命&#xff0c;助力卖家提升商品展现力 亚马逊于2023年12月发布了一项重大公告&#xff0c;正式宣布&#xff1a;“平台将不再接受将360图像上传至产品详细页面的请求&#xff0c;而是全面采用3D模型来替代。”这一决策无疑预示着3D内容将在亚马逊平台上迎来…