OpenEdv-开源电子网

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

输入捕获比较测试代码(Mini Stm32)

[复制链接]

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2016-6-22 21:02:35 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "timer1.h"
#include "key.h"
#include "usart.h"
/*引用timer1文件中的外部变量,不能赋值*/
extern u8   TIM4CH1_CAPTURE_STA; //输入捕获状态  
extern u16  TIM4CH1_CAPTURE_VAL; //输入捕获值
int main(void)
{               
        u32 temp=0;
        delay_init();                     //延时函数初始化

        NVIC_Configuration();//        KEY_Init();
        uart_init(9600);

        pwm_init(899,0);         //不分频。PWM频率=72000/900=8Khz
        cc_init(0xffff,72-1); //每计一个数的时间是1/1MHz=1us
        printf("ddddddd\n");
           while(1)
        {                                                                         
                delay_ms(10);
                if(TIM4CH1_CAPTURE_STA&0x80)//捕获完成一次,显示一次数据
                {
                        temp=TIM4CH1_CAPTURE_STA&0x3f;
                        temp*=65536;  //溢出次数
                        temp+=TIM4CH1_CAPTURE_VAL;
                        printf("高电平时间:%d us\r\n",temp);
                        TIM4CH1_CAPTURE_STA=0;       
                }          
        }         
}

//该代码不能捕获,请大家帮帮忙!!谢谢哈

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

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
 楼主| 发表于 2016-6-22 21:05:02 | 显示全部楼层
不好意思,粘贴错了。
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
 楼主| 发表于 2016-6-22 21:05:48 | 显示全部楼层
//出现..\HARDWARE\timer1.c(8): error:  #268: declaration may not appear after executable statement in block
//解决方法:是因为变量的声明,不能放在执行语句的后面,只能放在函数的最前面,简单来说,就是必须要放在函数开始处。
#include "timer1.h"
#include "usart.h"
/*PWM初始化*/
void pwm_init(u16 arr,u16 fsc)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruact;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//注意端口状态
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化GPIOA.7为推挽复用输出,作为PWM的输出

        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化GPIOA.8为浮空输入

        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_Prescaler=fsc;
        TIM_TimeBaseInitStruct.TIM_Period=arr;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//定时器3初始化

//按照普通模式,TIMx_CNT>TIMx_CCR1,输出应该是高电平
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;  //   PWM1/PWM2模式
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;  //有效电平

        TIM_OC2Init(TIM3,&TIM_OCInitStruct);               //OCxInit 通道x
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载寄存器
        TIM_Cmd(TIM3, ENABLE);  //使能计数器
}
//用定时器4的计数器来计数高电平的脉冲数。
void cc_init(u16 arr,u16 fsc)
{
           GPIO_InitTypeDef GPIO_InitStruct;//IO口配置
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;        //定时器配置
    TIM_ICInitTypeDef TIM_ICInitStruct;          //捕获比较参数配置
        NVIC_InitTypeDef  NVIC_InitStruct;           //中断分组配置
        /*开启定时器时钟和GPIOA时钟*/
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //使能定时器5时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟
        /*配置PA0为下拉输入*/
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;          
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD; //下拉输入
        GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化GPIOA.0为下拉输入
//        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
        /*配置定时器4计数模式*/
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //fDTS(采样频率)=fCK_INT(定时器频率)
        TIM_TimeBaseInitStruct.TIM_Prescaler=fsc;
        TIM_TimeBaseInitStruct.TIM_Period=arr;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//定时器4初始化,自动重装载值和计数频率。
        /*设置捕获的一些参数*/       
        TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;//设置为通道1
        TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕获上升沿,因为PA0默认是低电平,按键按下后为高。
        TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;//设置映射关系,和CCMR1中的CCxS[1:0]为输入捕获模式,而不是输出。       
        TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置为每个上升沿捕获一次
        TIM_ICInitStruct.TIM_ICFilter=0x00;   //设置滤波器长度为0.       
        TIM_ICInit(TIM4,&TIM_ICInitStruct);
       
        /*设置中断分组*/
        NVIC_InitStruct.NVIC_IRQChannel=TIM4_IRQn;   //为啥Mini定时器不能设置TIM5_IRQn
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStruct);

        /*使能捕获和溢出中断*/       
        TIM_ITConfig(TIM4,TIM_IT_CC1|TIM_IT_Update,ENABLE);         //因为高电平时间可能会很长,故定时器会有溢出。

        /*打开计数器CEN*/
        TIM_Cmd(TIM4,ENABLE);
}
u8   TIM4CH1_CAPTURE_STA=0; //输入捕获状态  
u16  TIM4CH1_CAPTURE_VAL; //输入捕获值
/*本次试验中,设置0xffff为计数值*/
void TIM4_IRQHandler(void)//捕获没开么????
{

        TIM4CH1_CAPTURE_STA=1;       
        if((TIM4CH1_CAPTURE_STA&0x80)==0)      //捕获未完成
        {
                if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)  //说明定时器溢出
                {
                        printf("TIM4CH1_CAPTURE_STA=%d\n",TIM4CH1_CAPTURE_STA);
                        if(TIM4CH1_CAPTURE_STA&0x40)  //已经捕获到高电平
                        {
                                if((TIM4CH1_CAPTURE_STA&0x3f)==0x3f)
                                {
                                        TIM4CH1_CAPTURE_STA |=0x80;//强制退出
                                        TIM4CH1_CAPTURE_VAL=0xffff;
                                }
                                else
                                TIM4CH1_CAPTURE_STA++;  //计数器5溢出一次,加一。已计数:(TIME5CH1_CAPTURE_STA+1) *(0xffff+1)+TIME5CH1_CAPTURE_VAL       
                        }
                }
                if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!=RESET)  //说明捕获到边沿信号
                {
                        printf("jishu=\n");
                        if(TIM4CH1_CAPTURE_STA&0x40)  //本次捕获到下降沿
                        {
                                printf("xiajiangyan=\n");
                                TIM4CH1_CAPTURE_STA |=0x80;//标记成功
                                TIM4CH1_CAPTURE_VAL=TIM_GetCapture1(TIM4);           //获取CCR1当前的计数值
                                TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising);//设置该通道为上升沿捕获,准备下一次捕获                       
                        }
                        else    //本次捕获到上升沿,重新计数
                        {
                                printf("shangshengyan=\n");
                                TIM4CH1_CAPTURE_STA=0;
                                TIM4CH1_CAPTURE_VAL=0;
                                TIM_SetCounter(TIM4,0);//CNT的计数值清零。
                                TIM4CH1_CAPTURE_STA |=0x40;//捕获上升沿
                                TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling);//设置该通道为下降沿捕获,准备捕获上升沿
                        }                       
                }
        }
        TIM_ClearITPendingBit(TIM4,TIM_IT_CC1|TIM_IT_Update);

}

是这个文件
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
 楼主| 发表于 2016-6-22 22:01:29 | 显示全部楼层
我想问一下,为啥定时器5和定时器2都可以用捕获比较,而改成定时器4就不对 了呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-22 22:37:24 | 显示全部楼层
huanghuang 发表于 2016-6-22 22:01
我想问一下,为啥定时器5和定时器2都可以用捕获比较,而改成定时器4就不对 了呢

4也是可以的,检查配置
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
 楼主| 发表于 2016-7-20 00:02:57 | 显示全部楼层
ok.谢了啊。我再看看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 23:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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