毕业设计需要使用比较多的定时器,但手上的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. 创建git项目的feature分支以及下载特定分支的仓库代码
  2. 【Python】 文件目录比较工具filecmp和difflib
  3. 用Java模拟multipart形式的Http Post请求
  4. 前后端分离模式下的权限设计方案
  5. java对文件的操作详解_Java 对 Properties 文件的操作详解及简单实例
  6. 的run窗口不显示_「玩转deepin」如何安装VirtualBox增强功能使得deepin全屏显示?...
  7. Dede更新提示DedeTag Engine Create File False的解决办法
  8. 在Linux上如何查看Python3自带的帮助文档?
  9. python输出unicode字符_如何在Python中打印Unicode字符?
  10. angular4与高德地图的结合
  11. 谷歌浏览器获取主题图片
  12. 计算机接口74LS138,用74ls138设计全加器
  13. resin服务器中间件
  14. odoo13 订单模板设置_Odoo 13开发者文档:视图
  15. 第八届山东省ACM大学生程序设计竞赛总结
  16. linux 压缩文件软件,Linux下最好用的解压缩软件unar
  17. 自检zabbix健康脚本
  18. 小人物吃金币_android小游戏(1)
  19. ps—Photoshop中八种颜色模式
  20. zabbix 官网提供的监控 postgresql 的模板

热门文章

  1. 乡村少年宫计算机小组活动教案,乡村少年宫电脑绘兴趣小组教案.doc
  2. 函数式和面向对象编程有什么区别?
  3. 最短路径(Dijkstra算法),一文必看懂最短路径的方法
  4. [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现
  5. 吞噬颜色html5游戏在线玩,《堡垒之夜》被黑洞吞噬,或将迎来大型更新
  6. Python——基础学习xpath(爬虫)
  7. Linux命令行字体变大变小,如何更改Linux控制台字体类型和大小,
  8. java ee小程序_JAVA EE社团管理升级版-微信小程序端说明文档
  9. 艺术~安全至上(SQL注入、CSRF攻击、DDoS攻击)
  10. 王小卤斩获iSEE全球食品创新奖百强,虎皮凤爪创新引领获认可