想求一个Stm32输入捕获的程序。。。大神赐教。
想求一个Stm32输入捕获的程序。。。大神赐教。 ST提供的库包里面有。。 我有,我的这个项目里面超声波捕获后就是用输入捕获,你自己找关键部分http://www.amobbs.com/thread-5580337-1-1.html 噢,谢谢了哈。。{:biggrin:} 你要捕获遥控器的PWM信号还是其他的什么? radio 发表于 2014-8-19 11:19
你要捕获遥控器的PWM信号还是其他的什么?
捕获遥控器的PWM信号。。 你可以用定时器中断啊,你查查很简单的,找不到的话我给你 radio 发表于 2014-8-19 11:23
你可以用定时器中断啊,你查查很简单的,找不到的话我给你
好,我先找找哈,找不到了找你要啊 。。你的qq多少,我加你
{:lol:}{:lol:}{:lol:} 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;//Çå³ýÖжϱê־λ
} radio 发表于 2014-8-19 11:29
我直接给你贴一个
//¸÷¸öͨµÀµÄÉÏÉýÑغÍϽµÑØµÄ ´¥·¢Ê±¼ä
非常感谢你的程序,我会好好研究一下的。。。{:biggrin:}
页:
[1]