View difference between Paste ID: DhpVw4bN and 4sLcnPKY
SHOW: | | - or go back to the newest paste.
1
#include "stm32f4xx.h"
2
#include "stm32f4xx_hal.h"
3
#include <stdint.h>
4
#include "step_utils.h"
5
#include <stdio.h>
6
#include <string.h>
7
8
/*            Попытка подключить сенсор SRF04 - Ultra-Sonic Ranger.       !!!  код сырой :-) работает глюкавенько !!!    */
9
#define ERROR_ECHO 36000 // mkS ! If nothing is detected then the SRF04 will lower its echo line anyway after about 36mS
10
volatile uint32_t tick = 0;
11
volatile uint32_t us = 0;  // 1mS =1000 mkS
12
volatile float distance=0.0;// Transform pulse time to distance
13-
volatile uint32_t NextPuls=0;// после прихода эха необходимо подождать 10мС.
13+
//volatile uint32_t NextPuls=0; после прихода эха необходимо подождать 10мС.
14
// структуры инициализации портов и их пинов
15
GPIO_InitTypeDef GPIOE_Init;
16
GPIO_InitTypeDef GPIOD_Init;
17
// структуры инициализации портов и их пинов
18
GPIO_InitTypeDef GPIOG_Init;
19
TIM_HandleTypeDef htim7;// счетчик мкС
20
TIM_HandleTypeDef htim9;
21
TIM_OC_InitTypeDef sConfigOC; // структура для настройки каналов таймера
22
23
24
void TimersInit()
25
{
26
// GP Timer init
27
    __TIM9_CLK_ENABLE();
28
    __GPIOE_CLK_ENABLE();
29
30
    // PE5 - TIM9_CH1                 Подключаем разъем  РЕ5 к ножке Trig
31
    // PE6 - TIM9_CH2
32
    GPIOE_Init.Pin   = GPIO_PIN_5 | GPIO_PIN_6;
33
    GPIOE_Init.Mode  = GPIO_MODE_AF_PP; // альтернативная функция
34
    GPIOE_Init.Alternate = GPIO_AF3_TIM9; // название альтернативной функции
35
    GPIOE_Init.Pull  = GPIO_NOPULL;
36
    GPIOE_Init.Speed = GPIO_SPEED_LOW;
37
38
    HAL_GPIO_Init(GPIOE, &GPIOE_Init);
39
40
    htim9.Instance = TIM9;
41
// сервоприводы работают на частоте 50 Гц
42
    htim9.Init.Prescaler = 168 - 1; // 168 MHz / 168 = 1 MHz
43
    htim9.Init.Period = 60000 - 1; // 60 ms  Интервалы между  импульсами 60мс  (Отсчет идет от RISING импульса)
44
    htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
45
46
    HAL_TIM_PWM_Init(&htim9);
47
48
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
49
    sConfigOC.Pulse = 10; //  микросекунд
50
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
51
    HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_1);
52
53
    sConfigOC.OCMode = TIM_OCMODE_PWM2;
54
    sConfigOC.Pulse = 10; //  микросекунд
55
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
56
    HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_2);
57
58
    /* счетчик мкС */
59
60
    // BASIC Timer init
61
    __TIM7_CLK_ENABLE();
62
    htim7.Instance = TIM7;
63
    htim7.Init.CounterMode = TIM_COUNTERMODE_UP; // считает от 0 вверх
64
    htim7.Init.Prescaler =84-1; // Предделитель  предделитель   8400-1
65
    htim7.Init.Period = 1000-1; // Период  1mS = 1000mkS
66
    HAL_TIM_Base_Init(&htim7); // Инициализируем  инициализация базового таймера
67
68
    HAL_NVIC_EnableIRQ(TIM7_IRQn); // Разрешаем прерывание таймера
69
70
    /**/
71
72
}
73
void UltrasonicInit()  //  пытаюсь подключить Ультразвуковой датчик измерения расстояния HC-SR04
74
{
75
    // Включаем питание и тактирование на портах D
76
    __GPIOD_CLK_ENABLE();
77
78
79
    // (Echo) in Ultrasonic настраиваем на вход РD5   овет в диапазоне от 150мкс до 25мс , если ничего не обнаружил 38мс
80
    GPIOD_Init.Pin   = GPIO_PIN_5;
81
    GPIOD_Init.Mode  = GPIO_MODE_IT_RISING_FALLING; // входной режим  GPIO_MODE_IT_RISING_FALLING
82
    GPIOD_Init.Pull  = GPIO_PULLDOWN;  //режим когда на пине по умолчанию 0 подаеться, прижимаем к земле
83
    GPIOD_Init.Speed = GPIO_SPEED_LOW;
84
85
    HAL_GPIO_Init(GPIOD, &GPIOD_Init);// инизиализируем порт, передаем структуру
86
}
87
88
89
void LedInit()
90
{
91
    // структуры инициализации портов и их пинов
92
    GPIO_InitTypeDef GPIOG_Init;
93
94
    __GPIOG_CLK_ENABLE();
95
96
    // светодиоды настраиваем на выход
97
    GPIOG_Init.Pin   = GPIO_PIN_14 | GPIO_PIN_13; // 13 - зеленый, 14 - красный
98
    GPIOG_Init.Mode  = GPIO_MODE_OUTPUT_PP;
99
    GPIOG_Init.Pull  = GPIO_NOPULL;
100
    GPIOG_Init.Speed = GPIO_SPEED_LOW;
101
102
    HAL_GPIO_Init(GPIOG, &GPIOG_Init); // инизиализируем порт, передаем структуру
103
}
104
// GetMicroS()  Добавляет микросекунды , которые берет с счетчика  TIM7->CNT;
105
uint32_t GetMicroS()
106
{
107
    return us+TIM7->CNT;
108
}
109
110
int main(void)
111
{
112
    TimersInit();
113
    SystemInit();
114
    HAL_Init();
115
    STEP_Init();
116
    LedInit();
117
    UltrasonicInit();
118
    GetMicroS();
119
120
    // Говорим нашему контроллеру прерываний (NVIC), что мы хотим обрабатывать прерывание EXTI0_IRQn
121
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
122
    HAL_TIM_Base_Start_IT(&htim7); // запускаем таймер в режиме прерываний _IT -указывает что идет обращение к прерыванию
123
    HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_1); // запускаем генерацию ШИМ сигнала на 1-м канале
124
    HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_2); // ... на 2-м канале
125
126
    while (1)
127
    {
128
        HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
129
        char buf[50];
130
        sprintf(buf, "distance %.1lf mks",distance);
131
        STEP_Println(buf);
132
        HAL_Delay(1000);
133
    }
134
}
135
136
137
// название обработчика прерывания аналогично прерыванию (EXTI0_IRQn) только вместо "n" - "Handler"   Echo   ---> РD5
138
void EXTI9_5_IRQHandler(void)
139
{
140-
    if ( tick==0 && NextPuls <= GetMicroS())//
140+
    if ( tick==0 )//
141
    {
142
        tick = GetMicroS();
143
 //       NextPuls=0;
144
    }
145-
    else if (NextPuls <= GetMicroS())
145+
    else 
146
    {
147
        distance= (GetMicroS() - tick)/58.0;  //   (HAL_GetTick() - tick)uS/58 = X cm// Transform pulse time to distance
148
        if ((GetMicroS() - tick)>=ERROR_ECHO)
149
        {
150
            distance=0000.0; //If nothing is detected
151
        }
152
        NextPuls=GetMicroS()+10000;
153
        tick =0;
154
    }
155
    // Очищаем флаги прерывания. Говорим, что мы его обработали.
156
    HAL_NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
157
    // нужно для работы нашей библиотеки HAL
158
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
159
}
160
// Обработчик прерывания таймера   считает 1мС = 1000 мкС , задается в htim7.Init.Period = 1000-1; // мкс
161
void TIM7_IRQHandler()
162
{
163
    us +=1000;
164
165
    HAL_TIM_IRQHandler(&htim7); // нужно для работы библиотеки HAL
166
}
167
168
// Обработчик прерывания от системного таймера
169
void SysTick_Handler()
170
{
171
    HAL_IncTick();
172
    HAL_SYSTICK_IRQHandler();
173
}