1 /* USER CODE BEGIN Header */
2 /**
3 ******************************************************************************
4 * @file : main.c
5 * @brief : Main program body
6 ******************************************************************************
7 * @attention
8 *
9 * <h2><center>© Copyright (c) 2020 STMicroelectronics.
10 * All rights reserved.</center></h2>
11 *
12 * This software component is licensed by ST under BSD 3-Clause license,
13 * the "License"; You may not use this file except in compliance with the
14 * License. You may obtain a copy of the License at:
15 * opensource.org/licenses/BSD-3-Clause
16 *
17 ******************************************************************************
18 */
19 /* USER CODE END Header */
20
21 /* Includes ------------------------------------------------------------------*/
22 #include "main.h"
23
24 /* Private includes ----------------------------------------------------------*/
25 /* USER CODE BEGIN Includes */
26 #include "SEGGER_RTT.h"
27 #include <stdio.h>
28 #include "sx1280-hal.h"
29
30 /* USER CODE END Includes */
31
32 /* Private typedef -----------------------------------------------------------*/
33 /* USER CODE BEGIN PTD */
34
35 /* USER CODE END PTD */
36
37 /* Private define ------------------------------------------------------------*/
38 /* USER CODE BEGIN PD */
39 /* USER CODE END PD */
40
41 /* Private macro -------------------------------------------------------------*/
42 /* USER CODE BEGIN PM */
43 #define printf(format, ...) SEGGER_RTT_printf(0, format, ## __VA_ARGS__)
44
45 /* USER CODE END PM */
46
47 /* Private variables ---------------------------------------------------------*/
48 LPTIM_HandleTypeDef hlptim1;
49
50 SPI_HandleTypeDef hspi2;
51 DMA_HandleTypeDef hdma_spi2_rx;
52 DMA_HandleTypeDef hdma_spi2_tx;
53
54 TIM_HandleTypeDef htim2;
55
56 /* USER CODE BEGIN PV */
57
58 /* USER CODE END PV */
59
60 /* Private function prototypes -----------------------------------------------*/
61 void SystemClock_Config(void);
62 static void MX_GPIO_Init(void);
63 static void MX_DMA_Init(void);
64 static void MX_SPI2_Init(void);
65 static void MX_TIM2_Init(void);
66 static void MX_LPTIM1_Init(void);
67 /* USER CODE BEGIN PFP */
68 void btstack_port(void);
69
70 /* USER CODE END PFP */
71
72 /* Private user code ---------------------------------------------------------*/
73 /* USER CODE BEGIN 0 */
74
75 /* USER CODE END 0 */
76
77 /**
78 * @brief The application entry point.
79 * @retval int
80 */
main(void)81 int main(void)
82 {
83 /* USER CODE BEGIN 1 */
84
85 /* USER CODE END 1 */
86
87 /* MCU Configuration--------------------------------------------------------*/
88
89 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
90 HAL_Init();
91
92 /* USER CODE BEGIN Init */
93
94 /* USER CODE END Init */
95
96 /* Configure the system clock */
97 SystemClock_Config();
98
99 /* USER CODE BEGIN SysInit */
100
101 /* USER CODE END SysInit */
102
103 /* Initialize all configured peripherals */
104 MX_GPIO_Init();
105 MX_DMA_Init();
106 MX_SPI2_Init();
107 MX_TIM2_Init();
108 MX_LPTIM1_Init();
109 /* USER CODE BEGIN 2 */
110
111 HAL_TIM_Base_Start(&htim2);
112 // HAL_LPTIM_Counter_Start_IT same as HAL_LPTIM_Counter_Start but also enables IRQs
113 HAL_LPTIM_Counter_Start_IT(&hlptim1, 0xffff);
114
115 // Enable SX1280 Clock
116 HAL_GPIO_WritePin(RF_TXCO_GPIO_Port, RF_TXCO_Pin, GPIO_PIN_SET);
117
118 btstack_port();
119
120 /* USER CODE END 2 */
121
122 /* Infinite loop */
123 /* USER CODE BEGIN WHILE */
124 while (1)
125 {
126 // printf("[%06u] BUSY %u\n", hal_time_ms(), HAL_GPIO_ReadPin(RF_BUSY_GPIO_Port, RF_BUSY_Pin));
127 /* USER CODE END WHILE */
128
129 /* USER CODE BEGIN 3 */
130 }
131 /* USER CODE END 3 */
132 }
133
134 /**
135 * @brief System Clock Configuration
136 * @retval None
137 */
SystemClock_Config(void)138 void SystemClock_Config(void)
139 {
140 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
141 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
142 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
143
144 /** Configure LSE Drive Capability
145 */
146 HAL_PWR_EnableBkUpAccess();
147 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
148 /** Initializes the CPU, AHB and APB busses clocks
149 */
150 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI;
151 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
152 RCC_OscInitStruct.MSIState = RCC_MSI_ON;
153 RCC_OscInitStruct.MSICalibrationValue = 0;
154 RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
155 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
156 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
157 RCC_OscInitStruct.PLL.PLLM = 1;
158 RCC_OscInitStruct.PLL.PLLN = 36;
159 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
160 RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
161 RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
162 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
163 {
164 Error_Handler();
165 }
166 /** Initializes the CPU, AHB and APB busses clocks
167 */
168 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
169 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
170 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
171 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
172 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
173 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
174
175 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
176 {
177 Error_Handler();
178 }
179 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPTIM1;
180 PeriphClkInit.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;
181 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
182 {
183 Error_Handler();
184 }
185 /** Configure the main internal regulator output voltage
186 */
187 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
188 {
189 Error_Handler();
190 }
191 /** Enable MSI Auto calibration
192 */
193 HAL_RCCEx_EnableMSIPLLMode();
194 }
195
196 /**
197 * @brief LPTIM1 Initialization Function
198 * @param None
199 * @retval None
200 */
MX_LPTIM1_Init(void)201 static void MX_LPTIM1_Init(void)
202 {
203
204 /* USER CODE BEGIN LPTIM1_Init 0 */
205
206 /* USER CODE END LPTIM1_Init 0 */
207
208 /* USER CODE BEGIN LPTIM1_Init 1 */
209
210 /* USER CODE END LPTIM1_Init 1 */
211 hlptim1.Instance = LPTIM1;
212 hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
213 hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
214 hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
215 hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
216 hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
217 hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
218 hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
219 hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
220 if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)
221 {
222 Error_Handler();
223 }
224 /* USER CODE BEGIN LPTIM1_Init 2 */
225
226 /* USER CODE END LPTIM1_Init 2 */
227
228 }
229
230 /**
231 * @brief SPI2 Initialization Function
232 * @param None
233 * @retval None
234 */
MX_SPI2_Init(void)235 static void MX_SPI2_Init(void)
236 {
237
238 /* USER CODE BEGIN SPI2_Init 0 */
239
240 /* USER CODE END SPI2_Init 0 */
241
242 /* USER CODE BEGIN SPI2_Init 1 */
243
244 /* USER CODE END SPI2_Init 1 */
245 /* SPI2 parameter configuration*/
246 hspi2.Instance = SPI2;
247 hspi2.Init.Mode = SPI_MODE_MASTER;
248 hspi2.Init.Direction = SPI_DIRECTION_2LINES;
249 hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
250 hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
251 hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
252 hspi2.Init.NSS = SPI_NSS_SOFT;
253 hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
254 hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
255 hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
256 hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
257 hspi2.Init.CRCPolynomial = 7;
258 hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
259 hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
260 if (HAL_SPI_Init(&hspi2) != HAL_OK)
261 {
262 Error_Handler();
263 }
264 /* USER CODE BEGIN SPI2_Init 2 */
265
266 /* USER CODE END SPI2_Init 2 */
267
268 }
269
270 /**
271 * @brief TIM2 Initialization Function
272 * @param None
273 * @retval None
274 */
MX_TIM2_Init(void)275 static void MX_TIM2_Init(void)
276 {
277
278 /* USER CODE BEGIN TIM2_Init 0 */
279
280 /* USER CODE END TIM2_Init 0 */
281
282 TIM_ClockConfigTypeDef sClockSourceConfig = {0};
283 TIM_MasterConfigTypeDef sMasterConfig = {0};
284 TIM_OC_InitTypeDef sConfigOC = {0};
285
286 /* USER CODE BEGIN TIM2_Init 1 */
287
288 /* USER CODE END TIM2_Init 1 */
289 htim2.Instance = TIM2;
290 htim2.Init.Prescaler = 70;
291 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
292 htim2.Init.Period = 0xffffffff;
293 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
294 htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
295 if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
296 {
297 Error_Handler();
298 }
299 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
300 if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
301 {
302 Error_Handler();
303 }
304 if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
305 {
306 Error_Handler();
307 }
308 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
309 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
310 if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
311 {
312 Error_Handler();
313 }
314 sConfigOC.OCMode = TIM_OCMODE_TIMING;
315 sConfigOC.Pulse = 0;
316 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
317 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
318 if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
319 {
320 Error_Handler();
321 }
322 /* USER CODE BEGIN TIM2_Init 2 */
323
324 /* USER CODE END TIM2_Init 2 */
325
326 }
327
328 /**
329 * Enable DMA controller clock
330 */
MX_DMA_Init(void)331 static void MX_DMA_Init(void)
332 {
333
334 /* DMA controller clock enable */
335 __HAL_RCC_DMA1_CLK_ENABLE();
336
337 /* DMA interrupt init */
338 /* DMA1_Channel4_IRQn interrupt configuration */
339 HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
340 HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
341 /* DMA1_Channel5_IRQn interrupt configuration */
342 HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
343 HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
344
345 }
346
347 /**
348 * @brief GPIO Initialization Function
349 * @param None
350 * @retval None
351 */
MX_GPIO_Init(void)352 static void MX_GPIO_Init(void)
353 {
354 GPIO_InitTypeDef GPIO_InitStruct = {0};
355
356 /* GPIO Ports Clock Enable */
357 __HAL_RCC_GPIOC_CLK_ENABLE();
358 __HAL_RCC_GPIOB_CLK_ENABLE();
359 __HAL_RCC_GPIOA_CLK_ENABLE();
360
361 /*Configure GPIO pin Output Level */
362 HAL_GPIO_WritePin(RF_TXCO_GPIO_Port, RF_TXCO_Pin, GPIO_PIN_RESET);
363
364 /*Configure GPIO pin Output Level */
365 HAL_GPIO_WritePin(RF_RESET_GPIO_Port, RF_RESET_Pin, GPIO_PIN_RESET);
366
367 /*Configure GPIO pin Output Level */
368 HAL_GPIO_WritePin(RF_NSS_GPIO_Port, RF_NSS_Pin, GPIO_PIN_RESET);
369
370 /*Configure GPIO pins : PA6 PA7 */
371 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
372 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
373 GPIO_InitStruct.Pull = GPIO_NOPULL;
374 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
375
376 /*Configure GPIO pin : RF_BUSY_Pin */
377 GPIO_InitStruct.Pin = RF_BUSY_Pin;
378 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
379 GPIO_InitStruct.Pull = GPIO_NOPULL;
380 HAL_GPIO_Init(RF_BUSY_GPIO_Port, &GPIO_InitStruct);
381
382 /*Configure GPIO pin : RF_TXCO_Pin */
383 GPIO_InitStruct.Pin = RF_TXCO_Pin;
384 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
385 GPIO_InitStruct.Pull = GPIO_NOPULL;
386 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
387 HAL_GPIO_Init(RF_TXCO_GPIO_Port, &GPIO_InitStruct);
388
389 /*Configure GPIO pin : PC4 */
390 GPIO_InitStruct.Pin = GPIO_PIN_4;
391 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
392 GPIO_InitStruct.Pull = GPIO_NOPULL;
393 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
394
395 /*Configure GPIO pin : RF_RESET_Pin */
396 GPIO_InitStruct.Pin = RF_RESET_Pin;
397 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
398 GPIO_InitStruct.Pull = GPIO_NOPULL;
399 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
400 HAL_GPIO_Init(RF_RESET_GPIO_Port, &GPIO_InitStruct);
401
402 /*Configure GPIO pin : RF_NSS_Pin */
403 GPIO_InitStruct.Pin = RF_NSS_Pin;
404 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
405 GPIO_InitStruct.Pull = GPIO_NOPULL;
406 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
407 HAL_GPIO_Init(RF_NSS_GPIO_Port, &GPIO_InitStruct);
408
409 /* EXTI interrupt init*/
410 HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
411 HAL_NVIC_EnableIRQ(EXTI4_IRQn);
412
413 HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
414 HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
415
416 }
417
418 /* USER CODE BEGIN 4 */
419
420 /* USER CODE END 4 */
421
422 /**
423 * @brief This function is executed in case of error occurrence.
424 * @retval None
425 */
Error_Handler(void)426 void Error_Handler(void)
427 {
428 /* USER CODE BEGIN Error_Handler_Debug */
429 /* User can add his own implementation to report the HAL error return state */
430
431 /* USER CODE END Error_Handler_Debug */
432 }
433
434 #ifdef USE_FULL_ASSERT
435 /**
436 * @brief Reports the name of the source file and the source line number
437 * where the assert_param error has occurred.
438 * @param file: pointer to the source file name
439 * @param line: assert_param error line source number
440 * @retval None
441 */
assert_failed(uint8_t * file,uint32_t line)442 void assert_failed(uint8_t *file, uint32_t line)
443 {
444 /* USER CODE BEGIN 6 */
445 /* User can add his own implementation to report the file name and line number,
446 tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
447 /* USER CODE END 6 */
448 }
449 #endif /* USE_FULL_ASSERT */
450
451 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
452