Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f4xx.h"
- #include "stm32f4_discovery.h"
- #include <stdio.h>
- static unsigned int us=0, dst=0;
- double distance=0;
- int main(void)
- {
- void tim_start(void);
- void tim_stop();
- void delay(int l);
- void odczyt();
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- //Trigger PD4, jako wyjscie
- GPIO_InitTypeDef Trigger1;
- Trigger1.GPIO_Pin = GPIO_Pin_4;
- Trigger1.GPIO_Mode = GPIO_Mode_OUT;
- Trigger1.GPIO_OType = GPIO_OType_PP;
- Trigger1.GPIO_Speed = GPIO_Speed_100MHz;
- Trigger1.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOD, &Trigger1);
- GPIO_InitTypeDef Echo1;
- Echo1.GPIO_Pin = GPIO_Pin_6;
- Echo1.GPIO_Mode = GPIO_Mode_IN;
- Echo1.GPIO_OType = GPIO_OType_PP;
- Echo1.GPIO_Speed = GPIO_Speed_100MHz;
- Echo1.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOD, &Echo1);
- GPIO_InitTypeDef GPIO_InitStructure;
- /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- TIM_TimeBaseInitTypeDef Timer2;
- /* Przeladowanie nastepuje co 10us */
- Timer2.TIM_Period =9999;
- Timer2.TIM_Prescaler = 83;
- Timer2.TIM_ClockDivision = TIM_CKD_DIV1;
- Timer2.TIM_CounterMode = TIM_CounterMode_Up;
- Timer2.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM2, &Timer2);
- TIM_TimeBaseInitTypeDef Timer3;
- /* Przeladowanie nastepuje co 1us */
- Timer3.TIM_Period =7-1;
- Timer3.TIM_Prescaler = 12-1;
- Timer3.TIM_ClockDivision = TIM_CKD_DIV1;
- Timer3.TIM_CounterMode = TIM_CounterMode_Up;
- Timer3.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM3, &Timer3);
- //Przerwanie dla timera2
- NVIC_InitTypeDef NVIC_InitStructure;
- // numer przerwania
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- // priorytet główny
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
- // subpriorytet
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
- // uruchom dany kanał
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- // zapisz wypełnioną strukturę do rejestrów
- NVIC_Init(&NVIC_InitStructure);
- // wyczyszczenie przerwania od timera 2 (wystąpiło przy konfiguracji timera)
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
- // zezwolenie na przerwania od przepełnienia dla timera 2
- TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
- double zm1=0, zm2=58;
- for(;;)
- {
- odczyt();
- delay(1000000);
- zm1=us;
- distance = zm1/zm2; // odleglosc w centymetrach
- }
- }
- void delay(int l)// 1 to 1us --- funkcja trochę nieprecyzyjna
- {
- int i;
- TIM_Cmd(TIM3, ENABLE);
- for(i=0;i<l;i++)
- {
- while(TIM_GetFlagStatus(TIM3, TIM_FLAG_Update))
- {
- TIM_ClearFlag(TIM3, TIM_FLAG_Update);
- }
- }
- TIM_Cmd(TIM3, DISABLE);
- TIM3->CNT=0;
- }
- void odczyt()
- {
- int time;
- float dystans = 0;
- //Sygnal niski na trigger
- GPIO_ResetBits(GPIOD, GPIO_Pin_4);
- //Opóznienie 2us
- delay(10);
- //Sygnal wysoki na trigger
- GPIO_SetBits(GPIOD, GPIO_Pin_4);
- //Opóznienie 10 us
- delay(30);
- //Sygnal niski na trigger
- GPIO_ResetBits(GPIOD, GPIO_Pin_4);
- while (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == Bit_RESET);
- //Po takiej inicjalizacji nastepuje dokonanie pomiarow
- //Troche czasu na odpowiedz
- TIM_Cmd(TIM2, ENABLE);
- //Petla while czeka do momentu kiedy sygnal bedzie 0
- while (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == Bit_SET);
- TIM_Cmd(TIM2,DISABLE);
- //Pobranie czasu trwania stanu wysokiego
- time = TIM2->CNT;
- us=time;
- TIM2->CNT=0;
- //Obliczenie odleglosci
- //tutaj trzeba obliczyc dystans tak aby nie zawiesic procesora
- //Zwrócenie odleglosci
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement