[STM32F0]

STM32F031我只想要个捕获而已,咋就这么难

[复制链接]
2622|50
手机看帖
扫描二维码
随时随地手机跟帖
〽️〽️〽️|  楼主 | 2020-11-25 17:43 | 显示全部楼层 |阅读模式
本帖最后由 〽️〽️〽️ 于 2020-12-3 18:03 编辑

背景:
STM32F031F6P6, TSSOP20,采用的是内置晶振8MHz 倍频到48MHz
PA0口捕获脉冲信号对应通道是 TIM2-CH1,
搞了20天了,实在搞不出了,来问问看

问题就是  if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) 一直进不去
-------------------------------------------------------------------------------------------------------
按31楼 指导方式:
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN; 或
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
加了  GPIO_PinAFConfig(GPIOA,GPIO_Pin_0,GPIO_AF_2);
但还是不能进入 if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)

-------------------------------------------------------------------------------------------------------
void TIM2_IRQHandler(void)
{
    if ( TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET )
    {
       //可以正常1ms进入
       TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }

    if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
    {
         //解码的关键地方
         //可从来没有进入过!!!!!!  备注:这里PA0输入信号高低电平是正常的

        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
    }

}

void TIM2_Cap_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    TIM_DeInit(TIM2);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_TimeBaseStructure.TIM_Period =48-1;   
    TIM_TimeBaseStructure.TIM_Prescaler =1000-1;         
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         
    TIM_ICInitStructure.TIM_ICFilter = 0x00;
    TIM_ICInit(TIM2, &TIM_ICInitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);  
    TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);
    TIM_Cmd(TIM2,ENABLE );         
}

int  main(void)
{
      SetSysClock();
      delay_init(48);
      //略...
      TIM2_Cap_Init();
      while(1)
       {
              while ( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)!= RESET);  //测试用 无意义,证明PA0有电平变化,不会一直高电平
              while ( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)!= SET);      //测试用 无意义,证明PA0有电平变化,不会一直低电平
              //其他 无关联函数 测试时 也是注销掉了,防止其他导致的错误 略...
       }
}

使用特权

评论回复
里面有晴雨| | 2020-11-25 17:54 | 显示全部楼层
我看了一下,你的代码有问题。

使用特权

评论回复
9dome猫| | 2020-11-25 18:25 | 显示全部楼层
当局者迷

使用特权

评论回复
玛尼玛尼哄| | 2020-11-25 21:45 | 显示全部楼层
哈哈,会者不难。图形化配置看看。

使用特权

评论回复
airwill| | 2020-11-25 21:46 | 显示全部楼层
简单的要求,  要这么长大段代码实现.  
没办法,  功能强的芯片, 初始化代码也多

使用特权

评论回复
9dome猫| | 2020-11-25 23:27 | 显示全部楼层

使用特权

评论回复
lidi911| | 2020-11-26 07:39 | 显示全部楼层
代码有问题

使用特权

评论回复
〽️〽️〽️|  楼主 | 2020-11-26 10:06 | 显示全部楼层
本帖最后由 〽️〽️〽️ 于 2020-12-3 18:00 编辑
里面有晴雨 发表于 2020-11-25 17:54
我看了一下,你的代码有问题。

大哥,啥问题,教教小弟

使用特权

评论回复
〽️〽️〽️|  楼主 | 2020-11-26 10:07 | 显示全部楼层
本帖最后由 〽️〽️〽️ 于 2020-12-3 18:00 编辑

大哥,啥问题,教教小弟

使用特权

评论回复
香水城| | 2020-11-26 10:57 | 显示全部楼层
关键是把原理搞清楚,再结合下库代码里的例程消化下 就可以 搞定了。

使用特权

评论回复
海滨消消| | 2020-11-26 14:20 | 显示全部楼层
估计是你原理没搞清楚吧

使用特权

评论回复
wangjiahao88| | 2020-11-26 15:19 | 显示全部楼层
学习学习!

定时器 捕获吧!

使用特权

评论回复
〽️〽️〽️|  楼主 | 2020-11-26 15:37 | 显示全部楼层
又是一天过去了,还是不行,明天继续了

使用特权

评论回复
谭翬| | 2020-11-26 16:36 | 显示全部楼层
本帖最后由 谭翬 于 2020-11-26 16:39 编辑

unsigned char H_state;
void TIM2_IRQHandler(void)//定义中断产生时间100us
{
if ( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)== 0) {
     if(h_state==1){
        //下降沿
       _nop_();
        }
     H_state=0;
     }
else{
    if(H_state==0){
            //上升沿
             _nop_();
            }
     H_state=1;
   }
}、

使用特权

评论回复
谭翬| | 2020-11-26 17:00 | 显示全部楼层
本帖最后由 谭翬 于 2020-11-26 17:04 编辑

//脉冲宽度最小为200us,如果还小可以改变定时中断时间unsigned char H_state,up,down;
void TIM2_IRQHandler(void)//定义中断产生时间100us
{
if ( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)== 0) {
     if(h_state==1){
        //下降沿
       down=1;
        }
     H_state=0;
     }
else{
    if(H_state==0){
            //上升沿
             up=1;
            }
     H_state=1;
   }
}
/////////////////////
int  main(void)
{
      SetSysClock();
      delay_init(48);
      //略...
      TIM2_Cap_Init();
      while(1)
       {
             if(up==1){up=0;}          //测试用,证明PA0是上升沿
             if(down==1){down=0;}  //测试用,证明PA0是下降沿
              //略...
       }
}

使用特权

评论回复
〽️〽️〽️|  楼主 | 2020-11-27 09:35 | 显示全部楼层
谭翬 发表于 2020-11-26 17:00
//脉冲宽度最小为200us,如果还小可以改变定时中断时间unsigned char H_state,up,down;
void TIM2_IRQHandle ...

谢谢,您的方案我看明白了
但是因为实际应用是解码Manchester码,还是捕获的方式好

不用捕获,用扫描方式已经好了,现在是改成捕获

使用特权

评论回复
谭翬| | 2020-11-27 10:47 | 显示全部楼层
定时器解码:
1、找到时序的开始电平后,开始高低电平的时间检测;
2、高电平时间、低电平时间,判断是否为0、1;不满足条件,回到第1步;
3、检测下一位,位数+1;收到指定位数后,发消息给主程序;
4、主程序 获得消息,对字节读取并判断和控制。

使用特权

评论回复
kingsleych| | 2020-11-28 10:48 | 显示全部楼层
没用过f103的,倒是f030  042 072都弄过,cubemx点了点就好了

使用特权

评论回复
〽️〽️〽️|  楼主 | 2020-11-28 14:55 | 显示全部楼层
还是没进入
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
}

继续干!

使用特权

评论回复
〽️〽️〽️|  楼主 | 2020-11-28 14:56 | 显示全部楼层
kingsleych 发表于 2020-11-28 10:48
没用过f103的,倒是f030  042 072都弄过,cubemx点了点就好了

不是103, 是031和f030基本一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

375

帖子

2

粉丝