Всем доброго времени суток.
Пытаюсь прикрутить к STM32f4-Discovery ультразвуковой дальномер US-015.
Как я понял, нужно подать на ножку датчика импульс длиной 10 микросекунд, а потом посчитать ширину эха.
Думаю, что решение через задержку в главном цикле не совсем правильно, поэтому пытаюсь прикрутить все это аппаратно.
Как вариант решения, решил использовать режим одновибратора ТIM_SelectOnePulseMode(TIM9, TIM_OPMode_Single), но не могу понять как перезапустить импульс заново.
Перезапускать его хочу его из TIM1_BRK_TIM9_IRQHandler, после того, как произойдет считывание ширины эха.
Помогите пожалуйста подкостылить код, дабы запускать импульс по мере необходимости
P.S. Длительность импульса задаю из главного цикла командой TIM_SetCompare1(TIM9, length);
Вот настройки GPIO и TIM9:
CODE
#include "UltraSonic_timer_ini.h"
int capture=0;
void UltraSonic_init(void)
{
GPIO_InitTypeDef UltraSonic_GPIO_init;
TIM_TimeBaseInitTypeDef UltraSonic_TIM_BASE_Settings;
TIM_OCInitTypeDef UltraSonic_TIM_OC_Settings;
TIM_ICInitTypeDef UltraSonic_TIM_IC_Settings;
//TAKTIRUEM
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);
UltraSonic_GPIO_init.GPIO_Mode=GPIO_Mode_AF;
UltraSonic_GPIO_init.GPIO_OType=GPIO_OType_PP;
UltraSonic_GPIO_init.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
UltraSonic_GPIO_init.GPIO_PuPd=GPIO_PuPd_DOWN;
UltraSonic_GPIO_init.GPIO_Speed=GPIO_Low_Speed;
GPIO_Init(GPIOE, &UltraSonic_GPIO_init);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_TIM9);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9);
UltraSonic_TIM_BASE_Settings.TIM_ClockDivision = TIM_CKD_DIV1;
UltraSonic_TIM_BASE_Settings.TIM_CounterMode = TIM_CounterMode_Up;
UltraSonic_TIM_BASE_Settings.TIM_Period = 1000;
UltraSonic_TIM_BASE_Settings.TIM_Prescaler = 167;
UltraSonic_TIM_BASE_Settings.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM9, &UltraSonic_TIM_BASE_Settings);
UltraSonic_TIM_OC_Settings.TIM_OCIdleState = TIM_OCIdleState_Reset;
UltraSonic_TIM_OC_Settings.TIM_OCMode = TIM_OCMode_PWM1;
UltraSonic_TIM_OC_Settings.TIM_OCPolarity = TIM_OCPolarity_High;
UltraSonic_TIM_OC_Settings.TIM_OutputState = TIM_OutputState_Enable;
UltraSonic_TIM_OC_Settings.TIM_Pulse = 10;
TIM_OC1Init(TIM9, &UltraSonic_TIM_OC_Settings);
UltraSonic_TIM_IC_Settings.TIM_Channel = TIM_Channel_2; //Ispolzuem 2y kanal TIMER 9
UltraSonic_TIM_IC_Settings.TIM_ICFilter = 2; //Ne filtruem nichego
UltraSonic_TIM_IC_Settings.TIM_ICPolarity = TIM_ICPolarity_Rising; //Schitaem po narastauschemu frontu
UltraSonic_TIM_IC_Settings.TIM_ICPrescaler = TIM_ICPSC_DIV1; //Schitaem kajdiy impuls
UltraSonic_TIM_IC_Settings.TIM_ICSelection = TIM_ICSelection_DirectTI; //Napryamuiu so vhoda!!!
TIM_ICInit(TIM9, &UltraSonic_TIM_IC_Settings);
TIM_ITConfig(TIM9, TIM_IT_CC2, ENABLE);
TIM_Cmd(TIM9, ENABLE);
TIM_SelectOnePulseMode(TIM9, TIM_OPMode_Single);
NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
}
void TIM1_BRK_TIM9_IRQHandler(void)
{
if (TIM_GetITStatus(TIM9, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM9, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM9);
TIM_ClearFlag(TIM9,TIM_FLAG_Update);
}
}
Спасибо.