STM32用一个定时器封装多个定时函数调用

  1. 用一个定时器开一个1ms的中断:

头文件宏定义如下:

#define            BASIC_TIM                   TIM6
#define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            BASIC_TIM_CLK               RCC_APB1Periph_TIM6
#define            BASIC_TIM_Period            1000-1
#define            BASIC_TIM_Prescaler         71
#define            BASIC_TIM_IRQ               TIM6_IRQn
#define            BASIC_TIM_IRQHandler        TIM6_IRQHandlerextern uint32_t  LibVarTimer[10];                   //°´¼ü´¥·¢,×ö¸ßµçƽ´æ´¢extern BOOL LibTimer(uint8_t Channal,BOOL Trigger,uint32_t Time,BOOL Signal);

配置函数如下:

static void BASIC_TIM_Config(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;    TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;//TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);TIM_Cmd(BASIC_TIM, ENABLE);
}

中断优先级配置如下:

static void BASIC_TIM_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);       NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

中断函数如下:

void BASIC_TIM_IRQHandler(void)
{uint8_t i;if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ) {    for(i=0;i<10;i++){LibVarTimer[i]++;}TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);          }
}

2.开始封装函数

uint32_t  LibVarTimer[10]={0,0,0,0,0,0,0,0,0,0};
uint8_t  LivVarTimeTriggerLast[10];
uint8_t  LibVarTimeEdgeStart[10];
uint8_t  LibVarTimeSignalLast[10];      /* ******************************************************
** 输入参数:Channal:通道;Trigger:电平;Time:时间;Signal:输入;
** 返回参数:溢出产生一次上升沿触发
** *************************************************** */
BOOL LibTimer(uint8_t Channal,BOOL Trigger,uint32_t Time,BOOL Signal)
{uint8_t Result=0;if(Channal<10){switch(Trigger){case 0://低电平if(LivVarTimeTriggerLast[Channal]!=0 || Signal!=0){LibVarTimer[Channal] = 0;}Result = 0;while(LibVarTimer[Channal]>=Time){LibVarTimer[Channal] -= Time;Result = 1;}break;case 1://高电平if(LivVarTimeTriggerLast[Channal]!=1 || Signal!=1){LibVarTimer[Channal] = 0;}Result = 0;while(LibVarTimer[Channal]>=Time){LibVarTimer[Channal] -= Time;Result = 1;}break;case 2://上升沿if(LivVarTimeTriggerLast[Channal]!=2){LibVarTimer[Channal] = 0;LibVarTimeEdgeStart[Channal] = 0;}if(LibVarTimeEdgeStart[Channal]==0){LibVarTimer[Channal] = 0;}if(Signal>0 && LibVarTimeSignalLast[Channal]==0){LibVarTimeEdgeStart[Channal] = 1;}Result = 0;while(LibVarTimer[Channal]>=Time){LibVarTimer[Channal] -= Time;LibVarTimeEdgeStart[Channal] = 0;Result = 1;}break;case 3://下降沿if(LivVarTimeTriggerLast[Channal]!=3){LibVarTimer[Channal] = 0;LibVarTimeEdgeStart[Channal] = 0;}if(LibVarTimeEdgeStart[Channal]==0){LibVarTimer[Channal] = 0;}if(Signal==0 && LibVarTimeSignalLast[Channal]>0){LibVarTimeEdgeStart[Channal] = 1;}Result = 0;while(LibVarTimer[Channal]>=Time){LibVarTimer[Channal] -= Time;LibVarTimeEdgeStart[Channal] = 0;Result = 1;}break;               default:Result = 0;}LivVarTimeTriggerLast[Channal] = Trigger;LibVarTimeSignalLast[Channal] = Signal;     }return Result;
}

由一个定时器封装出10个函数可以调用,
缺点:比较占内除,

STM32用一个定时器封装多个定时函数调用相关推荐

  1. STM32单片机一个定时器输出不同频率PWM波

      在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式.可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_C ...

  2. stm32初学之定时器TIM的基本定时功能以及介绍

    文章目录 前言 一.定时器基本介绍以及定时器原理图 1.定时器基本介绍 2.定时器原理图 3.定时器配置 二.定时器计算 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一.定时器基本介绍以及定 ...

  3. STM32用一个定时器输出多路不同频率及占空比的PWM(输出比较模式)

    我们使用STM32输出PWM时会使用定时器的PWM输出模式来进行生成,但是这样子生成PWM是有局限的,它只能生成四路频率相同的PWM,当你设定了TIMx_PSC(预分频寄存器)和TIMx_ARR(自动 ...

  4. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  5. 【STM32编程】一个定时器生成多路PWM波形的原理和方法

    PWM产生原理 PWM的周期t1是一个固定值,如1ms,10ms,100ms等,在一个周期中包含了高电平t2和低电平t3,它们的关系是t2+t3=t1.改变一个周期中高电平的时间,就能达到速度或者功率 ...

  6. stm32f4 用一个定时器输出多个不同频率占空比PWM波(含代码)

    之前有写过怎么使用定时器生成PWM波,以及怎么修改频率与占空比,具体大家可以看下面这篇 stm32f4 生成PWM波_居安士的博客-CSDN博客_stm32产生pwm波 STM32每一个定时器都有4路 ...

  7. c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS

    最近才发现原来我把定时器里的配置参数代表的意义给搞混了,这里记录一下,防止以后自己忘记. 以建立一个定时1mS定时器为例: 1.先打开定时器 2.配置好时钟 3.配置定时器设置 重点来了,以前在这里我 ...

  8. STM32的一个通用定时器理论上可以当做N个来用

    这个想法还是来自于PLC,学过PLC的都知道,在PLC中定时器是用很多的,西门子S7-1200中定时器是这样的 想用更多的定时器可以这样 而且这么多定时器同时或者不同时工作都不会相互影响,原因就是相当 ...

  9. STM32一个定时器同时捕获4路PWM波

    问题的提出: 最近需要用航模遥控器控制遥控车,32单片机做主控,需要用到4个通道即需要捕获4路PWM波.如果用四个定时器来捕获四路PWM波,就太浪费资源了.由于STM32单片机的定时器资源有限,故设想 ...

最新文章

  1. C 语言中的 switch 语句 case 后面是否需要加大括号
  2. python mp4提取音频加入另一段视频_使用 PHP-FFMpeg 操作视频/音频文件
  3. 利用scrapy和MongoDB来开发一个爬虫
  4. 获取控件坐标位置一直是0
  5. LeetCode 1120. 子树的最大平均值(DFS自底向上)
  6. 图像识别(3)---验证码篇
  7. 对比AppScan Source和Fortify扫描AltoroJ的结果
  8. 2018/9/18单舵轮AGV项目笔记之二
  9. python视频补帧_AI 复原 100 年前的京城老视频,靠这三个开源工具
  10. 苹果电脑怎么更换计算机模式,苹果笔记本电脑双系统怎么切换
  11. 使用tkinter canvas绘制中国象棋棋盘
  12. cocos2d-x精灵的放大和缩小
  13. CSDN博客个人主页左侧栏添加微信二维码
  14. vue+element 将密码输入框的小圆点显示为星号
  15. Android 开启移动网络(GPRS 3G)
  16. 爬取天猫店铺列表页的所有数据
  17. 华为交换机修改telnet接口号
  18. 高防IP是什么,怎么防攻击
  19. CNTK-神经网络(NN)概念
  20. 服务器机柜的保修维修方案,机柜保修

热门文章

  1. 深入好文:数字经济技能:基于角色的数字技能培养方法、行业趋势、未来及未来的关键角色、这些角色的学习路径
  2. 湖南大学计算机学硕推免率,好几个帖子都在讨论清北华五的推免生源我来发一下b类大学湖大今...
  3. CCTalk:为什么你做了很多无效的自动化?
  4. 计算机维护系统Win8PE,Win8PE x86应急维护系统BIOS-MBR硬盘版
  5. 电脑录音软件哪个比较专业
  6. 知犀思维导图,在线免费创作思维导图
  7. 移动支付探索海外,将普及全球
  8. Arduino 下初试 stm32开发板
  9. Java后端技术面试汇总(第一套)
  10. 生活已经离不开网络,家用路由器与工业路由器有哪些区别,必备知识看完就明白