这几天在调试STM32407的定时器扩展功能,顺便研究了下利用定时器完成PWM波比较输出以及输入捕获事件,
捕获输入波形的高电平时间,具体代码如下,供参考学习,如有问题,请留言随时沟通!main函数部分代码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"extern u8   TIM2CH3_CAPTURE_STA;        //输入捕获状态,0-1:代表上升沿检测事件发生;1-2:代表下降沿事件发生,下降沿事件发生后,强制清零;
extern u32  TIM2CH3_CAPTURE_VAL1;           //输入捕获值(TIM2是32位)
extern u32  TIM2CH3_CAPTURE_OVERCNT;        //定时器溢出次数计数(TIM2/TIM2是32位),溢出强制输入捕获结束,并赋值高电平为0XFFFFFFFFint main(void)
{ long long temp=0;  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置系统中断优先级分组2delay_init(168);                                //初始化延时函数uart_init(115200);                                //初始化串口波特率为115200TIM5_CH4_PWM_Init(500-1,84-1);                 //84M/84=1Mhz的计数频率计数到500,PWM频率为1M/500=2Khz     TIM2_CH3_Cap_Init(0XFFFFFFFF,84-1);                 //以1Mhz的频率计数 TIM_SetCompare4(TIM5,150-1);  while(1){   if(TIM2CH3_CAPTURE_STA & 0X02)             //成功捕获到了一次高电平{temp  = TIM2CH3_CAPTURE_VAL1; temp += TIM2CH3_CAPTURE_OVERCNT*0XFFFFFFFF;printf("HIGH LEVEL:%lld usrn",temp); //打印总的高点平时间TIM2CH3_CAPTURE_STA  = 0;               //初始化捕获事件参数,开启下一次捕获TIM2CH3_CAPTURE_VAL1 = 0;            temp = 0;TIM2CH3_CAPTURE_OVERCNT = 0;}}
}定时器输出PWM和输入捕获事件及定时器中断部分代码如下:
#include "timer.h"
#include "led.h"
#include "usart.h"
void TIM5_CH4_PWM_Init(u32 arr,u32 psc)
{                            //此部分需手动修改IO口设置GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);   //TIM2时钟使能    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);     //使能PORTA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOB3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;   //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA3GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_TIM5); //GPIOA3复用位定时器5TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化TIM5 Channel4 PWM模式   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCInitStructure.TIM_Pulse=0;TIM_OC4Init(TIM5, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM5 OC4TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);  //使能TIM5在CCR4上的预装载寄存器TIM_ARRPreloadConfig(TIM5,ENABLE);TIM_Cmd(TIM5, ENABLE);  //使能TIM5        }  TIM_ICInitTypeDef  TIM2_ICInitStructure;//定时器2通道3输入捕获配置
//arr:自动重装值(TIM2是32位的!!)
//psc:时钟预分频数
void TIM2_CH3_Cap_Init(u32 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     //TIM2时钟使能    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);     //使能PORTB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //GPIOB10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB0GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_TIM2); //PB10复用位定时器2TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化TIM2输入捕获参数TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3;   //TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕获TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;    //配置输入分频,不分频 TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC3F=0000 配置输入滤波器 不滤波TIM_ICInit(TIM2, &TIM2_ICInitStructure);TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC3,ENABLE);//允许更新中断 ,允许CC3IE捕获中断    TIM_Cmd(TIM2,ENABLE );  //使能定时器2NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;      //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、}
//捕获事件状态定义
u8  TIM2CH3_CAPTURE_STA=0;         //输入捕获状态,0-1:代表上升沿检测事件发生;1-2:代表下降沿事件发生,下降沿事件发生后,强制清零;
u32 TIM2CH3_CAPTURE_VAL1 = 0;      //输入捕获值(TIM2是32位)
u32 TIM2CH3_CAPTURE_OVERCNT = 0;   //定时器溢出次数计数(TIM2/TIM2是32位),溢出强制输入捕获结束,并赋值高电平为0XFFFFFFFF//定时器2中断服务程序
void TIM2_IRQHandler(void)
{           if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)//定时器2捕获3通道发生捕获事件{   TIM_Cmd(TIM2,DISABLE );          //首先停止定时器计数,避免造成输入捕获值检测误差if( TIM2CH3_CAPTURE_STA == 0)      //0-1:代表上升沿检测事件发生{// TIM_Cmd(TIM2,DISABLE );TIM_SetCounter(TIM2,0);TIM2CH3_CAPTURE_STA = 1;TIM2CH3_CAPTURE_VAL1 = 0;TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling);TIM_Cmd(TIM2,ENABLE );}else if( TIM2CH3_CAPTURE_STA == 1)   //1-2:代表下降沿事件发生,捕获事件结束{//  TIM_Cmd(TIM2,DISABLE );TIM2CH3_CAPTURE_VAL1 = TIM_GetCapture3(TIM2);TIM2CH3_CAPTURE_STA = 2;TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising);TIM_Cmd(TIM2,ENABLE );}}//考虑到输入捕获脉冲较宽,定时器会产生溢出,定义TIM2CH3_CAPTURE_OVERCNT对定时器溢出事件进行统计if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//定时器2发生计数更新事件     {if(TIM2CH3_CAPTURE_OVERCNT >= 0xFFFFFFFF)   //当溢出次数超过OXFFFFFFFF时,强制输入捕获事件结束{TIM2CH3_CAPTURE_OVERCNT &= 0;TIM2CH3_CAPTURE_STA = 2;TIM2CH3_CAPTURE_VAL1 = 0XFFFFFFFF;}else TIM2CH3_CAPTURE_OVERCNT = TIM2CH3_CAPTURE_OVERCNT +1;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除定时器更新中断标志位}TIM_ClearITPendingBit(TIM2, TIM_IT_CC3); //清除捕获中断标志位
}

cc2530定时器和捕获比较_STM32定时器PWM和输入捕获事件相关推荐

  1. 8、【STM32】定时器(TIM)——中断、PWM、输入捕获实验(一文精通定时器)

    目录 前言 理论学习 一.定时器中断 1.1.时基单元包括: 1.2.通用定时器功能 1.3.计数器模式 1.3 相关寄存器 二.定时器PWM输出 2.1.PWM输入模式 2.2.定时器PWM输出 2 ...

  2. K60的FTM的PWM、输入捕获、正交解码

    FTM是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码.英文全称是FlexTimer Module,你可以理解为高级定时器模块.易用定时器模块等等.不仅仅在Kinetis 32位处 ...

  3. K60的FTM的PWM、输入捕获、正交解码(未理解完)

    FTM模块默认对应引脚有3个FTM模块 FTM是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码.英文全称是FlexTimer Module,你可以理解为高级定时器模块.易用定时器模 ...

  4. stm32捕获比较通道是干嘛的_STM32第八章-TIM输入捕获

    在第七章我们介绍了 STM32 的定时器作为 PWM 输出的使用方法,这一章,我们将向大家介绍通用定时器作为输入捕获的使用.这个输入捕获在哪个地方会用到呢?如果你玩过小车就会知道小车的编码器测速就用到 ...

  5. cc2530定时器和捕获比较_STM32学习日志——输入捕获实验(20.06.26)

    今天学习的是通用定时器的第三个功能--输入捕获,它的作用是检测到TIMx_CHx的边沿跳变(上升沿或下降沿),即可将当前定时器的存放在捕获/比较寄存器中. 输入捕获滤波器可以通过TIMx_CCMR1的 ...

  6. cc2530定时器和捕获比较_ALIENTEK 阿波罗 STM32F767 开发板资料连载十四章 输入捕获实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...

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

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

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

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

  9. stm32捕获占空比_「话说定时器系列」之六:STM32定时器输入捕获话题

    STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...

最新文章

  1. java和C#面向对象的区别
  2. Uva 3767 Dynamic len(set(a[L:R])) 树套树
  3. Jupyter官方神器:可视化 Debug 工具!
  4. apache-tomcat-6.0.39的配置
  5. 【终极完美高效】C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针_函数指针数组
  6. C# 可空类型和空接合运算符(??)
  7. 2019西电网安实验班选拔考试
  8. 算法学习 -- 枚举
  9. c语言怎么判别输入字母大小,使用C语言判断英文字符大小写的方法
  10. 15 个超赞超牛逼的 Linux 工具,提高效率的同时增加乐趣!
  11. Unity音频可视化插件
  12. 暗黑3 外挂开发资料
  13. 5-0 51单片机流水灯
  14. 澳大利亚麦考瑞大学计算机系杨坚教授团队招收2022-2023年博士研究生
  15. react 输入框 回车事件切换
  16. VMware 虚拟机鼠标闪烁
  17. java中unicode编码和utf8编码相互转换
  18. 如何从菜鸟(零基础)开始快速学习3ds MAX,3ds MAX建模和渲染的工作流程介绍
  19. 高中计算机八字标语,高中励志八字标语40句
  20. 这就是搜索引擎_这就是搜索引擎如何增强种族主义

热门文章

  1. mysql数据库中如何创建角色_MySQL数据库如何创建用户呢?
  2. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解
  3. 免费python自学攻略-420小时学习代码之后:如何教你免费自学Python
  4. python入门经典100例-【python】编程语言入门经典100例--25
  5. python免费领取视频-180集全套python基础视频教程+电子教材,限时免费领取
  6. 一种基于地图导航的语音识别管理系统的制作方法
  7. elementUI 学习入门之 Button 按钮
  8. win10如何下载python3_Win10环境中如何实现python2和python3并存
  9. cas5.3:CAS Server搭建
  10. httpclient java 异步_Java的异步HttpClient