新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2021-1-15
- 在线时间
- 3 小时
|
想用通过测出声音传感器接收信号的时间差来定位声源,但是用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);
}
|
|