你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

输入捕获

[复制链接]
zhuixingfu 提问时间:2018-10-16 20:51 /
为什么用定时器3通道一做输入捕获时,程序完全重映射到PC6可以用,部分重映射到PB4就不行了呢?是根据原子哥的程序改的,新手,求大佬帮忙啊TIM_ICInitTypeDef  TIM3_ICInitStructure;

void TIM3_Cap_Init(u16 arr,u16 psc)
{         
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
           NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能TIM3时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;  //PB4 清除之前设置  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB4 输入  
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
                                                
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_4);        //PB4 下拉
        //初始化定时器3 TIM3         
        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(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        //初始化TIM3输入捕获参数
        TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
          TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
          TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
          TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
          TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
          TIM_ICInit(TIM3, &TIM3_ICInitStructure);
        
        //中断分组初始化
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
        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(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断        
        
           TIM_Cmd(TIM3,ENABLE );         //使能定时器3



}

u8  TIM3CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM3CH1_CAPTURE_VAL;        //输入捕获值

//定时器3中断服务程序         
void TIM3_IRQHandler(void)
{

         if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获        
        {         
                if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                 
                {            
                        if(TIM3CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM3CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM3CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM3CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM3CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {        
                        if(TIM3CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
                        {                                 
                                TIM3CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
                                TIM3CH1_CAPTURE_VAL=TIM_GetCapture1(TIM3);
                                   TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM3CH1_CAPTURE_STA=0;                        //清空
                                TIM3CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM3,0);
                                TIM3CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                   TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                    
         }

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

}

收藏 1 评论4 发布时间:2018-10-16 20:51

举报

4个回答
STM1024 回答时间:2018-10-17 10:04:50
你程序怎么下载的呢?通过JTag还是串口呀?
zhuixingfu 回答时间:2018-10-17 15:05:06
用串口下载的
whitechocolate 回答时间:2018-10-17 15:27:40
顶一下,我也是新手,所以我的回答你可以不要太当真,个人觉得应该是PB4配置和部分映射那出了问题,因为你全映射是ok的,我看到有的人输入捕获有配置PIN脚输入上拉,也有下拉,也不明天啥原因,所以你要不试试配置成上拉看看,还有一个就是应该不太可能的,但我说说,不清楚你用的哪个单片机,我用的TIM3部分映射是到PB5的,你要不确认下手册,高深问题回答不出来,就只能说说这些细节有可能出错的

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

zhuixingfu 回答时间:2018-10-17 16:27:21
whitechocolate 发表于 2018-10-17 15:27
顶一下,我也是新手,所以我的回答你可以不要太当真,个人觉得应该是PB4配置和部分映射那出了问题 ...

我用的精英板,部分映射就是PB4。有个大佬说这个程序没问题,好像是PWM模式和计数模式的问题。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版