搜索
bottom↓
回复: 10

想求一个Stm32输入捕获的程序。。。大神赐教。

[复制链接]

出0入0汤圆

发表于 2014-8-18 09:50:53 | 显示全部楼层 |阅读模式
想求一个Stm32输入捕获的程序。。。大神赐教。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-8-18 10:05:02 | 显示全部楼层
ST提供的库包里面有。。

出0入10汤圆

发表于 2014-8-18 10:10:40 | 显示全部楼层
我有,我的这个项目里面超声波捕获后就是用输入捕获,你自己找关键部分
http://www.amobbs.com/thread-5580337-1-1.html

出0入0汤圆

 楼主| 发表于 2014-8-18 11:18:15 | 显示全部楼层
噢,谢谢了哈。。

出0入0汤圆

发表于 2014-8-19 11:19:05 | 显示全部楼层
你要捕获遥控器的PWM信号还是其他的什么?

出0入0汤圆

 楼主| 发表于 2014-8-19 11:21:09 | 显示全部楼层
radio 发表于 2014-8-19 11:19
你要捕获遥控器的PWM信号还是其他的什么?

捕获遥控器的PWM信号。。

出0入0汤圆

发表于 2014-8-19 11:23:26 | 显示全部楼层
你可以用定时器中断啊,你查查很简单的,找不到的话我给你

出0入0汤圆

 楼主| 发表于 2014-8-19 11:25:03 | 显示全部楼层
radio 发表于 2014-8-19 11:23
你可以用定时器中断啊,你查查很简单的,找不到的话我给你

好,我先找找哈,找不到了找你要啊 。。你的qq多少,我加你

出0入0汤圆

 楼主| 发表于 2014-8-19 11:25:31 | 显示全部楼层

出0入0汤圆

发表于 2014-8-19 11:29:07 | 显示全部楼层
xuxiang10 发表于 2014-8-19 11:25
好,我先找找哈,找不到了找你要啊 。。你的qq多少,我加你

我直接给你贴一个

//¸÷¸öͨµÀµÄÉÏÉýÑغÍϽµÑØµÄ ´¥·¢Ê±¼ä
volatile struct PWM_Input_struct1{
  uint32_t RisingTime; // ÉÏÉýÑØ Ê±¼ä us
  uint32_t FallingTime; //ϽµÑØ Ê±¼ä us
}CH1,CH2,CH3,CH4,CH5,CH6;

//µ±Ç° PWMÊäÈëµÄÖµ  µ¥Î» us
volatile int16_t PWM_Input_CH1,PWM_Input_CH2,PWM_Input_CH3,
                                                                 PWM_Input_CH4,PWM_Input_CH5,PWM_Input_CH6;
volatile int16_t RC_data[MAX_RC_Ch];

extern int16_t PWM_Offset_Roll,PWM_Offset_Pitch,PWM_Offset_Yaw;

//ÅäÖà PWMÊäÈëͨµÀ µÄÖжÏÓÅÏȼ¶
static void PWM_Input_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/**************************ʵÏÖº¯Êý********************************************
¿ªÆôÖжϡ£²¢ÅäÖø÷ͨµÀµÄÊäÈëÒý½ÅΪÖжÏÊäÈë
*******************************************************************************/
static void PWM_Input_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;

        /* config the extiline(PB0) clock and AFIO clock */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC ,ENABLE);
        /* Enable SYSCFG clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
        /* config the NVIC(PC0-5) */
        PWM_Input_NVIC_Config();

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;      
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;         // ÉÏÀ­ÊäÈë
          GPIO_Init(GPIOC, &GPIO_InitStructure);

        /* EXTI line(PC0) mode config */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, GPIO_PinSource0);
          EXTI_InitStructure.EXTI_Line = EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        //ÖжÏģʽ
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //¿ªÆôÉÏÉýºÍϽµÑØÖжÏ
          EXTI_InitStructure.EXTI_LineCmd = ENABLE; //ʹÄÜÖжÏ
          EXTI_Init(&EXTI_InitStructure);
       
        /* EXTI line(PC1) mode config */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, GPIO_PinSource1);
          EXTI_InitStructure.EXTI_Line = EXTI_Line1;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);

        /* EXTI line(PC2) mode config */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, GPIO_PinSource2);
          EXTI_InitStructure.EXTI_Line = EXTI_Line2;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);
       
        /* EXTI line(PC3) mode config */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, GPIO_PinSource3);
          EXTI_InitStructure.EXTI_Line = EXTI_Line3;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);
       
        /* EXTI line(PC4) mode config */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, GPIO_PinSource4);
          EXTI_InitStructure.EXTI_Line = EXTI_Line4;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);
       
        /* EXTI line(PC5) mode config */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, GPIO_PinSource5);
          EXTI_InitStructure.EXTI_Line = EXTI_Line5;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);
       
}

/**************************ʵÏÖº¯Êý********************************************
¿ªÆôÖжϡ£²¢ÅäÖø÷ͨµÀµÄÊäÈëÒý½ÅΪÖжÏÊäÈë
*******************************************************************************/
void PWM_Input_Initial(void)
{
        PWM_Input_GPIO_Config();
}

/**************************ʵÏÖº¯Êý********************************************
*º¯ÊýÔ­ÐÍ:                void EXTI0_IRQHandler(void)
*¹¦¡¡¡¡ÄÜ:            ÖжÏÏß0 µÄÖжϳÌÐò
*******************************************************************************/
void EXTI0_IRQHandler(void)
{
        uint32_t pwmin_temp;
        if( GPIOC->IDR & 0x0001){ //ÊÇÉÏÉýÑØ£¿
                CH6.RisingTime = micros();        //È¡ÉÏÉýÑØ·¢ÉúʱµÄʱ¼ä T1
        }else{ //ϽµÑØ
                CH6.FallingTime = micros(); //ȡʱ¼ä T2
                if(CH6.FallingTime < CH6.RisingTime){
                        return ; //³¬Ê± ·µ»Ø
                } else{
                        pwmin_temp = CH6.FallingTime - CH6.RisingTime;//T2-T1
                }
                if((pwmin_temp>(uint32_t)PWM_Input_MIN) && (pwmin_temp<(uint32_t)PWM_Input_MAX))
                {
                        PWM_Input_CH6 = pwmin_temp;
                        RC_data[5]        = PWM_Input_CH6;
                }
        }
        EXTI->PR=1<<0;  //Çå³ýÖжϱê־λ  
}

//ÖжÏÏß1 µÄÖжϳÌÐò
void EXTI1_IRQHandler(void)
{
        uint32_t pwmin_temp;
        if( GPIOC->IDR & 0x0002){
                CH5.RisingTime = micros();
        }else{
                CH5.FallingTime = micros();
                if(CH5.FallingTime < CH5.RisingTime){
                        //pwmin_temp = (0xffffffff - CH5.RisingTime) + CH5.FallingTime;
                        return ;
                } else{
                        pwmin_temp = CH5.FallingTime - CH5.RisingTime;
                }
               
                if((pwmin_temp>(uint32_t)PWM_Input_MIN) && (pwmin_temp<(uint32_t)PWM_Input_MAX))
                {
                        PWM_Input_CH5 = pwmin_temp;
                        RC_data[4]        = PWM_Input_CH3;
                }
                //Set_PWMOuput_CH5(PWM_Input_CH5);
        }
        EXTI->PR=1<<1;  //Çå³ýÖжϱê־λ  
}

//ÖжÏÏß2 µÄÖжϳÌÐò
void EXTI2_IRQHandler(void)
{
        uint32_t pwmin_temp;
        if( GPIOC->IDR & 0x0004){
                CH4.RisingTime = micros();
        }else{
                CH4.FallingTime = micros();
                if(CH4.FallingTime < CH4.RisingTime){
                        //pwmin_temp = (0xffffffff - CH4.RisingTime) + CH4.FallingTime;
                        return ;
                } else{
                        pwmin_temp = CH4.FallingTime - CH4.RisingTime;
                }
               
                if((pwmin_temp>(uint32_t)PWM_Input_MIN) && (pwmin_temp<(uint32_t)PWM_Input_MAX))
                {
                        PWM_Input_CH4 = pwmin_temp - PWM_Offset_Yaw + 1500;
                        RC_data[3]        = PWM_Input_CH4;
                }
                //Set_PWMOuput_CH4(PWM_Input_CH4);
        }
        EXTI->PR=1<<2;  //Çå³ýÖжϱê־λ  
}

//ÖжÏÏß3 µÄÖжϳÌÐò
void EXTI3_IRQHandler(void)
{
        uint32_t pwmin_temp;
        if( GPIOC->IDR & 0x0008){
                CH3.RisingTime = micros();
        }else{
                CH3.FallingTime = micros();
                if(CH3.FallingTime < CH3.RisingTime){
                        //pwmin_temp = (0xffffffff - CH3.RisingTime) + CH3.FallingTime;
                        return ;
                } else{
                        pwmin_temp = CH3.FallingTime - CH3.RisingTime;
                }
               
                if((pwmin_temp>(uint32_t)PWM_Input_MIN) && (pwmin_temp<(uint32_t)PWM_Input_MAX))
                {
                        PWM_Input_CH3 = pwmin_temp;
                        RC_data[2]        = PWM_Input_CH3;
                }
                //Set_PWMOuput_CH3(PWM_Input_CH3);
        }
        EXTI->PR=1<<3;  //Çå³ýÖжϱê־λ  
}

//ÖжÏÏß4 µÄÖжϳÌÐò
void EXTI4_IRQHandler(void)
{
        uint32_t pwmin_temp;
        if( GPIOC->IDR & 0x0010){
                CH2.RisingTime = micros();
        }else{
                CH2.FallingTime = micros();
                if(CH2.FallingTime < CH2.RisingTime){
                        //pwmin_temp = (0xffffffff - CH2.RisingTime) + CH2.FallingTime;
                        return ;
                } else{
                        pwmin_temp = CH2.FallingTime - CH2.RisingTime;
                }
               
                if((pwmin_temp>(uint32_t)PWM_Input_MIN) && (pwmin_temp<(uint32_t)PWM_Input_MAX))
                {
                        PWM_Input_CH2 = pwmin_temp - PWM_Offset_Pitch + 1500;
                        RC_data[1]        = PWM_Input_CH2;
                }
                //Set_PWMOuput_CH2(PWM_Input_CH2);
        }
        EXTI->PR=1<<4;  //Çå³ýÖжϱê־λ  
}

出0入0汤圆

 楼主| 发表于 2014-8-19 13:27:21 | 显示全部楼层
radio 发表于 2014-8-19 11:29
我直接给你贴一个

//¸÷¸öͨµÀµÄÉÏÉýÑغÍϽµÑØµÄ ´¥·¢Ê±¼ä

非常感谢你的程序,我会好好研究一下的。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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