STM32学习笔记(五)——通用定时器计数延时

STM32定时器概述

STM32F40x系列总共最多有14个定时器,定时器分为三类:基本定时器、通用定时器和高级定时器。它们的都是通过计数来达到定时的目的,和51的定时器差不多,基本原理都是一样的,就是功能多了一些,这些计数器都是自动重新装载初值的,使用起来非常方便,而且计数时钟频率可以通过分频系数来设置。本文章将介绍使用定时器中断来控制LED间隔1s闪烁。

 

计数的时钟来源主要有四个:

  • 内部时钟CK_INT
  • 外部时钟模式1:外部输入脚TIx
  • 外部时钟模式2:外部触发输入ETR,仅适用于 TIM2、 TIM3、 TIM4
  • 内部触发输入ITRx:使用 A 定时器作为 B 定时器的预分频器(A为B提供时钟)

我们使用定时器内部时钟,即CK_INT作为计数器的时钟源 = 168MHz / 2 = 84MHz

 

时钟框图如下:

 

 

定时器的配置

1.使能定时器时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    //定时器3时钟使能

 

2.初始化定时器参数,设置分频系数和计数初值,计数模式设置等。如果要定时1s定时器溢出,那么可以设置分频系数为8400 ,则分频后的时钟频率为 : 84MHz / 8400 = 10KHz  = 0。1ms  ,计数初值设置为1s / 0。1 ms = 10000即可。

    /*初始化定时器参数,设置自动重装值,分频系数,计数方式*/TIM_Init。TIM_ClockDivision=    TIM_CKD_DIV1;            //时钟分频因子TIM_Init。TIM_CounterMode=TIM_CounterMode_Up;                //定时器模式TIM_Init。TIM_Period=Period;                            //自动重装值,0-65535TIM_Init。TIM_Prescaler=  Prescaler;
//    TIM_Init。TIM_Prescaler=    8400;                    //分频系数-0。1ms
//    TIM_Init。TIM_Prescaler=    42000;                    //分频系数-0。5ms
//    TIM_Init。TIM_RepetitionCounter=    TIM_TimeBaseInit(TIM3,&TIM_Init);

 

 

TIM_RepetitionCounter是使用高级定时器要进行设置的。我们使用的是定时器3,属于通用定时器,计数模式设置为向上计数,则计数器从0 开始计数,当计数到设置的初值时,然后计数器重新从0开始计数,并将溢出标志位置1,如果设置了溢出中断,则会产生计数器溢出中断。

3.定时器3中断设置,注意优先级的设置,如果程序中开启了多个中断。就要考虑中断优先级的设置,本程序只使用了一个定时器中断,则配置为任何优先级都是可以的。

    /*定时器3中断优先级设置*/NC_Init。NVIC_IRQChannel=TIM3_IRQn;                    //中断通道指定定时器3NC_Init。NVIC_IRQChannelCmd= ENABLE;    NC_Init。NVIC_IRQChannelPreemptionPriority=0;        //设置抢占优先级NC_Init。NVIC_IRQChannelSubPriority=0;                //设置响应优先级NVIC_Init(&NC_Init);

 

4.使能定时器,当执行完这一句后,定时器就开始从 0 开始计数了。我们可以通过使能定时器来暂停计数器,或者使能定时器来启动定时器,在开发时钟时可以使用这个。

相当于51中的TR1 = 1 / TR1 = 0

    TIM_Cmd(TIM3,ENABLE);

 

5.中断服务函数,本程序是让LED1间隔1s闪烁,那么中断服务函数的功能就是让LED1的状态反转。

void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_IT_Update))    //如果产生溢出中断
    {LED1=!LED1;                    //那么状态反转
//        LED0=!LED0;
    }TIM_ClearITPendingBit(TIM3,TIM_IT_Update);        //清楚更新中断标志位
}

 

这里检测的是定时器溢出中断,即计时1s时间到,则将LED1的状态反转,然后将溢出标志位清零。

主函数

int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(168);LED_Init();                        //LED初始化熄灭Timer3_Config(2000,42000);        //0.5ms*2000 = 1swhile(1){LED0=!LED0;delay_ms(1000);            }
}

 

这里使用延时函数来延时1s控制LED0闪烁,实际运行效果可以看出两个LED的闪烁在一定的时间内是同步的,但是时间一长还是有点误差。

总结

当学完这一节定时器的时候,我就有一个想法了,那就是写一个LCD电子时钟的程序,通过定时器来达到准确延时的目的,当然还要学习一下LCD1602的驱动方法,哈哈,想想就很有成就感。

参考资料:

 STM32F4_TIM基本延时(计数原理)

STM32-通用定时器基本定时功能

STM32F4xx中文参考手册

 

以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。

 

2017年4月21日21:33:44

 

转载于:https://www.cnblogs.com/whik/p/6746177.html

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

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

相关文章

win10user文件夹迁移_Win10用户文件如何从系统盘转到其他盘

系统盘什么?就是放置Windows系统的硬盘。安装系统放在系统盘里,本身已经占了很大空间,可是用户文件也放在系统盘里。Win10如何把用户文件转移到非系统盘?下面就Win10消费者预览版Build9926为例,与大家分享一下把Win10用户文件移动到非系统盘…

第十九讲:职责链模式

public class CarBodyHandler extends CarHandler{Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");}} public abstract class CarHandler {public abstract void HandlerCar(); } public class CarHeadHandle…

十道解分式方程及答案_100道八年级分式方程及答案.

天.一辈子也打不完哪.再问: 50到吧再答: http://zhidao.baidu.com/question/238264424.html 个网址里面有一些,因为有字数限制,我不好发题目给你,所以你自己去看看吧。 例 解方程: (1)2xxx31; (2)15x215 x1…

四阶行列式直接展开_四阶行列式的完全展开式共有多少项

展开全部 共24项。 1.将该行列式前三列重复书写在该行列式的右边,可在前四列中作出两条对角线,然e5a48de588b662616964757a686964616f31333365663463后在此七列中作出相应的平行线,可得(图表一) 2.作乘积关系,可得如下八项: a11a22a33a44,a12a23a34a41,a13a24a31a42,a14a2…

c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...

I.11: 永远不要使用原始指针(T*)或引用(T&)来转移所有权原因如果对调用者或被调用者是否拥有对象有任何疑问,就会发生泄漏或过早析构。示例考虑:X* compute(args) // 不要这样做 { X* res new X{}; // ... return res; }谁来删除返回的X?当compute返…

for-each循环

for-each循环又叫for增强循环,不需要下标就可以顺序的便历整个数组例如 package cn.hsop.fentian;public class Forxunhuan {public static void main(String[] args) {int[] num { 5, 8, 3, 6 };//定义数组int maxnum[0] ;//假设最大值//遍历数组for (int a : num…

mysql8.0.13 32位下载_MySQL8.0下载-MySQL数据库8.0下载 v8.0.11官方版(32位/64位)--pc6下载站...

mysql是一款数据库管理系统,mysql一般网站开发者或者数据库开发者会用到,mysql拥有体积小巧、读取和存储速度快的特点,新版本完全脱了MylSAM存储引擎,改善了扫描性能,同时还重构了sql分析器,赶快下载使用吧…

处理有外键约束的数据

mysql SET FOREIGN_KEY_CHECKS 0; delete from approval_info;delete from approval_manage;delete from site_message;delete from works;delete from works_theme;SET FOREIGN_KEY_CHECKS 1; oracle drop tablename no CONSTRAINT 还有一个本办法就是 一个一个的找到主…

mysql clickhouse_通过mysql操作clickhouse

mysql软件安装至少需要安装一个mysql客户端,即要有mysql这个命令;也可以直接安装一个mysql数据库,不用可以不启动;clickhouse服务端配置mysql端口vim /etc/clickhouse-server/config.xml9004修改服务器端配置,需要重启…

手游产品经理初探(三)产品中的玩家行为

国内做手游的团队非常多都是一大抄,但非常多时候我们都没有抄到核心的东西,所谓的形象神不象就是这样。那么我们来看一个案例:这个界面是big fish做的玩家送礼物的画面。我们知道在社交类的游戏里面这是一个非经常见的功能,但非常…

mysql shell 所有表_删除mysql数据库中所有表的shell脚本

分享一个可以删除mysql中所有表的shell脚本,代码如下:复制代码 代码示例:#!/bin/bash# 删除mysql中所有表# 示例:# Usage: ./script user password dbnane# Usage: ./script user password dbnane server-ip# Usage: ./script user password …

gbdt和xgboost中feature importance的获取

来源于stack overflow,其实就是计算每个特征对于降低特征不纯度的贡献了多少,降低越多的,说明feature越重要 Ill use the sklearn code, as it is generally much cleaner than the R code. Heres the implementation of the feature_importances proper…

mysql数据库服务器名_mysql数据库服务器名

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…

python基础01

1、python介绍及与其它开发语言比较: 相比C、Java运行慢,但是代码简介,可以减小学习成本,加快项目进度。跨平台,支持Linux和Windows。 C语言是所有高级语言的基础,若要研究python语言的原理,需要…

mysql中的删除语法错误_mysql – EXPLAIN中的SQL语法错误

我试图让一个解释命令在mysql中工作.我正在尝试解决此删除查询的性能问题:DELETE FROM boost_cache_relationshipsWHERE base_dir cache/normal/www.dane101.comAND page_callback nodeAND page_type storyAND page_id 2891;此查询是SHOW FULL PROCESSLIST命令的…

[转]ClassPath是什么

from: https://my.oschina.net/GivingOnenessDestiny/blog/603505 classpath 是什么classpath实际上就是编译后的 以 classes 文件夹为起点的路径 各种path获取到的路径的区别 Main.class.getResource("");-> 得到的是当前class所在的路径 Main.class.getResource…

mysql group关键字_Mysql关键字之Group By(一)

原文地址,优先更新https://hhe0.github.iogroup by 是一个我们在日常工作学习过程中经常遇到的一个Mysql关键字。现总结其用法如下,内容会不断补充,出现错误欢迎批评指正。我们先准备一张表和一些记录我们首先创建学生的成绩表courses:CREATE…

【LeetCode】031. Next Permutation

题目: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). Th…

mysql ndb是什么_MySQL NDB Cluster介绍

最近翻译了好几篇关于NDB的文章,相信有很多人会有疑问,NDB Cluster究竟是个什么东西?它是一款新产品吗?它和InnoDB Cluster有什么不同?它是MySQL吗?它怎么使用?在这篇文章里,我将为大…

jQuery遍历,数组,集合

使用了jquery有段时间了&#xff0c;整理下jquery中的遍历问题。 1.jquery 遍历对象 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">< HTML> <HEAD> <TITLE> New Document </TITLE> <script language"…