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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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