想用通過測出聲音傳感器接收信號的時間差來定位聲源,但是用stm32定時器測出來的值總是不準確,這是為啥。將5個聲音傳感器接到5個外部中斷,然后每次進入中斷判斷是否為第一次進入,是則將定時器清0,否則讀取定時器 值,且每次進入中斷后我都把那條中斷線關了,防止多次進入同一個中斷,但是最終結果總是出現問題。求大佬指點,注釋都成亂碼了,我也就不改了,然后主函式中我又把中斷打開了。中斷代碼如下:
#include "exti.h"
#include "lcd.h"
#include "usart.h"
#include "key.h"
#include "delay.h"
extern volatile int flag;
extern volatile long int time[5];
extern volatile int sensor[5];
extern volatile int i;
void EXTIX_Init(void){
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
KEY_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource1);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource2);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3|EXTI_Line4;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x03;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x04;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void){
EXTI->IMR&=~(EXTI_Line0);
if(flag==0){
TIM_Cmd(TIM3,ENABLE);
TIM_SetCounter(TIM3,0);
flag=1;
}
time[i]=TIM_GetCounter(TIM3);
sensor[i]=1;
i++;
EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI1_IRQHandler(void){
EXTI->IMR&=~(EXTI_Line1);
if(flag==0){
TIM_Cmd(TIM3,ENABLE);
TIM_SetCounter(TIM3,0);
flag=1;
}
time[i]=TIM_GetCounter(TIM3);
sensor[i]=2;
i++;
EXTI_ClearITPendingBit(EXTI_Line1);
}
void EXTI2_IRQHandler(void){
EXTI->IMR&=~(EXTI_Line2);
if(flag==0){
TIM_Cmd(TIM3,ENABLE);
TIM_SetCounter(TIM3,0);
flag=1;
}
time[i]=TIM_GetCounter(TIM3);
sensor[i]=3;
i++;
EXTI_ClearITPendingBit(EXTI_Line2);
}
void EXTI3_IRQHandler(void){
EXTI->IMR&=~(EXTI_Line3);
if(flag==0){
TIM_Cmd(TIM3,ENABLE);
TIM_SetCounter(TIM3,0);
flag=1;
}
time[i]=TIM_GetCounter(TIM3);
sensor[i]=4;
i++;
EXTI_ClearITPendingBit(EXTI_Line3);
}
void EXTI4_IRQHandler(void){
EXTI->IMR&=~(EXTI_Line4);
if(flag==0){
TIM_Cmd(TIM3,ENABLE);
TIM_SetCounter(TIM3,0);
flag=1;
}
time[i]=TIM_GetCounter(TIM3);
sensor[i]=5;
i++;
EXTI_ClearITPendingBit(EXTI_Line4);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/249210.html
標籤:單片機/工控
下一篇:請教,做FPGA人臉識別系統
