xref: /btstack/port/stm32-l451-miromico-sx1280/Src/main.c (revision 2fd737d36a1de5d778cacc671d4b4d8c4f3fed82)
1 /* USER CODE BEGIN Header */
2 /**
3   ******************************************************************************
4   * @file           : main.c
5   * @brief          : Main program body
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; 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