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 /* Includes ------------------------------------------------------------------*/ 21 #include "main.h" 22 23 /* Private includes ----------------------------------------------------------*/ 24 /* USER CODE BEGIN Includes */ 25 #include "SEGGER_RTT.h" 26 #include <stdio.h> 27 #include "sx1280-hal.h" 28 29 /* USER CODE END Includes */ 30 31 /* Private typedef -----------------------------------------------------------*/ 32 /* USER CODE BEGIN PTD */ 33 34 /* USER CODE END PTD */ 35 36 /* Private define ------------------------------------------------------------*/ 37 /* USER CODE BEGIN PD */ 38 /* USER CODE END PD */ 39 40 /* Private macro -------------------------------------------------------------*/ 41 /* USER CODE BEGIN PM */ 42 #define printf(format, ...) SEGGER_RTT_printf(0, format, ## __VA_ARGS__) 43 44 /* USER CODE END PM */ 45 46 /* Private variables ---------------------------------------------------------*/ 47 LPTIM_HandleTypeDef hlptim1; 48 49 SPI_HandleTypeDef hspi1; 50 DMA_HandleTypeDef hdma_spi1_rx; 51 DMA_HandleTypeDef hdma_spi1_tx; 52 53 UART_HandleTypeDef huart2; 54 55 /* USER CODE BEGIN PV */ 56 57 /* USER CODE END PV */ 58 59 /* Private function prototypes -----------------------------------------------*/ 60 void SystemClock_Config(void); 61 static void MX_GPIO_Init(void); 62 static void MX_DMA_Init(void); 63 static void MX_LPTIM1_Init(void); 64 static void MX_SPI1_Init(void); 65 static void MX_USART2_UART_Init(void); 66 /* USER CODE BEGIN PFP */ 67 void btstack_port(void); 68 /* USER CODE END PFP */ 69 70 /* Private user code ---------------------------------------------------------*/ 71 /* USER CODE BEGIN 0 */ 72 73 /* USER CODE END 0 */ 74 75 /** 76 * @brief The application entry point. 77 * @retval int 78 */ 79 int main(void) 80 { 81 /* USER CODE BEGIN 1 */ 82 83 /* USER CODE END 1 */ 84 85 /* MCU Configuration--------------------------------------------------------*/ 86 87 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 88 HAL_Init(); 89 90 /* USER CODE BEGIN Init */ 91 92 /* USER CODE END Init */ 93 94 /* Configure the system clock */ 95 SystemClock_Config(); 96 97 /* USER CODE BEGIN SysInit */ 98 99 /* USER CODE END SysInit */ 100 101 /* Initialize all configured peripherals */ 102 MX_GPIO_Init(); 103 MX_DMA_Init(); 104 MX_LPTIM1_Init(); 105 MX_SPI1_Init(); 106 MX_USART2_UART_Init(); 107 /* USER CODE BEGIN 2 */ 108 109 // HAL_LPTIM_Counter_Start_IT same as HAL_LPTIM_Counter_Start but also enables IRQs 110 HAL_LPTIM_Counter_Start_IT(&hlptim1, 0xffff); 111 112 btstack_port(); 113 114 /* USER CODE END 2 */ 115 116 /* Infinite loop */ 117 /* USER CODE BEGIN WHILE */ 118 while (1) 119 { 120 /* USER CODE END WHILE */ 121 122 /* USER CODE BEGIN 3 */ 123 } 124 /* USER CODE END 3 */ 125 } 126 127 /** 128 * @brief System Clock Configuration 129 * @retval None 130 */ 131 void SystemClock_Config(void) 132 { 133 RCC_OscInitTypeDef RCC_OscInitStruct = {0}; 134 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; 135 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; 136 137 /** Configure LSE Drive Capability 138 */ 139 HAL_PWR_EnableBkUpAccess(); 140 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); 141 /** Initializes the RCC Oscillators according to the specified parameters 142 * in the RCC_OscInitTypeDef structure. 143 */ 144 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; 145 RCC_OscInitStruct.LSEState = RCC_LSE_ON; 146 RCC_OscInitStruct.MSIState = RCC_MSI_ON; 147 RCC_OscInitStruct.MSICalibrationValue = 0; 148 RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; 149 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 150 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; 151 RCC_OscInitStruct.PLL.PLLM = 1; 152 RCC_OscInitStruct.PLL.PLLN = 36; 153 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; 154 RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; 155 RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; 156 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) 157 { 158 Error_Handler(); 159 } 160 /** Initializes the CPU, AHB and APB buses clocks 161 */ 162 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK 163 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; 164 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; 165 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 166 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 167 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 168 169 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) 170 { 171 Error_Handler(); 172 } 173 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_LPTIM1; 174 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; 175 PeriphClkInit.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE; 176 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) 177 { 178 Error_Handler(); 179 } 180 /** Configure the main internal regulator output voltage 181 */ 182 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) 183 { 184 Error_Handler(); 185 } 186 /** Enable MSI Auto calibration 187 */ 188 HAL_RCCEx_EnableMSIPLLMode(); 189 } 190 191 /** 192 * @brief LPTIM1 Initialization Function 193 * @param None 194 * @retval None 195 */ 196 static void MX_LPTIM1_Init(void) 197 { 198 199 /* USER CODE BEGIN LPTIM1_Init 0 */ 200 201 /* USER CODE END LPTIM1_Init 0 */ 202 203 /* USER CODE BEGIN LPTIM1_Init 1 */ 204 205 /* USER CODE END LPTIM1_Init 1 */ 206 hlptim1.Instance = LPTIM1; 207 hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; 208 hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1; 209 hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE; 210 hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH; 211 hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE; 212 hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL; 213 hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO; 214 hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO; 215 if (HAL_LPTIM_Init(&hlptim1) != HAL_OK) 216 { 217 Error_Handler(); 218 } 219 /* USER CODE BEGIN LPTIM1_Init 2 */ 220 221 /* USER CODE END LPTIM1_Init 2 */ 222 223 } 224 225 /** 226 * @brief SPI1 Initialization Function 227 * @param None 228 * @retval None 229 */ 230 static void MX_SPI1_Init(void) 231 { 232 233 /* USER CODE BEGIN SPI1_Init 0 */ 234 235 /* USER CODE END SPI1_Init 0 */ 236 237 /* USER CODE BEGIN SPI1_Init 1 */ 238 239 /* USER CODE END SPI1_Init 1 */ 240 /* SPI1 parameter configuration*/ 241 hspi1.Instance = SPI1; 242 hspi1.Init.Mode = SPI_MODE_MASTER; 243 hspi1.Init.Direction = SPI_DIRECTION_2LINES; 244 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; 245 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; 246 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; 247 hspi1.Init.NSS = SPI_NSS_SOFT; 248 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; 249 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 250 hspi1.Init.TIMode = SPI_TIMODE_DISABLE; 251 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 252 hspi1.Init.CRCPolynomial = 7; 253 hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; 254 hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; 255 if (HAL_SPI_Init(&hspi1) != HAL_OK) 256 { 257 Error_Handler(); 258 } 259 /* USER CODE BEGIN SPI1_Init 2 */ 260 261 /* USER CODE END SPI1_Init 2 */ 262 263 } 264 265 /** 266 * @brief USART2 Initialization Function 267 * @param None 268 * @retval None 269 */ 270 static void MX_USART2_UART_Init(void) 271 { 272 273 /* USER CODE BEGIN USART2_Init 0 */ 274 275 /* USER CODE END USART2_Init 0 */ 276 277 /* USER CODE BEGIN USART2_Init 1 */ 278 279 /* USER CODE END USART2_Init 1 */ 280 huart2.Instance = USART2; 281 huart2.Init.BaudRate = 115200; 282 huart2.Init.WordLength = UART_WORDLENGTH_8B; 283 huart2.Init.StopBits = UART_STOPBITS_1; 284 huart2.Init.Parity = UART_PARITY_NONE; 285 huart2.Init.Mode = UART_MODE_TX_RX; 286 huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; 287 huart2.Init.OverSampling = UART_OVERSAMPLING_16; 288 huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; 289 huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; 290 if (HAL_UART_Init(&huart2) != HAL_OK) 291 { 292 Error_Handler(); 293 } 294 /* USER CODE BEGIN USART2_Init 2 */ 295 296 /* USER CODE END USART2_Init 2 */ 297 298 } 299 300 /** 301 * Enable DMA controller clock 302 */ 303 static void MX_DMA_Init(void) 304 { 305 306 /* DMA controller clock enable */ 307 __HAL_RCC_DMA1_CLK_ENABLE(); 308 309 /* DMA interrupt init */ 310 /* DMA1_Channel2_IRQn interrupt configuration */ 311 HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); 312 HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); 313 /* DMA1_Channel3_IRQn interrupt configuration */ 314 HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0); 315 HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); 316 317 } 318 319 /** 320 * @brief GPIO Initialization Function 321 * @param None 322 * @retval None 323 */ 324 static void MX_GPIO_Init(void) 325 { 326 GPIO_InitTypeDef GPIO_InitStruct = {0}; 327 328 /* GPIO Ports Clock Enable */ 329 __HAL_RCC_GPIOC_CLK_ENABLE(); 330 __HAL_RCC_GPIOH_CLK_ENABLE(); 331 __HAL_RCC_GPIOA_CLK_ENABLE(); 332 __HAL_RCC_GPIOB_CLK_ENABLE(); 333 334 /*Configure GPIO pin Output Level */ 335 HAL_GPIO_WritePin(GPIOC, LED_RX_Pin|LED_TX_Pin, GPIO_PIN_RESET); 336 337 /*Configure GPIO pin Output Level */ 338 HAL_GPIO_WritePin(GPIOA, RADIO_nRESET_Pin|RADIO_NSS_Pin, GPIO_PIN_RESET); 339 340 /*Configure GPIO pin : B1_Pin */ 341 GPIO_InitStruct.Pin = B1_Pin; 342 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; 343 GPIO_InitStruct.Pull = GPIO_NOPULL; 344 HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); 345 346 /*Configure GPIO pins : LED_RX_Pin LED_TX_Pin */ 347 GPIO_InitStruct.Pin = LED_RX_Pin|LED_TX_Pin; 348 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 349 GPIO_InitStruct.Pull = GPIO_NOPULL; 350 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 351 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); 352 353 /*Configure GPIO pins : RADIO_nRESET_Pin RADIO_NSS_Pin */ 354 GPIO_InitStruct.Pin = RADIO_nRESET_Pin|RADIO_NSS_Pin; 355 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 356 GPIO_InitStruct.Pull = GPIO_NOPULL; 357 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 358 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 359 360 /*Configure GPIO pin : RADIO_BUSY_Pin */ 361 GPIO_InitStruct.Pin = RADIO_BUSY_Pin; 362 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 363 GPIO_InitStruct.Pull = GPIO_NOPULL; 364 HAL_GPIO_Init(RADIO_BUSY_GPIO_Port, &GPIO_InitStruct); 365 366 /*Configure GPIO pin : RADIO_DIO1_Pin */ 367 GPIO_InitStruct.Pin = RADIO_DIO1_Pin; 368 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; 369 GPIO_InitStruct.Pull = GPIO_NOPULL; 370 HAL_GPIO_Init(RADIO_DIO1_GPIO_Port, &GPIO_InitStruct); 371 372 /* EXTI interrupt init*/ 373 HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0); 374 HAL_NVIC_EnableIRQ(EXTI4_IRQn); 375 376 } 377 378 /* USER CODE BEGIN 4 */ 379 380 /* USER CODE END 4 */ 381 382 /** 383 * @brief This function is executed in case of error occurrence. 384 * @retval None 385 */ 386 void Error_Handler(void) 387 { 388 /* USER CODE BEGIN Error_Handler_Debug */ 389 /* User can add his own implementation to report the HAL error return state */ 390 391 /* USER CODE END Error_Handler_Debug */ 392 } 393 394 #ifdef USE_FULL_ASSERT 395 /** 396 * @brief Reports the name of the source file and the source line number 397 * where the assert_param error has occurred. 398 * @param file: pointer to the source file name 399 * @param line: assert_param error line source number 400 * @retval None 401 */ 402 void assert_failed(uint8_t *file, uint32_t line) 403 { 404 /* USER CODE BEGIN 6 */ 405 /* User can add his own implementation to report the file name and line number, 406 tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 407 /* USER CODE END 6 */ 408 } 409 #endif /* USE_FULL_ASSERT */ 410 411 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 412