xuxiang10 发表于 2014-8-18 09:50:53

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

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

sbusr 发表于 2014-8-18 10:05:02

ST提供的库包里面有。。

10xjzheng 发表于 2014-8-18 10:10:40

我有,我的这个项目里面超声波捕获后就是用输入捕获,你自己找关键部分
http://www.amobbs.com/thread-5580337-1-1.html

xuxiang10 发表于 2014-8-18 11:18:15

噢,谢谢了哈。。{:biggrin:}

radio 发表于 2014-8-19 11:19:05

你要捕获遥控器的PWM信号还是其他的什么?

xuxiang10 发表于 2014-8-19 11:21:09

radio 发表于 2014-8-19 11:19
你要捕获遥控器的PWM信号还是其他的什么?

捕获遥控器的PWM信号。。

radio 发表于 2014-8-19 11:23:26

你可以用定时器中断啊,你查查很简单的,找不到的话我给你

xuxiang10 发表于 2014-8-19 11:25:03

radio 发表于 2014-8-19 11:23
你可以用定时器中断啊,你查查很简单的,找不到的话我给你

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

xuxiang10 发表于 2014-8-19 11:25:31

{:lol:}{:lol:}{:lol:}

radio 发表于 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;

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        = 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        = 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        = 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        = 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        = PWM_Input_CH2;
                }
                //Set_PWMOuput_CH2(PWM_Input_CH2);
        }
        EXTI->PR=1<<4;//Çå³ýÖжϱê־λ
}

xuxiang10 发表于 2014-8-19 13:27:21

radio 发表于 2014-8-19 11:29
我直接给你贴一个

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


非常感谢你的程序,我会好好研究一下的。。。{:biggrin:}
页: [1]
查看完整版本: 想求一个Stm32输入捕获的程序。。。大神赐教。