OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3022|回复: 0

输入捕获实验结果和例程不一样就解答

[复制链接]

14

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2018-7-9
在线时间
56 小时
发表于 2018-9-12 10:46:41 | 显示全部楼层 |阅读模式
3金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "key.h"

extern u8 TIM5CH1_CAPTURE_STA;                                   //输入捕获状态
extern u16 TIM5CH1_CAPTURE_VAL;                                    //输入捕获状值
int main(void)
{
   u32 temp=0;
         delay_init();
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
         uart_init(115200);
         LED_Init();
                 LED0=0;
                  LED1=0;
   TIM3_PWM_Init(899,0);
         TIM5_Cap_Init(0XFFFF,72-1);

         while(1)
         {
         delay_ms(10);

          TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1);
                 if(TIM_GetCapture2(TIM3)==300)TIM_SetCompare2(TIM3,0);
                         

                 if(TIM5CH1_CAPTURE_STA&0x80)
                 {
                 temp=TIM5CH1_CAPTURE_STA&0X3F;
                         
                         temp*=65536;
                         temp+=TIM5CH1_CAPTURE_VAL;
                         printf("HIGH:%d us\r\n",temp);
                         TIM5CH1_CAPTURE_STA=0;
                 
                 }
         
         }



}





















/**
*****************下面注视的代码是通过调用库函数来实现IO控制的方法*****************************************
int main(void)
{

        delay_init();                  //初始化延时函数
        LED_Init();                        //初始化LED端口
        while(1)
        {
                        GPIO_ResetBits(GPIOB,GPIO_Pin_5);  //LED0对应引脚GPIOB.5拉低,亮  等同LED0=0;
                        GPIO_SetBits(GPIOE,GPIO_Pin_5);   //LED1对应引脚GPIOE.5拉高,灭 等同LED1=1;
                        delay_ms(300);                     //延时300ms
                        GPIO_SetBits(GPIOB,GPIO_Pin_5);           //LED0对应引脚GPIOB.5拉高,灭  等同LED0=1;
                        GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
                        delay_ms(300);                     //延时300ms
        }
}
#include "timer.h"
#include "led.h"
#include "usart.h"
void TIM3_Int_Init(u16 arr,u16 psc)                                    //通用定时器3中断初始化

{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStrue;                          //声明TIM3结构体指针
        NVIC_InitTypeDef   NVIC_InitStrue;                                     //中断优先分组结构体指针
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                      //使能定时器3时钟
       
       
TIM_TimeBaseInitStrue.TIM_Period=arr;                                   //设置自动装载寄存器的周期值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc;                                //设置时钟频率的预分频值
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;               //设置计数方式为向上计数
TIM_TimeBaseInitStrue.TIM_ClockDivision=0;                   //设置时钟分割
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);         //    在stm32f10x_tim.h里面   初始化定时器3

TIM_ITConfig(TIM3,TIM_IT_Update |TIM_IT_Trigger,ENABLE);                                //使能更新中断
       

        NVIC_InitStrue.NVIC_IRQChannel=TIM3_IRQn;                             //设置中断通道为TIM3
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;                   //设置抢占优先级为0
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=3;                          //设置响应优先级为3
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;                             //使能中断通道
  NVIC_Init(&NVIC_InitStrue);                                          //初始化中断优先级
       
        TIM_Cmd(TIM3,ENABLE);                                                 //使能定时器3
       
}

void TIM3_IRQHandler(void)                                          //定时器中断服务程序       在启动文件startup_stm32f10x_hd.s里面
{

if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)                     //检测定时器3是否发生更新中断
{

LED1=!LED1;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);                          //清楚定时器3更新中断标志

}


}

void TIM3_PWM_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef  GPIO_InitStrue;                                        //声明GPIOB结构体指针
        TIM_TimeBaseInitTypeDef   TIM_TimeBaseInitStrue;                         //声明定时器结构体指针
        TIM_OCInitTypeDef        TIM_OCInitStrue;                                //声明定时器比较参数结果体指针
       
       
       
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                      //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能GPIOB AFIO时钟
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射
       
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_5;                                      //设置GPIOB5
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;                                //设置输出模式推挽复用
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;                              //输出速度为50hz
  GPIO_Init(GPIOB,&GPIO_InitStrue);                                        //初始化GPIOB5
       
       
       

        TIM_TimeBaseInitStrue.TIM_Period=arr;                                    //设置自动重载周期值
        TIM_TimeBaseInitStrue.TIM_Prescaler=psc;                                 //设置预分频系数
        TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;                //设置计数模式为向上计数
        TIM_TimeBaseInitStrue.TIM_ClockDivision=0;                    //设置设置时钟分割
        //TIM_TimeBaseInitStrue.TIM_RepetitionCounter=;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);                           //初始化定时器ARR/PSC
       

//初始化TIM3 Channel2 PWM模式
//TIM_OCInitStrue.TIM_OCIdleState=;
TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM2;                               //选择定时器模式:TIM脉冲宽度调制模式2
                                                                 //输出极性:TIM输出比较极性高
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;                    //比较输出使能
TIM_OCInitStrue.TIM_Pulse=0;
TIM_OC2Init(TIM3,&TIM_OCInitStrue);                    //根据T指定的参数初始化外设TIM3 OC2       //设置初始化比较参数

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);                           //使能预装载寄存器

TIM_Cmd(TIM3,ENABLE);                                                      //使能定时器3


}




//定时器5捕获输入配置
        TIM_ICInitTypeDef TIM5_ICInitStrue;  

void TIM5_Cap_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef  GPIO_InitStrue;                                     //声明GPIO结构体
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStrue;                        //声明定时器5结构体
                                                                      //声明初始化定时器5输入捕获参数 结构体
                NVIC_InitTypeDef NVIC_InitStrue;                                      //声明中断优先级分组结构体
       
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);                     //使能定时器5
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                    //使能_GPIOA
       
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0;                                   //设置为GPIOA0
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IPD;                                //设置为GPIO输入模式为下拉
        //GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;                            //设置为GPIOA0的传输速度为50 MHz
  GPIO_Init(GPIOA,&GPIO_InitStrue);                                      //初始化GPIOA端口
GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                 //PA0 下拉

  TIM_TimeBaseInitStrue.TIM_Period=arr;                                  //设置定时器5计数器自动装载值
        TIM_TimeBaseInitStrue.TIM_Prescaler=psc;                               //设置预分频值
        TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;                  //设置时钟分割
        TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;              //设置计数器向上计数模式
  TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStrue);                         //初始化定时器5
       
        TIM5_ICInitStrue.TIM_Channel=TIM_Channel_1;                             //设置定时器5的1通道,IC1映射到TI1
        TIM5_ICInitStrue.TIM_ICPolarity=TIM_ICPolarity_Rising;                  //设置上升沿捕获方法
        TIM5_ICInitStrue.TIM_ICSelection=TIM_ICSelection_DirectTI;              //IC1映射到TI1
        TIM5_ICInitStrue.TIM_ICPrescaler=TIM_ICPSC_DIV1;                        //配置输入分频为不分频
        TIM5_ICInitStrue.TIM_ICFilter=0x00;                                     //配置输入滤波器 不滤波
        TIM_ICInit(TIM5,&TIM5_ICInitStrue);                                    //初始化定时器5输入捕获通道
       

        NVIC_InitStrue.NVIC_IRQChannel=TIM5_IRQn;                             //设置中断通道为定时器5中断
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;                   //设置抢占优先级为2
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=0;                          //设置响应优先级为0
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;                             //使能中断通道
        NVIC_Init(&NVIC_InitStrue);                                           //设置中断分组
       
        TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);                   //使能定时器5的允许更新中断和捕获中断
        TIM_Cmd(TIM5,ENABLE);                                                 //使能定时器5
}

u8 TIM5CH1_CAPTURE_STA=0;                                                //输入捕获状态
u16 TIM5CH1_CAPTURE_VAL;                                                //输入捕获值

void TIM5_IRQHandle(void)
{

if((TIM5CH1_CAPTURE_STA&0x80)==0)
{
   if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
         {
         
           if(TIM5CH1_CAPTURE_STA&0x40)
                 {
                   if((TIM5CH1_CAPTURE_STA&0x3F)==0X3F)
                         {
                         TIM5CH1_CAPTURE_STA|=0x80;
                         TIM5CH1_CAPTURE_VAL=0XFFFF;
                         
                         }else TIM5CH1_CAPTURE_STA++;
                 }
         
         
         }
if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)
{

       if(TIM5CH1_CAPTURE_STA&0x40)
         {
             TIM5CH1_CAPTURE_STA|=0x80;
                               TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                           TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);

         }else
                                 {
                                   TIM5CH1_CAPTURE_STA=0;
                                   TIM5CH1_CAPTURE_VAL=0;
                                   TIM_SetCounter(TIM5,0);
                                    TIM5CH1_CAPTURE_STA=0X40;
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
                                 }


       }

    }
     TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update);
}




















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 07:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表