OpenEdv-开源电子网

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

输入捕获高电平,读出的高电平正好是实际高电平的2倍

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-2-14
在线时间
23 小时
发表于 2016-7-29 20:44:14 | 显示全部楼层 |阅读模式
我输入频率为20Hz矩形波,高电平时间应为25ms,而通过定时器读出的高电平时间是50ms,正好是高电平的两倍。我用的是STM32F103CBT6,将TIM2_CH4映射到PB11捕获。捕获程序时参考原子哥的教程。不知是哪处问题了,小弟求教一下!配置也检查了没啥问题。

程序部分:配置定时器TIM2_CH4:
void Tim2_GPIO_Config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_ICInitTypeDef       TIM2_ICInitStructure;
        NVIC_InitTypeDef        NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
       
        GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//
       
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_11);
       
       
        TIM_TimeBaseStructure.TIM_Prescaler=71;//
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//
        TIM_TimeBaseStructure.TIM_Period=0xFFFF;//
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//TDTS=Tck_tim
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
       
       
        TIM2_ICInitStructure.TIM_Channel=TIM_Channel_4;//TIM2_CH4
        TIM2_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//
        TIM2_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//
        TIM2_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//
        TIM2_ICInitStructure.TIM_ICFilter=0x00;//IF
        TIM_ICInit(TIM2,&TIM2_ICInitStructure);
       
       
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC4,ENABLE);
        TIM_Cmd(TIM2,ENABLE);
}


中断函数:
void TIM2_IRQHandler(void)
{
        if((TIM2CH4_CAPTURE_STA&0x80)==0)//
        {
                if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//
                {
                        if(TIM2CH4_CAPTURE_STA&0x40)//
                        {
                                if((TIM2CH4_CAPTURE_STA&0x3F)==0x3F)//
                                {
                                        TIM2CH4_CAPTURE_STA|=0x80;//
                                        TIM2CH4_CAPTURE_VAL=0xFFFF;
                                }else TIM2CH4_CAPTURE_STA++;
                        }
                }
               
                if(TIM_GetITStatus(TIM2,TIM_IT_CC4)!=RESET)//
                {
                        if(TIM2CH4_CAPTURE_STA&0x40)//
                        {
                                TIM2CH4_CAPTURE_STA|=0x80;//
                                TIM2CH4_CAPTURE_VAL=TIM_GetCapture4(TIM2);//
                                TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising);//
                        }else //
                        {
                                TIM2CH4_CAPTURE_STA=0;
                                TIM2CH4_CAPTURE_VAL=0;
                                TIM_SetCounter(TIM2,0);
                                TIM2CH4_CAPTURE_STA|=0x40;//
                                TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Falling);//                       
                        }
                }
        }
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update | TIM_IT_CC4);//
}

主函数:#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart1.h"
#include "AD5628.h"
#include "sin_exti.h"
#include "timer.h"

uint16_t m_Light_Frist[8]={300,300,300,300,300,300,300,300};
extern uint8_t  TIM2CH4_CAPTURE_STA;
extern uint16_t TIM2CH4_CAPTURE_VAL;


int main(void)
{
        uint32_t temp=0;
//        uint16_t m_value=4000;
        SystemInit();
        Delay_Init();
       
        USART1_Config();
        NVIC_Configuration();
       
        LED_GPIO_Config();
        USART1_Config();
        Tim2_GPIO_Config();
       
        while(1)
        {
               
                if(TIM2CH4_CAPTURE_STA&0x80)//
                {
                        temp=TIM2CH4_CAPTURE_STA&0x3F;
                        temp*=65536;//
                        temp+=TIM2CH4_CAPTURE_VAL;//
                        printf("HIGH:%d us\r\n",temp);
                  TIM2CH4_CAPTURE_STA=0;//
                }
        }
}

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

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-2-14
在线时间
23 小时
 楼主| 发表于 2016-7-29 20:46:35 | 显示全部楼层
这是我实际方波与定时器输入捕获读取的高电平时间
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-2-14
在线时间
23 小时
 楼主| 发表于 2016-8-2 15:13:31 | 显示全部楼层
找到原因了,疏忽了
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-2 15:58:08 | 显示全部楼层

时钟问题。

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 21:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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