stm32学习笔记(十)输入捕获实验

发布者:blazings最新更新时间:2018-12-29 来源: eefocus关键字:stm32  输入捕获实验 手机看文章 扫描二维码
随时随地手机看文章

#include "timer.h"

#include "led.h"

#include "usart.h"

#include "sys.h"

//////////////////////////////////////////////////////////////////////////////////  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK Mini STM32开发板

//PWM  驱动代码    

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2010/12/03

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 正点原子 2009-2019

//All rights reserved

//////////////////////////////////////////////////////////////////////////////////   

 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM1_PWM_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //时基结构体

TIM_OCInitTypeDef  TIM_OCInitStructure;         //输出比较结构体

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// TIM1时钟使能,挂载在APB2高速总线上

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能

                                                                     

 

   //设置该引脚为复用输出功能,输出TIM1 CH2的PWM脉冲波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO输出频率50MHZ

GPIO_Init(GPIOA, &GPIO_InitStructure);

 


TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

 

  TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能

 

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能  


TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器


TIM_Cmd(TIM1, ENABLE);  //使能TIM1

 

   

}

 

//定时器2通道1输入捕获配置

 

TIM_ICInitTypeDef  TIM2_ICInitStructure;

 

void TIM2_Cap_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟在APB1低速总线上

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  下拉输入

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉


//初始化定时器2 TIM2  

TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 

TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器   

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  

//初始化TIM2输入捕获参数

TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上

  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;//IC1F=0000 配置输入滤波器 不滤波

  TIM_ICInit(TIM2, &TIM2_ICInitStructure);


//中断分组初始化

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 


TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断


  TIM_Cmd(TIM2,ENABLE ); //使能定时器2

 

}

 

 

u8  TIM2CH1_CAPTURE_STA=0; //输入捕获状态    

u16 TIM2CH1_CAPTURE_VAL; //输入捕获值

 

//定时器5中断服务程序  

void TIM2_IRQHandler(void)

 

  if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获

{   

if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

 

{     

if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了

{

if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了

{

TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次

TIM2CH1_CAPTURE_VAL=0XFFFF;

}else TIM2CH1_CAPTURE_STA++;

}  

}

if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件

{

if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿

{  

TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿

TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);

    TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获

}else  //还未开始,第一次捕获上升沿

{

TIM2CH1_CAPTURE_STA=0; //清空

TIM2CH1_CAPTURE_VAL=0;

TIM_SetCounter(TIM2,0);

TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿

    TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获

}     

}              

  }

 

    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

 

}



#include "led.h"

#include "delay.h"

#include "sys.h"

#include "timer.h"

#include "usart.h"

//ALIENTEK Mini STM32开发板范例代码9

//输入捕获实验   

//技术支持:www.openedv.com

//广州市星翼电子科技有限公司

 

 

extern u8  TIM2CH1_CAPTURE_STA; //输入捕获状态    

extern u16 TIM2CH1_CAPTURE_VAL; //输入捕获值

 int main(void)

 {

 

u32 temp=0; 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2

delay_init();     //延时函数初始化

uart_init(9600); //9600  

LED_Init();   //初始化与LED连接的硬件接口

  TIM1_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80Khz

  TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 

    while(1)

{

  delay_ms(10);

TIM_SetCompare1(TIM1,TIM_GetCapture1(TIM1)+1);

if(TIM_GetCapture1(TIM1)==300)TIM_SetCompare1(TIM1,0);  

if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平

{

temp=TIM2CH1_CAPTURE_STA&0X3F;

temp*=65536; //溢出时间总和

temp+=TIM2CH1_CAPTURE_VAL; //得到总的高电平时间

printf("HIGH:%d us\r\n",temp); //打印总的高点平时间

  TIM2CH1_CAPTURE_STA=0; //开启下一次捕获

  }

}

}


关键字:stm32  输入捕获实验 引用地址:stm32学习笔记(十)输入捕获实验

上一篇:stm32学习笔记(十一)LCD显示
下一篇:stm32学习笔记(九)PWM输出

推荐阅读最新更新时间:2024-03-16 16:21

STM32 flash被锁定不能烧写解决方法
在误操作后会锁死芯片导致不能烧录,如下图: 解决办法是用STM32 ST-LINK Utility 工具去解锁芯片: 先连接设备然后在target选项下做如下操作解锁,选择unselecet all 然后应用即可:
[单片机]
<font color='red'>STM32</font> flash被锁定不能烧写解决方法
STM32的开漏电路与推挽输出
开漏结构 所谓开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。如图1所示: 图1 组成开漏形式的电路有以下几个特点: 1. 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。如图1。 2. 可以将多个开漏输出的Pin,连接到一条线上。形成“与逻辑”关系。如图1,当PIN_A、PIN_B、PIN_C任
[单片机]
<font color='red'>STM32</font>的开漏电路与推挽输出
STM32——时钟系统
一、时钟树 普通的MCU,一般只要配置好GPIO 的寄存器,就可以使用了。STM32为了实现低功耗,设计了非常复杂的时钟系统,必须开启外设时钟才能使用外设资源。 左边开始,从时钟源一步步分配 到外设时钟。 从时钟频率来说,又分为高速时钟和低速时钟,高速时钟是提供给芯片主体的主时钟,而低速时钟只是提供给芯片中的 RTC(实时时钟)及独立看门狗使用。 从芯片角度来说,时钟源分为内部时钟与外部时钟源,内部时钟是在芯片内部 RC 振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用 内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而
[单片机]
STM32 TFT学习笔记——SD卡读写
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:ST NUCLEO-F303RE TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色 驱动IC:ILI9325 ST库版本:STM32Cube_FW_F3_V1.1.0 SD卡:Kingston 16GB Micro SDHC Class 10 本TFT模块是带有SD卡插槽的,之前连线一直没接,现在可以使用了,对于该TFT模块来说一副图片需要的空间为150K(240*320*2),如果图片都存入FALSH空间肯定是存放不了多少图片资源的,因此我们可以把图片资源存入SD卡中等到需要时再从SD卡读取来显示,这样只要SD卡空间够大我们就可以显
[单片机]
关于stm32自由控制io口的笔记
刚入手stm32,想从最简单的控制io口做起,仿照历程,书写了一个控制PA15口持续输出低电平的程序,可是无论怎么样就是不能将IO口拉低,始终输出3.3V,那个纠结啊!后来仔细问了同学才明白原因: PA15为复用端口, 作者为了在学员使用JLINK调试时产生不必要的麻烦,在包含某些system文件时已经将该口的复用功能默认打开了。 所以在软件编写的时候要先禁用JTAG功能才能把这个IO口当成普通IO口使用。也就是在程序开始的时候加上这一句话:JTAG_Set(JTAG_SWD_DISABLE); 因为stm32功能强悍,但引脚有限,所以大部分的引脚都有复用功能,所以使用IO口是要特别注意这点:例如某些IO与LCD功
[单片机]
关于<font color='red'>stm32</font>自由控制io口的笔记
STM32内部Flash读写操作接口
源文件 /* ********************************************************************************************************* * 函 数 名: GetSector * 功能说明: 根据地址计算扇区首地址 * 形 参: 无 * 返 回 值: 扇区首地址 ********************************************************************************************************* */ uint32_t GetSector(uint32
[单片机]
STM32学习笔记之十七——雄关漫道真如铁,如今迈步从头越
一、前言 放下半年,继续STM32的学习。新的学习新起点,决心升级。单片机不换, 调试环境整体升级。包括以下几个方面: 1、调试器换JlinkV7,相比STlink在IAR环境下不用装驱动。虽说V8已经 面世但是针对我的应用V7已经足够。况且手里这个还是带串口的,用起来很方 便。 2、接口换用SWD,四线调试,节省接插件面积为以后电路板的小型化做好准 备。 3、开发板换豆皮,功能比较全面,有MP3和液晶屏幕的扩展板,价格便宜。 4、调试环境换IAR5.3,大势所趋,没办法新的3.0库已经不再支持IAR4 了。 5、固件库换3.0,经过半年发展应该比较完善了,全新的架构。 有了这些更新,等于
[单片机]
STM32学习笔记(一)GPIO
GPIO的使用: 一共四组IO口16*3+3:ABCD 库函数 necessity: 1.RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE)使能时钟 2.系统初始化(GPIO_Init) IN: GPIO_InitStruct:模式,引脚,GPIO的最大输出速率, GPIOA(用于参照指示寄存器地址的指针) OUT: CRH/CRL GPIO_InitTypeDef *GPIO_InitStruct; GPIO_InitStruct- GPIO_Mode= GPIO_Mode_Out_PP; GPIO_InitStruct- GPIO_Pin=GPIO_Pin_15
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved