这个想法还是来自于PLC,学过PLC的都知道,在PLC中定时器是用很多的,西门子S7-1200中定时器是这样的

想用更多的定时器可以这样

而且这么多定时器同时或者不同时工作都不会相互影响,原因就是相当于在生成定时器时也同时为这个定时器分配了储存其数据的内存,也就是背景数据块。我们看一下定时器的输入输出参数

两输入两输出,输入分别是定时器使能以及定时给定时间,输出分别是定时器定时时间到的标志位和当前时间值,是不是用起来很方便呢

在C语言中我定义了一个结构体变量用来存放这四个参数,同时定义三个结构体数组分别对应三个时间单位为1ms、10ms和100ms的定时器数量。

#define Timer_1ms_Quantity  10
#define Timer_10ms_Quantity  10
#define Timer_100ms_Quantity  10 typedef struct{u8 IN;u8 Q;u16 PT;u16 ET;}IEC_TIMER;extern IEC_TIMER TIMER_TON_1MS[Timer_1ms_Quantity],TIMER_TON_10MS[Timer_10ms_Quantity],TIMER_TON_100MS[Timer_100ms_Quantity];   

这样定时器的大致轮廓就有了,下面用三个定时器分别定时1ms、10ms和100ms来得到定时时间单位

void TIM2_Int_Init(u16 arr,u16 psc);
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM4_Int_Init(u16 arr,u16 psc);
void IEC_TIMER_Init(void);
void TIM2_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_TimeBaseInitStructure.TIM_Period=arr;TIM_TimeBaseInitStructure.TIM_Prescaler=psc;TIM_TimeBaseInitStructure.TIM_ClockDivision=0;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2,ENABLE);
}void TIM3_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitStructure.TIM_Period=arr;TIM_TimeBaseInitStructure.TIM_Prescaler=psc;TIM_TimeBaseInitStructure.TIM_ClockDivision=0;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM3,ENABLE);
}void TIM4_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_TimeBaseInitStructure.TIM_Period=arr;TIM_TimeBaseInitStructure.TIM_Prescaler=psc;TIM_TimeBaseInitStructure.TIM_ClockDivision=0;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM4,ENABLE);
}void IEC_TIMER_Init(void)
{TIM2_Int_Init(9,7199);//1msTIM3_Int_Init(99,7199);//10msTIM4_Int_Init(999,7199);//100ms
}

对定时器进行配置

下面编写定时器中断函数

void TIM2_IRQHandler()    //TIM2中断
{u8 i=0;if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 for(i=0;i<Timer_1ms_Quantity;i++){if( TIMER_TON_1MS[i].IN&&TIMER_TON_1MS[i].ET < TIMER_TON_1MS[i].PT){TIMER_TON_1MS[i].ET++;}if(TIMER_TON_1MS[i].IN && TIMER_TON_1MS[i].ET >= TIMER_TON_1MS[i].PT)TIMER_TON_1MS[i].Q = 1;elseTIMER_TON_1MS[i].Q = 0;if(TIMER_TON_1MS[i].IN == 0){TIMER_TON_1MS[i].Q = 0;TIMER_TON_1MS[i].ET = 0;}}}
}void TIM3_IRQHandler()   //TIM3中断
{u8 i;if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 for(i=0;i<Timer_10ms_Quantity;i++){if(TIMER_TON_10MS[i].IN && TIMER_TON_10MS[i].ET < TIMER_TON_10MS[i].PT)TIMER_TON_10MS[i].ET ++;if(TIMER_TON_10MS[i].IN && TIMER_TON_10MS[i].ET >= TIMER_TON_10MS[i].PT)TIMER_TON_10MS[i].Q = 1;elseTIMER_TON_10MS[i].Q = 0;if(TIMER_TON_10MS[i].IN == 0){TIMER_TON_10MS[i].Q = 0;TIMER_TON_10MS[i].ET = 0;}}}
}void TIM4_IRQHandler()    //TIM4中断
{u8 i;if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 for(i=0;i<Timer_100ms_Quantity;i++){if(TIMER_TON_100MS[i].IN && TIMER_TON_100MS[i].ET < TIMER_TON_100MS[i].PT)TIMER_TON_100MS[i].ET++;if(TIMER_TON_100MS[i].IN && TIMER_TON_100MS[i].ET >= TIMER_TON_100MS[i].PT)TIMER_TON_100MS[i].Q = 1;elseTIMER_TON_100MS[i].Q = 0;if(TIMER_TON_100MS[i].IN == 0){TIMER_TON_100MS[i].Q =0 ;TIMER_TON_100MS[i].ET = 0;}}}
}

好了,大功告成。这样在我们工程中如果需要大量定时器就可以通过这种方法去实现。比如要定时50ms时间,我们可以选择时间单位为10ms的定时器,在程序中我定义10ms单位的定时器数量为10个

#define Timer_10ms_Quantity  10

通过修改这个值就可以改变定时器数量,就是用多少定义为多少就行了,不要多哪怕一个。

如果我们要用第三个定时器,首先设置定时时间

 TIMER_TON_10MS[2].PT = 5; //5*10=50ms

则打开定时器为

 TIMER_TON_10MS[2].IN = 1;

定时时间到则可以使用if语句来判断

     if(TIMER_TON_10MS[2].Q == 1){}

好了,这次就写到这里,另外这里面TON的意思是向上计数,向下计数TOF也是同理,如果有时间我会写出来分享给大家的

资源附件搜索:STM32的一个通用定时器理论上可以当做N个来用

STM32的一个通用定时器理论上可以当做N个来用相关推荐

  1. STM32学习笔记——通用定时器的PWM介绍及配置

    脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是 ...

  2. 【STM32】7—通用定时器 时钟树学习

    目录 0 实验预期效果 1 相关原理图 2 定时器TIM2与时钟树 2.1 TIM2 简介与特性 2.2 时钟树 3 软件配置 3.1 配置GPIO 3.2 配置定时器TIM2 4 代码编写 0 实验 ...

  3. STM32学习笔记 通用定时器TIM3~TIM5 13

    通用定时器TIM3~TIM5 TIM3~TIM5简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出 ...

  4. STM32学习之通用定时器中断

    2018/7/18 STM32定时器学习 高级寄存器TIM1和TIM8 通用寄存器TIM2,TIM3,TIM4,TIM5 基本寄存器TIM6,TIM7 通用寄存器是由 时钟.时基单元.输入.输出组成. ...

  5. STM32学习记录 -- 通用定时器的配置(TIM2-TIM5)

    前言 在我们编代码的时候,往往需要固定一程序心跳包去进行一个保活,或者给一个程序运行一个固定的时候,再或者是PWM的使用,都离不开定时器的使用,不仅方便我们处理数据,还给我们节约了MCU的内存,让我们 ...

  6. STM32 通用定时器基本原理

    STM32F10x系列总共最多有8个定时器: 三种STM32定时器区别: 通用定时器功能特点描述: ①. STM32 的通用 TIMx (TIM2.TIM3.TIM4 和 TIM5)定时器功能特点包括 ...

  7. STM32学习心得十八:通用定时器基本原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容: 1) 三种定时器分类及区别: 2) 通用定时器特点: 3) 通用定时器工作过程: 4) 实验一:定时器中断实验补充知识及部代码解读: 6) 实验二:定时器PWM输 ...

  8. STM32 通用定时器原理介绍

    一.STM32 通用定时器简介 STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器 (CNT)构成.STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ...

  9. STM32通用定时器基本原理

    参考正点原子视频 STM32定时器 共有 8 个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO.通 ...

最新文章

  1. 在ATS 5.3.0上开启stats_over_http插件
  2. python元组转字典_python中怎么将元组、字典转化为列表
  3. 区分什么是Apache、Tomcat,之间有什么关系?
  4. [置顶] Linux协议栈代码阅读笔记(一)
  5. HDU-2037-今年暑假不AC
  6. 队列 和 线程 之GCD dispatch
  7. 集合遍历[设计模式总结] 9. 迭代器模式
  8. 经典C语言程序100例之三九
  9. PowerDesigner中的对象与关系映射建模
  10. arm cpu 超频_树莓派 400 超频方法介绍
  11. [react] 说说你对windowing的了解
  12. python爬虫获取标签规则_Python爬虫之数据提取-selenium定位获取标签对象并提取数据...
  13. python流星雨代码_用python一起来看流星雨
  14. 游戏引擎:BigWorld(大世界3D游戏引擎)、KBengine、Skynet
  15. SpringCloud微服务后台管理系统
  16. 企业微信 网页授权登入
  17. python图片查看器
  18. 日语一级800个核心词汇
  19. HTML和CSS总结(基础版)
  20. Linux C语言 创建一个简单的守护进程

热门文章

  1. 嵌入式--轮询调度模块
  2. 2020电工(初级)考试题库及电工(初级)模拟考试题
  3. php登陆网页版微信代码,几行php代码实现微信自动注册登陆 (微信PC扫码受权登陆注册)...
  4. 北航计算机考研机考,11北航计算机复试上机
  5. 百度 Hydra 工具在移动端 UI 兼容性测试上的高效应用
  6. php while 无限循环,php - 在PAMI中发起呼叫-无限while循环 - 堆栈内存溢出
  7. 域名防劫持 稳定快速。
  8. “5G通达,AI赋能“ AI在网络规划中的应用实践(人工智能应用案例)
  9. 香蕉派 BPI-P2 Zero 四核开源物联网开发板,支持PoE网络供电
  10. 解决国内手机安装Google Play打开闪退问题