毕业设计需要使用比较多的定时器,但手上的F103C8T6核心板定时器资源比较少,所以被迫使用高级定时器1(一直都是用通用定时器,毕竟以前玩F429的时候管脚资源充足,就没有去学习高级定时器的用法,以为完全一样的用法,但是移植程序过程还是发现好些需要注意的地方)。下面列出程序中与通用定时器有差别的地方。

用到的定时器是TIM1通道4,原型是作为超声波捕获,单独拿出配置定时器输入捕获函数和中断服务函数来说明,程序都写了注释,没有一一说明的地方可以直接看注释。

  1. 高级定时器TIM1和GPIOA时钟来源都是APB2


    由上面两图可知,需要使能的是TIM1时钟和GPIOA时钟:
    //使能TIM1和GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//初始化TIME时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOA时钟


2. GPIOA中的PA11配置为输入模式,PA12设置为输出模式

    //配置PA11GPIOA_Initstructure.GPIO_Pin=GPIO_Pin_11;//PA11GPIOA_Initstructure.GPIO_Mode=GPIO_Mode_IPD;//输入GPIO_ResetBits(GPIOA,GPIO_Pin_11); //PA11 下拉GPIO_Init(GPIOA,&GPIOA_Initstructure);//配置PA12GPIOA_Initstructure.GPIO_Pin=GPIO_Pin_12;//PA12GPIOA_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出             GPIOA_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIOA_Initstructure);

关于GPIO口的八种模式原子论坛有帖子说的很详细,以前看过的,有兴趣可以去搜索。

  1. 初始化TIM1、置 TIM1 的输入比较参数、
    //初始化 TIM1, 设置 TIM1 的 ARR 和 PSCTIM1_CH4_Handler.TIM_Prescaler=psc;//预分频系数TIM1_CH4_Handler.TIM_Period=arr;//自动重装载值TIM1_CH4_Handler.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式TIM1_CH4_Handler.TIM_ClockDivision=TIM_CKD_DIV1;//预分频系数为1TIM1_CH4_Handler.TIM_RepetitionCounter=0;//设置重复溢出次数,就是多少次溢出后进入中断,一般为0,只有高级定时器才有用TIM_TimeBaseInit(TIM1,&TIM1_CH4_Handler);//设置 TIM1 的输入比较参数,开启输入捕获TIM1_IC_Handler.TIM_Channel=TIM_Channel_4;//TIM1通道4TIM1_IC_Handler.TIM_ICFilter=0x00;//输入滤波器长度为0TIM1_IC_Handler.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获TIM1_IC_Handler.TIM_ICPrescaler=TIM_ICPSC_DIV1;//预分频系数,不分频TIM1_IC_Handler.TIM_ICSelection=TIM_ICSelection_DirectTI; //映射到 TI1 上TIM_ICInit(TIM1,&TIM1_IC_Handler);

TIM1_CH4_Handler.TIM_RepetitionCounter=0;//设置重复溢出次数,就是多少次溢出后进入中断,一般为0,只有高级定时器才有用到

  1. 使能捕获和更新中断、设置中断分组、使能定时器
    //使能捕获和更新中断(设置 TIM1 的 DIER 寄存器)TIM_ITConfig( TIM1,TIM_IT_Update|TIM_IT_CC4,ENABLE);//允许更新中断和捕获中断//设置中断分组NVIC_Initstructure.NVIC_IRQChannel=TIM1_CC_IRQn;//定时器1NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;//使能TIM1NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2NVIC_Initstructure.NVIC_IRQChannelSubPriority=0;//子优先级0NVIC_Init(&NVIC_Initstructure);TIM_CtrlPWMOutputs(TIM1,ENABLE);   //主输出使能//使能定时器(设置 TIM1 的 CR1 寄存器)TIM_Cmd(TIM1,ENABLE);//使能定时器1

选择NVIC_IRQChannel中的TIM1_CC_IRQn,即TIM1捕获比较中断。

  1. 定时器1中断服务函数
//定时器1中断服务程序
void TIM1_CC_IRQHandler(void)
{if((TIM1CH4_CAPTURE_STA&0X80)==0)//还未成功捕获{if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET){if(TIM1CH4_CAPTURE_STA&0X40)//已经捕获到高电平了{if((TIM1CH4_CAPTURE_STA&0X3F)==0X3F)//高电平太长了{TIM1CH4_CAPTURE_STA|=0X80;//标记成功捕获了一次TIM1CH4_CAPTURE_VAL=0XFFFF;}else TIM1CH4_CAPTURE_STA++;}}if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET)//捕获 1 发生捕获事件{if(TIM1CH4_CAPTURE_STA&0X40) //捕获到一个下降沿{TIM1CH4_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿TIM1CH4_CAPTURE_VAL=TIM_GetCapture4(TIM1);TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Rising);//CC1P=0 设置为上升沿捕获}else //还未开始,第一次捕获上升沿{TIM1CH4_CAPTURE_STA=0; //清空TIM1CH4_CAPTURE_VAL=0;TIM_SetCounter(TIM1,0);TIM1CH4_CAPTURE_STA|=0X40; //标记捕获到了上升沿TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Falling);//CC1P=1 设置为下降沿捕获}}}TIM_ClearITPendingBit(TIM1, TIM_IT_CC4|TIM_IT_Update); //清除中断标志位
}

定时器中断函数服务名字选择:void TIM1_CC_IRQHandler(void);

以上,就是使用TIM1做输入捕获的过程。

STM32F103高级定时器作输入捕获(以TIM1通道4为例)相关推荐

  1. 【WB32库开发】第12章(上)TIM1高级定时器——PWM输入捕获

    本章要学习的PWM输入捕获是定时器又一重要应用,使用PWM输入捕获可以测量输入PWM的频率和占空比. PWM输入只能使用定时器的两个通道:通道1和通道2,且一路PWM输入要占用两个捕获寄存器,一个用于 ...

  2. 高级定时器之输入捕获应用(测量脉宽)

    高级定时器-输入捕获应用 输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面是PWM输入测量. 测量脉宽或者频率 测量频率 ​ 当捕获通道TIx上出现上升沿时,发生第一次捕获,计数器C ...

  3. STM8SF903K3T6定时器1输入捕获

    STM8SF903K3T6定时器1输入捕获 简介 最近接了个转速仪的项目,原理是计频率.最开始是用外部中断,然后根据定时器定时一秒来取值,转速是rpm,所以还要乘以60. 因为需要反映快所以后来改用定 ...

  4. STM32遥控方法SONY PS2 、航模,STM32定时器PWM输入捕获航模接收机

    PS2接线: 买家会给你程序和说明: 接线: GND接STM32 GND VCC接STM32 VCC DAT接 STM32 PB12 CMD接STM32 PB13 CS接 STM32 PB14 CLK ...

  5. 瑞萨e2studio(15)----外部中断定时器配置输入捕获测量频率

    瑞萨e2studio.15--外部中断&定时器配置输入捕获测量频率 概述 视频教学 csdn课程 完整代码下载 样品申请 硬件准备 开发板 新建工程 工程模板 保存工程路径 芯片配置 工程模板 ...

  6. STM32F4系列HAL库配置定时器实验——输入捕获

    STM32F4系列HAL库配置定时器实验--输入捕获 输入捕获简单讲解 输入捕获模式可以用来测量脉冲宽度或者测量频率.我们以测量周期和频率为例,用一个简图来说明输入捕获的原理 假定定时器工作在向上计数 ...

  7. STM32F103高级定时器使用

      STM32F103单片机中定时器分为3种,高级定时器.通用定时器.基本定时器.   高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动.它适合多种用 ...

  8. STM32F103高级定时器死区时间计算

    官方数据手册的说明不容易看懂,举的例子与我的应用场合也不一致,我使用的是72MHz的晶振,讲一讲我的死区时间是怎么算出来的. DT死区时间: TDTS为系统时钟周期时长: TDTG为系统周期时长乘以倍 ...

  9. STM32F103高级定时器死区时间的计算

    看了一些网上讲死区时间计算的教程,觉得讲述的不是很清楚,所以在此用我自己理解的方式讲述一遍,如有错误,请读者赐教. 死区时间的设置:由寄存器"TIM1和TIM8刹车和死区寄存器TIMX_BD ...

最新文章

  1. SSO单点登录基于CAS架构封装 Memcached 实例
  2. JQuery解析JSON数据
  3. 《Java程序设计》实验报告——Java的多线程机制
  4. Mysql异常问题排查与处理——mysql的DNS反向解析和客户端网卡重启
  5. 雅加达EE:干净的板岩
  6. java书面_Java程序猿的书面采访String3
  7. Vue的基础认知一---构建环境/v指令的使用
  8. hashmap containsvalue时间复杂度_恕我直言,你真的了解HashMap吗?
  9. mtk sensor 驱动调试
  10. winhttp 访问https_asp程序使用Microsoft.XMLHTTP对象请求https时出错,使用WinHttp.WinHttpRequest.5.1解决...
  11. 微波射频学习笔记18-------偶极子天线和微波天线设计介绍
  12. 数字万用表常用软件分享:数字万用表自动计量软件数字万用表上位机软件
  13. C语言实现15折线U律,Windows程序的设计(C语言)实训报告
  14. 纯鼓点节奏_[鼓点] 简单的鼓点节奏
  15. 遍历同辈节电的方法_家庭节水节电的24个好方法
  16. 打开软件时出现“请将磁盘插入可移动磁盘“G:””
  17. KS值是衡量分类模型预测准确度的重要指标之一,它反映了模型预测结果与实际数据分布差异的程度。本文将介绍什么是KS值,如何计算以及在Python中如何实现。
  18. 台达PLC中的寄存器如何进行高低位调换?
  19. hidl 原理分析_AIDL原理分析
  20. P2P在IPTV中解决数据服务器传输瓶颈

热门文章

  1. 【Rust日报】2022-03-22 fluent-uri:一个快速、简单和严格的URI解析器
  2. html使用vue组件
  3. CALayer 3 详解 -----转自李明杰
  4. 你是只有一个支点的女人吗?
  5. pandas 小技巧——如何删除行或者列、根据条件删除指定行或者列
  6. 罗技(Logitech)M325鼠标拆解
  7. 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测)
  8. 机器学习西瓜书笔记:软间隔和支持向量回归SVR
  9. {{π型人才培养计划}}BootStrap
  10. 一图看全云栖大会亮点