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-65535
TIM_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; //中断通道指定定时器3
NC_Init。NVIC_IRQChannelCmd= ENABLE;
NC_Init。NVIC_IRQChannelPreemptionPriority=; //设置抢占优先级
NC_Init。NVIC_IRQChannelSubPriority=; //设置响应优先级
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();
LED_Init(); //LED初始化熄灭
Timer3_Config(,); //0.5ms*2000 = 1s
while()
{
LED0=!LED0;
delay_ms();
}
}

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

总结

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

参考资料:

STM32F4_TIM基本延时(计数原理)

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

STM32F4xx中文参考手册

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

2017年4月21日21:33:44

STM32学习笔记(五)——通用定时器计数延时的更多相关文章

  1. STM32学习笔记(五) USART异步串行口输入输出(轮询模式)

    学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...

  2. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  3. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  4. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  5. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  6. STM32学习笔记——OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  7. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  8. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  9. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

随机推荐

  1. Maven settings.xml配置解读

    本文对${maven.home}\conf\settings.xml的官方文档作个简单的解读,请确保自己的maven环境安装成功,具体安装流程详见Maven安装 第一步:看settings.xml的内 ...

  2. nodejs学习第一天之模块

    1.运行js文件 2.node 与 js 的区别 相同:数据类型,语法结构,对象  等基本一致 不同:在js中的顶层对象window 在node中没有在node中 顶层对象为global对象 其不对外 ...

  3. UI --UIView 及其子类

    一 > UIView  1> iOS 概述: iOS 是 Apple 公司的移动操作系统,主要用于iPhone, iPad, iPad Mini , iPod Touch 等移动产品. 借 ...

  4. JavaWeb从0开始学(二)-----JSP基本语法与编译指令

    在上一节中我们学习了如何搭建一个简单的Web应用,并且已经知晓了一个JSP页面主要由静态的HTML内容和动态的Java脚本共同组成.JSP的基本语法共有JSP注释.JSP声明.输出JSP表达式与JSP ...

  5. WCF请求数据:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。

    通常情况下,写好WCF服务后都会用自带的WCFClient工具进行测试,在进行时数据请求的时候,如果返回数据量超过默认接收值的时候就会提示如图异常错误. 错误也提示的很清楚,无非就是修改接收值大小的问 ...

  6. scrapy学习笔记

    1.scrapy用哪条命令行重新编辑已有的项目?cd projectname 2.如何在pycharm中开启scrapy?先在终端创建一个项目(即文件夹),再在pycharm中打开.

  7. Android之XListView下拉刷新,更新网络美女图

    一.简介:   下拉刷新是一种特定的手动刷新交互,和其他的同类操作不同的地方在于它采用了更加直觉的下拉操作,所以它的交互足够清晰明显. 下拉刷新主要用在类似ListView这样的控件,设计下拉刷新有三 ...

  8. C# const和readonly修饰符的区别

    const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...

  9. rgba()和opacity的使用

    rgba()表示 红 绿 蓝 alpha ,W3C指在原有的rgb颜色模型之后增加了 “alpha”参数,“可以让制定的颜色透明化”(rgb()上扩展的,其只可以设置颜色,而不能使设置的颜色透明化) ...

  10. httpclient源码分析之MainClientExec

    MainClientExec是HTTP请求处理链中最后一个请求执行环节,负责与另一终端的请求/响应交互,也是很重要的类. 源码版本是4.5.2,主要看execute方法,并在里面添加注释.接着详细说下 ...