STM32 定时器定时时间的计算

发布者:数据之翼最新更新时间:2016-10-17 来源: eefocus关键字:STM32  定时器  定时时间 手机看文章 扫描二维码
随时随地手机看文章
假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1得到关键是设定 时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为: ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒。定时器的基本设置如下:

1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数   例如 :时钟频率=72/(时钟预分频+1)。 

   2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)。

   3、TIM_TimeBaseStructure.TIM_CounterMode=TIM1_CounterMode_Up; //定时器模式向上计数。

   4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值。 

   5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器2。

   6、  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  //打开中断溢出中断。  

   7、 TIM_Cmd(TIM2, ENABLE);//打开定时器或者:

TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999,72M/

(35999+1)/2=1Hz  1秒中断溢出一次。

   8、 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒。

 

通用定时器实现简单定时功能

 

以TIME3为例作为说明,简单定时器的配置如下:

void TIM3_Config(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_DeInit(TIM3);                              //复位TIM2定时器

    /* TIM2 clock enable [TIM2定时器允许]*/

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    /* TIM2 configuration */

    TIM_TimeBaseStructure.TIM_Period = 49;          // 0.05s定时       

    TIM_TimeBaseStructure.TIM_Prescaler = 35999;    // 分频36000       

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分割  

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    /* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */

    TIM_ClearFlag(TIM3, TIM_FLAG_Update);

    /* Enable TIM2 Update interrupt [TIM2溢出中断允许]*/

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);  

    /* TIM2 enable counter [允许tim2计数]*/

    TIM_Cmd(TIM3, ENABLE);

}

 

通用定时器实现外部脉冲计数功能(对外部时间计数)

 

以TIME2为例作为说明,提供一个小程序以供参考(只提供主程序,不提供其它的基础配置):

int main(void)

{

     #ifdef DEBUG

     debug();

     #endif

     int i_Loop;

  int n_Counter;

  RCC_Configuration();   // System Clocks Configuration

  NVIC_Configuration();  // NVIC configuration

  GPIO_Configuration();  // Configure the GPIO ports

     USART_InitStructure.USART_BaudRate = 115200;

     USART_InitStructure.USART_WordLength = USART_WordLength_8b;

     USART_InitStructure.USART_StopBits = USART_StopBits_1;

     USART_InitStructure.USART_Parity = USART_Parity_No ;

    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

     USART_InitStructure.USART_Clock = USART_Clock_Disable;

     USART_InitStructure.USART_CPOL = USART_CPOL_Low;

     USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;

     USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

     /* Configure the USARTx */

     USART_Init(USART1, &USART_InitStructure);

     /* Enable the USARTx */

     USART_Cmd(USART1, ENABLE)

TIM_TimeBaseStructure.TIM_Period = 0xFFFF;

TIM_TimeBaseStructure.TIM_Prescaler = 0x00;

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);

TIM_SetCounter(TIM2, 0);

TIM_Cmd(TIM2, ENABLE);

for(i_Loop = 0; i_Loop < 1000; i_Loop ++)

   {

        GPIO_SetBits(GPIOC, GPIO_Pin_6);

        Delay(100);

        GPIO_ResetBits(GPIOC, GPIO_Pin_6);

        Delay(100);

 }

n_Counter = TIM_GetCounter(TIM2);

    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

    printf("检测到的脉冲个数为:%d\n",n_Counter);

    while (1) {

              }

}

关键字:STM32  定时器  定时时间 引用地址:STM32 定时器定时时间的计算

上一篇:STM32的BOOT(模式)
下一篇:stm32 重定义printf导致无法跳到main函数问题

推荐阅读最新更新时间:2024-03-16 15:15

2440裸机编程之五 定时器
S3C2440A 具有5 个16 位定时器,每个定时器可以按照中断模式或DMA 模式工作。定时器0,1,2,3 具有PWM 功能。定时器4 是一个内部定时器,不具有对外输出口线。定时器0 还具有死区发生器,通常用于大电流设备。 定时器特性总结如下。 ● 5 个16 位定时器可以工作在中断模式或DMA 模式。 ● 包括2 个8 位预分频器、2 个4 位分割器。 ● 输出波形的占空比可用编程控制(即进行脉宽调制)。 ● 具有自动重载模式或单次触发模式。 ● 具有死区发生器。 与定时器相关的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn 定时器的频率由PCLK分频而来,即Ftimer = P
[单片机]
2440裸机编程之五 <font color='red'>定时器</font>
mini2440裸机试炼之——PWM定时器按键更改频率
资料:《s3c2440中文数据手册(完整版)》 第九章:输入输出端口 ; 第十章:PWM蜂鸣器 //按按键k1蜂鸣器频率降低, //按按键k2蜂鸣器频率升高, //按按键k3退出蜂鸣器测试 //按按键k4开启蜂鸣器测试 #define GPBCON (*(volatile unsigned long*)0x56000010) //rGPBCON是指向0x56000010这个地址空间的一个宏 #define GPBDAT (*(volatile unsigned long*)0x56000014) //led GPIO #define GPGCON (*(volatile unsigned long*)0x
[单片机]
STM32 上使用 USB Host 读写 U 盘
简介 USB(Universal Serial Bus)是一种支持热插拔的通用串行总线。它使用差分信号来传输数据,在 USB 1.0和 USB 1.1 版本中,只支持 1.5Mb/s 的低速(low-speed)模式和 12Mb/s 的全速(full-speed)模式,在 USB 2.0 中,又加入了480Mb/s 的高速模式,USB 3.0(super speed),传输速率最大5Gbps。在 USB 体系中又包括 USB Host(主机)和USB Device(设备)USB Host任何USB系统中只有一个主机。主机系统的USB接口被称为主机控制器。主机控制器可以以硬件,固件或软件的组合来实现。根集线器集成在主机系统内以提
[单片机]
<font color='red'>STM32</font> 上使用 USB Host 读写 U 盘
STM32片上外设时钟使能、失能和复位的区别
1 RCC时钟说明 在STM32参考手册中,都有Reset and Clock Control(RCC)复位和时钟控制的章节。 在这一章节就可以看到有两类寄存器:peripheral reset register(RSTR)外设复位寄存器和peripheral clock enable register(ENR)外设时钟使能寄存器。 我们拿STM32F1参考手册为例,可以看到如下图寄存器: 一种是控制外设时钟的寄存器,一种是复位外设的寄存器。 2 外设时钟使能和失能 我们都知道,配置STM32外设,会先开启对应的时钟(也就是使能外设时钟)。 比如使能USART1时钟: RCC_APB2PeriphC
[单片机]
<font color='red'>STM32</font>片上外设时钟使能、失能和复位的区别
如何进行多个定时器主从级联同步输出详细配置示例说明
有些应用场合,我们需要使用多个定时器主从级联,然后让各个定时器同时启动并做同频同相的PWM波形输出。要完成这个功能,有时发现实现起来似乎并没有那么顺畅,这里基于STM32F1系列芯片做个配置示例。之所以选择STM32F1芯片主要是考虑到有部分人使用STM32F1芯片并基于标准库做开发,那么,我这里就Cube库和标准库给出两套相关主从配置的示例代码,供有需要的人参考。 在调试验证过程中我选择STM32F103 Nucleo板,主芯片为STM32F103RB.将片内定时器TIM1/TIM2/TIM3/TIM4四个定时器主从首尾相连,同时启动并要求四个定时器输出同频同相信号。 先查看STM32F1参考手册相关章节【这个环节是必不
[单片机]
如何进行多个<font color='red'>定时器</font>主从级联同步输出详细配置示例说明
STM32实验连载之四:读取芯片唯一ID号
产品唯一的身份标识的作用: ● 用来作为序列号(例如USB字符序列号或者其他的终端应用); ● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性; ● 用来激活带安全机制的自举过程; 96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。嘿嘿,要注意大端小端模式哟~~~ 以下是相关代码: * 函数名:Get_ChipID * 描述 :获取芯片ID * 输入 :无
[单片机]
分析TCP/IP协议栈代码之UDP(STM32平台)
1. UDP介绍 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。 UDP数据报封装成一份 IP数据报的格式如图11 - 1所示。 RFC 768 是UDP的正式规范。 UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP而使用一种可靠协议如TCP。在讨论完TCP后将再回到这个话题,看看什么样的应用程序可以使用UDP。 2. UDP首部 UDP首部的各字段如图1
[单片机]
分析TCP/IP协议栈代码之UDP(<font color='red'>STM32</font>平台)
STM32 RTC实时时钟(二)
上次实验完成了对实时时钟的基本功能——计时的实验,这次在计时的基础上对RTC的可编程闹钟的功能进行测试。 RTC 单元提供两个可编程闹钟,即闹钟 A 和闹钟 B。 可通过将 RTC_CR 寄存器中的 ALRAE 和 ALRBE 位置 1 来使能可编程闹钟功能。如果日历亚秒、秒、分钟、小时、日期或日分别与闹钟寄存器RTC_ALRMASSR/RTC_ALRMAR 和RTC_ALRMBSSR/RTC_ALRMBR 中编程的值相匹配,则 ALRAF 和 ALRBF 标志会被置为1。可通过 RTC_ALRMAR 和 RTC_ALRMBR 寄存器的 MSKx 位以及 RTC_ALRMASSR 和RTC_ALRMBSSR 寄
[单片机]
<font color='red'>STM32</font> RTC实时时钟(二)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved