xref: /btstack/port/stm32-l073rz-nucleo-em9304/Src/main.c (revision e838079242074edcbcbb400962776e15fe6ca6cb)
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>&copy; 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