本文出自:https://wenku.baidu.com/view/e3bdfb7601f69e31433294c4.html

STM32定时器时间的计算方法

STM32中的定时器有很多用法:
(一)系统时钟(SysTick)
设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数:
void RCC_Configuration(void)
{
RCC_ClocksTypeDef RCC_ClockFreq;
SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置.
RCC_GetClocksFreq(&RCC_ClockFreq);
//SYSTICK分频--1ms的系统时钟中断
if (SysTick_Config(SystemFrequency / 1000))
{   
    while (1);   // Capture error
}
}
void SysTick_Handler(void)//在中断处理函数中的程序
{
while(tim)
{
tim--;
}
}
//调用程序:
Delay_Ms(10);
当然,前提是要设置好,变量tim要设置成volatile类型的。
(二)第二种涉及到定时器计数时间(TIMx)
/*TIM3时钟配置*/
TIM_TimeBaseStructure.TIM_Prescaler = 2;       //预分频(时钟分频)72M/(2+1)=24M
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数
TIM_TimeBaseStructure.TIM_Period = 65535;        //装载值18k/144=125hz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
定时时间计算:
TIM_TimeBaseStructure.TIM_Prescaler = 2;
//分频2      72M/(2+1)/2=24MHz
TIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */
注意两点(来自大虾网,未经检验)
(1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟;
(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
是重复计数,就是重复溢出多少次才给你来一个溢出中断,
它对应的寄存器叫TIM1 RCR.
如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大!
 
假设系统时钟是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秒中断溢出一次
 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒*/
 
STM32通用定时器的基本定时器功能实现灯闪烁
/*MAIN.C*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "misc.h"
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void TIM3_Configuration(void);
/* Private functions ---------------------------------------------------------*/

int main(void)
{
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
TIM3_Configuration();
TIM_ClearFlag(TIM3, TIM_FLAG_Update);/*清除更新标志位*/
TIM_ARRPreloadConfig(TIM3, DISABLE);/*预装载寄存器的内容被立即传送到影子寄存器*/
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);  
TIM_Cmd(TIM3, ENABLE);

while (1) {
   ;
}
}

void TIM3_Configuration(void)
{
/*每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秒*/

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 9999;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/*此函数的语句"TIMx->EGR = TIM_PSCReloadMode_Immediate;"以软件方式产生更新事件(注:当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。)。*/
}

void RCC_Configuration(void)
{
SystemInit();
  
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

/* GPIOC clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
}

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the TIM3 gloabal Interrupt*/
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*注:不用为实现通用定时器的基本定时器功能配置Pin*/
}
/*stm32f10x_it.c*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
   /* Clear TIM3 update interrupt */
   TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
   GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));

STM32定时器时间的计算方法的更多相关文章

  1. STM32 定时器用于外部脉冲计数(转)

    源:STM32 定时器用于外部脉冲计数 STM32 定时器(一)——定时器时间的计算 STM32的定时器是灰常NB的,也是灰常让人头晕的(当然是对于白菜来说的). STM32中的定时器有很多用法: ( ...

  2. STM32定时器的预装载寄存器与影子寄存器之间的关系【转】

    首先转载:   STM32定时器的预装载寄存器与影子寄存器之间的关系 本文的说明依据STM32参考手册(RM0008)第10版:英文:http://www.st.com/stonline/produc ...

  3. 用STM32定时器测量信号频率——测频法和测周法[原创cnblogs.com/helesheng]

    工业测试与控制系统中,经常需要对未知信号的频率进行测试.对于10MHz以下的信号,用单片机(MCU)定时器完成这项任务显然是最常见和最佳的选择.目前性价比最高的单片机STM32拥有功能强大且数量众多的 ...

  4. STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器.那么STM32单片机的基本定时器如何操作以及编程呢? 下面我们就来详细的了解一下 STM32F1系列的产品,除 ...

  5. stm32定时器中断类型分析

    一直在用的stm32定时器的中断都是TIM_IT_Update更新中断,也没问为什么,直到碰到有人使用TIM_IT_CC1中断,才想到这定时器的中断类型究竟有什么区别,都怪当时学习stm32的时候不够 ...

  6. STM32 定时器用于外部脉冲计数

    STM32 定时器用于外部脉冲计数 第一步,设置GPIO GPIO_InitTypeDef GPIO_InitStructure; /* PA0,PA12-> 左右脉冲输入 */GPIO_Ini ...

  7. stm32定时器输出移相PWM(非主从模式)

    背景:由于项目需要,需要stm32输出任意相角度的PWM 前提知识: 1.stm32定时器的Tim,一般有多个OC.具体差别根据型号来定. 2.定时器的使能,理论上是多个通道同时使能 3.TIM_OC ...

  8. Mysql 查看定时器 打开定时器 设置定时器时间

    1.查看是否开启evevt与开启evevt. 1.1.MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的. show VARIABLES ...

  9. 玩转X-CTR100 l STM32F4 l 定时器时间测量

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 使用处理器内部硬件定 ...

随机推荐

  1. 基于TCAM 的高速路由查找

    摘要 随着路由器接口速率的提高,传统的软件路由查找机制已经不能满足要求.目前常见的硬件解决方案是采用TCAM实现关键词 TCAM,路由查找,最长前缀匹配. 1.引言 路由器转发IP 分组时,转发引擎需 ...

  2. 虚拟环境之virtualenvwrapper

    原来的virtualenv工具使用特别麻烦,主要体现在以下几点 1 创建虚拟环境的命令太长,太难记 2 管理特别麻烦 3 进入虚拟环境需要找到这个虚拟环境的存放目录才行,如果没有统一的存放目录,很难找 ...

  3. Java SubString截取字符串

    在String中有两个substring()函数,如下: 一:String.substring(int start) 参数: start:要截取位置的索引 返回: 从start开始到结束的字符串 例如 ...

  4. 将SD卡的音频设置为手机铃声后删除,手机铃声没有恢复到默认的问题

    1. Android7.0,将存储卡中MP3设置为铃声,删除该MP3后,settings中的铃声没有变化,来电铃声也没有变化. 原因:android7.0的新特性 google 默认如此设计,在选择铃 ...

  5. BigDecimal加减乘除

    import java.math.BigDecimal; public class Testmath { public static void main(String[] args) { String ...

  6. python如何实现像shell中的case功能

    我们知道在shell脚本里是支持case语句,当位置参数为空时,会提示我们怎么使用脚本 那么在python怎么实现呢?也使用case吗? python里不支持case语句,但是也有实现case的方法. ...

  7. CT ubuntu 16.04安装 adobe flash player

    sudo apt-get  install flashplugin-installer chrome 升级 chrome://chrome-urls/ chrome://components/ 找到A ...

  8. CHECK约束表达式

    1.性别:只能填写'男'和'女' (字段名='男'or 字段名='女') 注意:单引号里的值可以为其他任何字 2.规定密码长度不能小于6位数 (len([字段名])>(5))   3.例:成绩在 ...

  9. MySQL5.7 GTID学习笔记

    GTID(global transaction identifier)是对于一个已提交事务的全局唯一编号,前一部分是server_uuid,后面一部分是执行事务的唯一标志,通常是自增的. 下表整理了G ...

  10. sql循环查询树形结构

    pid:父类别id ' connect by prior pid = id --查询父祖类别 union ' connect by prior id = pid;--查询子孙类别 这样查询出选中id ...