1 | /* Includes ------------------------------------------------------------------*/
|
2 | #include "main.h"
|
3 | #include "i2c.h"
|
4 | #include "tim.h"
|
5 | #include "gpio.h"
|
6 |
|
7 | /* Private includes ----------------------------------------------------------*/
|
8 | /* USER CODE BEGIN Includes */
|
9 | #include "stm32_hal_legacy.h"
|
10 | #include "ssd1306.h"
|
11 | #include "string.h"
|
12 | #include "stdio.h"
|
13 | #include <stdbool.h>
|
14 |
|
15 | /* USER CODE END Includes */
|
16 |
|
17 | /* Private typedef -----------------------------------------------------------*/
|
18 | /* USER CODE BEGIN PTD */
|
19 |
|
20 | /* USER CODE END PTD */
|
21 |
|
22 | /* Private define ------------------------------------------------------------*/
|
23 | /* USER CODE BEGIN PD */
|
24 |
|
25 | /* USER CODE END PD */
|
26 |
|
27 | /* Private macro -------------------------------------------------------------*/
|
28 | /* USER CODE BEGIN PM */
|
29 |
|
30 | /* USER CODE END PM */
|
31 |
|
32 | /* Private variables ---------------------------------------------------------*/
|
33 |
|
34 | /* USER CODE BEGIN PV */
|
35 |
|
36 | volatile uint8_t overflow_cnt = 0;
|
37 | volatile bool update_Display = false;
|
38 | volatile uint16_t input_capture1 = 0;
|
39 | volatile uint16_t input_capture2 = 0;
|
40 |
|
41 | /* USER CODE END PV */
|
42 |
|
43 | /* Private function prototypes -----------------------------------------------*/
|
44 | void SystemClock_Config(void);
|
45 | /* USER CODE BEGIN PFP */
|
46 |
|
47 | /* USER CODE END PFP */
|
48 |
|
49 | /* Private user code ---------------------------------------------------------*/
|
50 | /* USER CODE BEGIN 0 */
|
51 |
|
52 | void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
|
53 | {
|
54 | static uint8_t fmessState = 0;
|
55 |
|
56 | switch (fmessState) {
|
57 | case 0:
|
58 | input_capture1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); //1)
|
59 | overflow_cnt = 0;
|
60 | update_Display = false;
|
61 | fmessState = 1;
|
62 | HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
|
63 | break;
|
64 | case 1:
|
65 | input_capture2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); //1)
|
66 | update_Display = true;
|
67 | fmessState = 0;
|
68 | break;
|
69 |
|
70 | default:
|
71 | break;
|
72 | }
|
73 | }
|
74 |
|
75 |
|
76 | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
|
77 |
|
78 | overflow_cnt++; // inc overflow_counter
|
79 |
|
80 | HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // LED indicator
|
81 |
|
82 | }
|
83 |
|
84 | /* USER CODE END 0 */
|
85 |
|
86 | /**
|
87 | * @brief The application entry point.
|
88 | * @retval int
|
89 | */
|
90 | int main(void)
|
91 | {
|
92 | /* USER CODE BEGIN 1 */
|
93 |
|
94 | /* USER CODE END 1 */
|
95 |
|
96 |
|
97 | /* MCU Configuration--------------------------------------------------------*/
|
98 |
|
99 | /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
|
100 | HAL_Init();
|
101 |
|
102 | /* USER CODE BEGIN Init */
|
103 |
|
104 | /* USER CODE END Init */
|
105 |
|
106 | /* Configure the system clock */
|
107 | SystemClock_Config();
|
108 |
|
109 | /* USER CODE BEGIN SysInit */
|
110 |
|
111 | /* USER CODE END SysInit */
|
112 |
|
113 | /* Initialize all configured peripherals */
|
114 | MX_GPIO_Init();
|
115 | MX_TIM2_Init();
|
116 | MX_I2C1_Init();
|
117 | /* USER CODE BEGIN 2 */
|
118 | HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 6)
|
119 | HAL_TIM_Base_Start_IT(&htim2); // 7)
|
120 | HAL_NVIC_EnableIRQ(TIM2_IRQn);
|
121 |
|
122 | ssd1306_Init();
|
123 | ssd1306_Fill(Black);
|
124 | ssd1306_Rect(0,16,127,63, White);
|
125 | ssd1306_SetCursor(0,0);
|
126 | ssd1306_WriteString("Freq:", Font_7x10, White);
|
127 | ssd1306_UpdateScreen();
|
128 | /* USER CODE END 2 */
|
129 |
|
130 | /* Infinite loop */
|
131 | /* USER CODE BEGIN WHILE */
|
132 | while (1)
|
133 | {
|
134 | /* USER CODE END WHILE */
|
135 |
|
136 | /* USER CODE BEGIN 3 */
|
137 | int32_t zw_Erg;
|
138 | uint32_t pw_us;
|
139 | uint16_t count_;
|
140 | uint16_t max_cnt = 49999;
|
141 | double pw_s;
|
142 | uint16_t frq_Hz;
|
143 | char frq_str[20];
|
144 |
|
145 | if (update_Display == true){
|
146 |
|
147 | update_Display = false;
|
148 | zw_Erg = input_capture2 - input_capture1;
|
149 |
|
150 |
|
151 | if (zw_Erg >= 0){
|
152 | pw_us = zw_Erg;
|
153 | }
|
154 | else{
|
155 | pw_us = zw_Erg + max_cnt;
|
156 | }
|
157 |
|
158 | pw_us = pw_us + (overflow_cnt * max_cnt);
|
159 | pw_s = (double)pw_us / 1E6;
|
160 | frq_Hz = 1 / pw_s;
|
161 |
|
162 | uint16_t frequenz = (uint32_t)(frq_Hz * 1000) / 1000;
|
163 |
|
164 | sprintf(frq_str, "Frq: %2d", frequenz);
|
165 | ssd1306_SetCursor(10,25);
|
166 | ssd1306_WriteString(" ",Font_7x10,White);
|
167 | ssd1306_SetCursor(20,25);
|
168 | ssd1306_WriteString(frq_str,Font_7x10,White);
|
169 |
|
170 | sprintf(frq_str, "ov_cnt: %2d", overflow_cnt);
|
171 | ssd1306_SetCursor(20,45);
|
172 | ssd1306_WriteString(" ",Font_7x10,White);
|
173 | ssd1306_SetCursor(20,45);
|
174 | ssd1306_WriteString(frq_str,Font_7x10,White);
|
175 |
|
176 | ssd1306_UpdateScreen();
|
177 |
|
178 | HAL_Delay(100);
|
179 |
|
180 | }
|
181 | }
|
182 | /* USER CODE END 3 */
|
183 | }
|