1*e8380792SMatthias Ringwald /* USER CODE BEGIN Header */ 2*e8380792SMatthias Ringwald /** 3*e8380792SMatthias Ringwald ****************************************************************************** 4*e8380792SMatthias Ringwald * @file : main.c 5*e8380792SMatthias Ringwald * @brief : Main program body 6*e8380792SMatthias Ringwald ****************************************************************************** 7*e8380792SMatthias Ringwald * @attention 8*e8380792SMatthias Ringwald * 9*e8380792SMatthias Ringwald * <h2><center>© Copyright (c) 2019 STMicroelectronics. 10*e8380792SMatthias Ringwald * All rights reserved.</center></h2> 11*e8380792SMatthias Ringwald * 12*e8380792SMatthias Ringwald * This software component is licensed by ST under BSD 3-Clause license, 13*e8380792SMatthias Ringwald * the "License"; You may not use this file except in compliance with the 14*e8380792SMatthias Ringwald * License. You may obtain a copy of the License at: 15*e8380792SMatthias Ringwald * opensource.org/licenses/BSD-3-Clause 16*e8380792SMatthias Ringwald * 17*e8380792SMatthias Ringwald ****************************************************************************** 18*e8380792SMatthias Ringwald */ 19*e8380792SMatthias Ringwald /* USER CODE END Header */ 20*e8380792SMatthias Ringwald 21*e8380792SMatthias Ringwald /* Includes ------------------------------------------------------------------*/ 22*e8380792SMatthias Ringwald #include "main.h" 23*e8380792SMatthias Ringwald 24*e8380792SMatthias Ringwald /* Private includes ----------------------------------------------------------*/ 25*e8380792SMatthias Ringwald /* USER CODE BEGIN Includes */ 26*e8380792SMatthias Ringwald 27*e8380792SMatthias Ringwald /* USER CODE END Includes */ 28*e8380792SMatthias Ringwald 29*e8380792SMatthias Ringwald /* Private typedef -----------------------------------------------------------*/ 30*e8380792SMatthias Ringwald /* USER CODE BEGIN PTD */ 31*e8380792SMatthias Ringwald 32*e8380792SMatthias Ringwald /* USER CODE END PTD */ 33*e8380792SMatthias Ringwald 34*e8380792SMatthias Ringwald /* Private define ------------------------------------------------------------*/ 35*e8380792SMatthias Ringwald /* USER CODE BEGIN PD */ 36*e8380792SMatthias Ringwald 37*e8380792SMatthias Ringwald /* USER CODE END PD */ 38*e8380792SMatthias Ringwald 39*e8380792SMatthias Ringwald /* Private macro -------------------------------------------------------------*/ 40*e8380792SMatthias Ringwald /* USER CODE BEGIN PM */ 41*e8380792SMatthias Ringwald 42*e8380792SMatthias Ringwald /* USER CODE END PM */ 43*e8380792SMatthias Ringwald 44*e8380792SMatthias Ringwald /* Private variables ---------------------------------------------------------*/ 45*e8380792SMatthias Ringwald SPI_HandleTypeDef hspi1; 46*e8380792SMatthias Ringwald DMA_HandleTypeDef hdma_spi1_rx; 47*e8380792SMatthias Ringwald DMA_HandleTypeDef hdma_spi1_tx; 48*e8380792SMatthias Ringwald 49*e8380792SMatthias Ringwald UART_HandleTypeDef huart2; 50*e8380792SMatthias Ringwald 51*e8380792SMatthias Ringwald /* USER CODE BEGIN PV */ 52*e8380792SMatthias Ringwald 53*e8380792SMatthias Ringwald /* USER CODE END PV */ 54*e8380792SMatthias Ringwald 55*e8380792SMatthias Ringwald /* Private function prototypes -----------------------------------------------*/ 56*e8380792SMatthias Ringwald void SystemClock_Config(void); 57*e8380792SMatthias Ringwald static void MX_GPIO_Init(void); 58*e8380792SMatthias Ringwald static void MX_DMA_Init(void); 59*e8380792SMatthias Ringwald static void MX_SPI1_Init(void); 60*e8380792SMatthias Ringwald static void MX_USART2_UART_Init(void); 61*e8380792SMatthias Ringwald /* USER CODE BEGIN PFP */ 62*e8380792SMatthias Ringwald 63*e8380792SMatthias Ringwald /* USER CODE END PFP */ 64*e8380792SMatthias Ringwald 65*e8380792SMatthias Ringwald /* Private user code ---------------------------------------------------------*/ 66*e8380792SMatthias Ringwald /* USER CODE BEGIN 0 */ 67*e8380792SMatthias Ringwald 68*e8380792SMatthias Ringwald /* USER CODE END 0 */ 69*e8380792SMatthias Ringwald 70*e8380792SMatthias Ringwald /** 71*e8380792SMatthias Ringwald * @brief The application entry point. 72*e8380792SMatthias Ringwald * @retval int 73*e8380792SMatthias Ringwald */ 74*e8380792SMatthias Ringwald int main(void) 75*e8380792SMatthias Ringwald { 76*e8380792SMatthias Ringwald /* USER CODE BEGIN 1 */ 77*e8380792SMatthias Ringwald 78*e8380792SMatthias Ringwald /* USER CODE END 1 */ 79*e8380792SMatthias Ringwald 80*e8380792SMatthias Ringwald /* MCU Configuration--------------------------------------------------------*/ 81*e8380792SMatthias Ringwald 82*e8380792SMatthias Ringwald /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 83*e8380792SMatthias Ringwald HAL_Init(); 84*e8380792SMatthias Ringwald 85*e8380792SMatthias Ringwald /* USER CODE BEGIN Init */ 86*e8380792SMatthias Ringwald 87*e8380792SMatthias Ringwald /* USER CODE END Init */ 88*e8380792SMatthias Ringwald 89*e8380792SMatthias Ringwald /* Configure the system clock */ 90*e8380792SMatthias Ringwald SystemClock_Config(); 91*e8380792SMatthias Ringwald 92*e8380792SMatthias Ringwald /* USER CODE BEGIN SysInit */ 93*e8380792SMatthias Ringwald 94*e8380792SMatthias Ringwald /* USER CODE END SysInit */ 95*e8380792SMatthias Ringwald 96*e8380792SMatthias Ringwald /* Initialize all configured peripherals */ 97*e8380792SMatthias Ringwald MX_GPIO_Init(); 98*e8380792SMatthias Ringwald MX_DMA_Init(); 99*e8380792SMatthias Ringwald MX_SPI1_Init(); 100*e8380792SMatthias Ringwald MX_USART2_UART_Init(); 101*e8380792SMatthias Ringwald /* USER CODE BEGIN 2 */ 102*e8380792SMatthias Ringwald // jump to BTstack port 103*e8380792SMatthias Ringwald port_main(); 104*e8380792SMatthias Ringwald /* USER CODE END 2 */ 105*e8380792SMatthias Ringwald 106*e8380792SMatthias Ringwald /* Infinite loop */ 107*e8380792SMatthias Ringwald /* USER CODE BEGIN WHILE */ 108*e8380792SMatthias Ringwald while (1) 109*e8380792SMatthias Ringwald { 110*e8380792SMatthias Ringwald /* USER CODE END WHILE */ 111*e8380792SMatthias Ringwald 112*e8380792SMatthias Ringwald /* USER CODE BEGIN 3 */ 113*e8380792SMatthias Ringwald } 114*e8380792SMatthias Ringwald /* USER CODE END 3 */ 115*e8380792SMatthias Ringwald } 116*e8380792SMatthias Ringwald 117*e8380792SMatthias Ringwald /** 118*e8380792SMatthias Ringwald * @brief System Clock Configuration 119*e8380792SMatthias Ringwald * @retval None 120*e8380792SMatthias Ringwald */ 121*e8380792SMatthias Ringwald void SystemClock_Config(void) 122*e8380792SMatthias Ringwald { 123*e8380792SMatthias Ringwald RCC_OscInitTypeDef RCC_OscInitStruct = {0}; 124*e8380792SMatthias Ringwald RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; 125*e8380792SMatthias Ringwald RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; 126*e8380792SMatthias Ringwald 127*e8380792SMatthias Ringwald /** Configure the main internal regulator output voltage 128*e8380792SMatthias Ringwald */ 129*e8380792SMatthias Ringwald __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); 130*e8380792SMatthias Ringwald /** Initializes the CPU, AHB and APB busses clocks 131*e8380792SMatthias Ringwald */ 132*e8380792SMatthias Ringwald RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; 133*e8380792SMatthias Ringwald RCC_OscInitStruct.HSIState = RCC_HSI_ON; 134*e8380792SMatthias Ringwald RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; 135*e8380792SMatthias Ringwald RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 136*e8380792SMatthias Ringwald RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; 137*e8380792SMatthias Ringwald RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4; 138*e8380792SMatthias Ringwald RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2; 139*e8380792SMatthias Ringwald if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) 140*e8380792SMatthias Ringwald { 141*e8380792SMatthias Ringwald Error_Handler(); 142*e8380792SMatthias Ringwald } 143*e8380792SMatthias Ringwald /** Initializes the CPU, AHB and APB busses clocks 144*e8380792SMatthias Ringwald */ 145*e8380792SMatthias Ringwald RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK 146*e8380792SMatthias Ringwald |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; 147*e8380792SMatthias Ringwald RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; 148*e8380792SMatthias Ringwald RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 149*e8380792SMatthias Ringwald RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 150*e8380792SMatthias Ringwald RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 151*e8380792SMatthias Ringwald 152*e8380792SMatthias Ringwald if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) 153*e8380792SMatthias Ringwald { 154*e8380792SMatthias Ringwald Error_Handler(); 155*e8380792SMatthias Ringwald } 156*e8380792SMatthias Ringwald PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; 157*e8380792SMatthias Ringwald PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; 158*e8380792SMatthias Ringwald if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) 159*e8380792SMatthias Ringwald { 160*e8380792SMatthias Ringwald Error_Handler(); 161*e8380792SMatthias Ringwald } 162*e8380792SMatthias Ringwald } 163*e8380792SMatthias Ringwald 164*e8380792SMatthias Ringwald /** 165*e8380792SMatthias Ringwald * @brief SPI1 Initialization Function 166*e8380792SMatthias Ringwald * @param None 167*e8380792SMatthias Ringwald * @retval None 168*e8380792SMatthias Ringwald */ 169*e8380792SMatthias Ringwald static void MX_SPI1_Init(void) 170*e8380792SMatthias Ringwald { 171*e8380792SMatthias Ringwald 172*e8380792SMatthias Ringwald /* USER CODE BEGIN SPI1_Init 0 */ 173*e8380792SMatthias Ringwald 174*e8380792SMatthias Ringwald /* USER CODE END SPI1_Init 0 */ 175*e8380792SMatthias Ringwald 176*e8380792SMatthias Ringwald /* USER CODE BEGIN SPI1_Init 1 */ 177*e8380792SMatthias Ringwald 178*e8380792SMatthias Ringwald /* USER CODE END SPI1_Init 1 */ 179*e8380792SMatthias Ringwald /* SPI1 parameter configuration*/ 180*e8380792SMatthias Ringwald hspi1.Instance = SPI1; 181*e8380792SMatthias Ringwald hspi1.Init.Mode = SPI_MODE_MASTER; 182*e8380792SMatthias Ringwald hspi1.Init.Direction = SPI_DIRECTION_2LINES; 183*e8380792SMatthias Ringwald hspi1.Init.DataSize = SPI_DATASIZE_8BIT; 184*e8380792SMatthias Ringwald hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; 185*e8380792SMatthias Ringwald hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; 186*e8380792SMatthias Ringwald hspi1.Init.NSS = SPI_NSS_SOFT; 187*e8380792SMatthias Ringwald hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; 188*e8380792SMatthias Ringwald hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 189*e8380792SMatthias Ringwald hspi1.Init.TIMode = SPI_TIMODE_DISABLE; 190*e8380792SMatthias Ringwald hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 191*e8380792SMatthias Ringwald hspi1.Init.CRCPolynomial = 7; 192*e8380792SMatthias Ringwald if (HAL_SPI_Init(&hspi1) != HAL_OK) 193*e8380792SMatthias Ringwald { 194*e8380792SMatthias Ringwald Error_Handler(); 195*e8380792SMatthias Ringwald } 196*e8380792SMatthias Ringwald /* USER CODE BEGIN SPI1_Init 2 */ 197*e8380792SMatthias Ringwald 198*e8380792SMatthias Ringwald /* USER CODE END SPI1_Init 2 */ 199*e8380792SMatthias Ringwald 200*e8380792SMatthias Ringwald } 201*e8380792SMatthias Ringwald 202*e8380792SMatthias Ringwald /** 203*e8380792SMatthias Ringwald * @brief USART2 Initialization Function 204*e8380792SMatthias Ringwald * @param None 205*e8380792SMatthias Ringwald * @retval None 206*e8380792SMatthias Ringwald */ 207*e8380792SMatthias Ringwald static void MX_USART2_UART_Init(void) 208*e8380792SMatthias Ringwald { 209*e8380792SMatthias Ringwald 210*e8380792SMatthias Ringwald /* USER CODE BEGIN USART2_Init 0 */ 211*e8380792SMatthias Ringwald 212*e8380792SMatthias Ringwald /* USER CODE END USART2_Init 0 */ 213*e8380792SMatthias Ringwald 214*e8380792SMatthias Ringwald /* USER CODE BEGIN USART2_Init 1 */ 215*e8380792SMatthias Ringwald 216*e8380792SMatthias Ringwald /* USER CODE END USART2_Init 1 */ 217*e8380792SMatthias Ringwald huart2.Instance = USART2; 218*e8380792SMatthias Ringwald huart2.Init.BaudRate = 115200; 219*e8380792SMatthias Ringwald huart2.Init.WordLength = UART_WORDLENGTH_8B; 220*e8380792SMatthias Ringwald huart2.Init.StopBits = UART_STOPBITS_1; 221*e8380792SMatthias Ringwald huart2.Init.Parity = UART_PARITY_NONE; 222*e8380792SMatthias Ringwald huart2.Init.Mode = UART_MODE_TX_RX; 223*e8380792SMatthias Ringwald huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; 224*e8380792SMatthias Ringwald huart2.Init.OverSampling = UART_OVERSAMPLING_16; 225*e8380792SMatthias Ringwald huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; 226*e8380792SMatthias Ringwald huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; 227*e8380792SMatthias Ringwald if (HAL_UART_Init(&huart2) != HAL_OK) 228*e8380792SMatthias Ringwald { 229*e8380792SMatthias Ringwald Error_Handler(); 230*e8380792SMatthias Ringwald } 231*e8380792SMatthias Ringwald /* USER CODE BEGIN USART2_Init 2 */ 232*e8380792SMatthias Ringwald 233*e8380792SMatthias Ringwald /* USER CODE END USART2_Init 2 */ 234*e8380792SMatthias Ringwald 235*e8380792SMatthias Ringwald } 236*e8380792SMatthias Ringwald 237*e8380792SMatthias Ringwald /** 238*e8380792SMatthias Ringwald * Enable DMA controller clock 239*e8380792SMatthias Ringwald */ 240*e8380792SMatthias Ringwald static void MX_DMA_Init(void) 241*e8380792SMatthias Ringwald { 242*e8380792SMatthias Ringwald /* DMA controller clock enable */ 243*e8380792SMatthias Ringwald __HAL_RCC_DMA1_CLK_ENABLE(); 244*e8380792SMatthias Ringwald 245*e8380792SMatthias Ringwald /* DMA interrupt init */ 246*e8380792SMatthias Ringwald /* DMA1_Channel2_3_IRQn interrupt configuration */ 247*e8380792SMatthias Ringwald HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0); 248*e8380792SMatthias Ringwald HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); 249*e8380792SMatthias Ringwald 250*e8380792SMatthias Ringwald } 251*e8380792SMatthias Ringwald 252*e8380792SMatthias Ringwald /** 253*e8380792SMatthias Ringwald * @brief GPIO Initialization Function 254*e8380792SMatthias Ringwald * @param None 255*e8380792SMatthias Ringwald * @retval None 256*e8380792SMatthias Ringwald */ 257*e8380792SMatthias Ringwald static void MX_GPIO_Init(void) 258*e8380792SMatthias Ringwald { 259*e8380792SMatthias Ringwald GPIO_InitTypeDef GPIO_InitStruct = {0}; 260*e8380792SMatthias Ringwald 261*e8380792SMatthias Ringwald /* GPIO Ports Clock Enable */ 262*e8380792SMatthias Ringwald __HAL_RCC_GPIOC_CLK_ENABLE(); 263*e8380792SMatthias Ringwald __HAL_RCC_GPIOH_CLK_ENABLE(); 264*e8380792SMatthias Ringwald __HAL_RCC_GPIOA_CLK_ENABLE(); 265*e8380792SMatthias Ringwald __HAL_RCC_GPIOB_CLK_ENABLE(); 266*e8380792SMatthias Ringwald 267*e8380792SMatthias Ringwald /*Configure GPIO pin Output Level */ 268*e8380792SMatthias Ringwald HAL_GPIO_WritePin(GPIOB, EN_Pin|SPI1_CSN_Pin, GPIO_PIN_RESET); 269*e8380792SMatthias Ringwald 270*e8380792SMatthias Ringwald /*Configure GPIO pin : B1_Pin */ 271*e8380792SMatthias Ringwald GPIO_InitStruct.Pin = B1_Pin; 272*e8380792SMatthias Ringwald GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; 273*e8380792SMatthias Ringwald GPIO_InitStruct.Pull = GPIO_NOPULL; 274*e8380792SMatthias Ringwald HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); 275*e8380792SMatthias Ringwald 276*e8380792SMatthias Ringwald /*Configure GPIO pins : EN_Pin SPI1_CSN_Pin */ 277*e8380792SMatthias Ringwald GPIO_InitStruct.Pin = EN_Pin|SPI1_CSN_Pin; 278*e8380792SMatthias Ringwald GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 279*e8380792SMatthias Ringwald GPIO_InitStruct.Pull = GPIO_NOPULL; 280*e8380792SMatthias Ringwald GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 281*e8380792SMatthias Ringwald HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 282*e8380792SMatthias Ringwald 283*e8380792SMatthias Ringwald /*Configure GPIO pin : SPI1_RDY_Pin */ 284*e8380792SMatthias Ringwald GPIO_InitStruct.Pin = SPI1_RDY_Pin; 285*e8380792SMatthias Ringwald GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 286*e8380792SMatthias Ringwald GPIO_InitStruct.Pull = GPIO_NOPULL; 287*e8380792SMatthias Ringwald HAL_GPIO_Init(SPI1_RDY_GPIO_Port, &GPIO_InitStruct); 288*e8380792SMatthias Ringwald 289*e8380792SMatthias Ringwald } 290*e8380792SMatthias Ringwald 291*e8380792SMatthias Ringwald /* USER CODE BEGIN 4 */ 292*e8380792SMatthias Ringwald 293*e8380792SMatthias Ringwald /* USER CODE END 4 */ 294*e8380792SMatthias Ringwald 295*e8380792SMatthias Ringwald /** 296*e8380792SMatthias Ringwald * @brief This function is executed in case of error occurrence. 297*e8380792SMatthias Ringwald * @retval None 298*e8380792SMatthias Ringwald */ 299*e8380792SMatthias Ringwald void Error_Handler(void) 300*e8380792SMatthias Ringwald { 301*e8380792SMatthias Ringwald /* USER CODE BEGIN Error_Handler_Debug */ 302*e8380792SMatthias Ringwald /* User can add his own implementation to report the HAL error return state */ 303*e8380792SMatthias Ringwald 304*e8380792SMatthias Ringwald /* USER CODE END Error_Handler_Debug */ 305*e8380792SMatthias Ringwald } 306*e8380792SMatthias Ringwald 307*e8380792SMatthias Ringwald #ifdef USE_FULL_ASSERT 308*e8380792SMatthias Ringwald /** 309*e8380792SMatthias Ringwald * @brief Reports the name of the source file and the source line number 310*e8380792SMatthias Ringwald * where the assert_param error has occurred. 311*e8380792SMatthias Ringwald * @param file: pointer to the source file name 312*e8380792SMatthias Ringwald * @param line: assert_param error line source number 313*e8380792SMatthias Ringwald * @retval None 314*e8380792SMatthias Ringwald */ 315*e8380792SMatthias Ringwald void assert_failed(uint8_t *file, uint32_t line) 316*e8380792SMatthias Ringwald { 317*e8380792SMatthias Ringwald /* USER CODE BEGIN 6 */ 318*e8380792SMatthias Ringwald /* User can add his own implementation to report the file name and line number, 319*e8380792SMatthias Ringwald tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 320*e8380792SMatthias Ringwald /* USER CODE END 6 */ 321*e8380792SMatthias Ringwald } 322*e8380792SMatthias Ringwald #endif /* USE_FULL_ASSERT */ 323*e8380792SMatthias Ringwald 324*e8380792SMatthias Ringwald /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 325