main.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2024 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "cmsis_os.h"
  22. #include "lwip.h"
  23. /* Private includes ----------------------------------------------------------*/
  24. /* USER CODE BEGIN Includes */
  25. #include "mqtt_client.h"
  26. #include "uart_tasks.h"
  27. #include "mock_tasks.h"
  28. /* USER CODE END Includes */
  29. /* Private typedef -----------------------------------------------------------*/
  30. /* USER CODE BEGIN PTD */
  31. /* USER CODE END PTD */
  32. /* Private define ------------------------------------------------------------*/
  33. /* USER CODE BEGIN PD */
  34. /* USER CODE END PD */
  35. /* Private macro -------------------------------------------------------------*/
  36. /* USER CODE BEGIN PM */
  37. /* USER CODE END PM */
  38. /* Private variables ---------------------------------------------------------*/
  39. CRC_HandleTypeDef hcrc;
  40. RNG_HandleTypeDef hrng;
  41. UART_HandleTypeDef huart8;
  42. DMA_HandleTypeDef hdma_uart8_rx;
  43. DMA_HandleTypeDef hdma_uart8_tx;
  44. /* Definitions for defaultTask */
  45. osThreadId_t defaultTaskHandle;
  46. const osThreadAttr_t defaultTask_attributes = {
  47. .name = "defaultTask",
  48. .stack_size = 512 * 4,
  49. .priority = (osPriority_t) osPriorityNormal,
  50. };
  51. /* USER CODE BEGIN PV */
  52. extern uint32_t MilliTimer;
  53. /* USER CODE END PV */
  54. /* Private function prototypes -----------------------------------------------*/
  55. void SystemClock_Config(void);
  56. static void MPU_Config(void);
  57. static void MX_GPIO_Init(void);
  58. static void MX_DMA_Init(void);
  59. static void MX_UART8_Init(void);
  60. static void MX_CRC_Init(void);
  61. static void MX_RNG_Init(void);
  62. void StartDefaultTask(void *argument);
  63. /* USER CODE BEGIN PFP */
  64. /* USER CODE END PFP */
  65. /* Private user code ---------------------------------------------------------*/
  66. /* USER CODE BEGIN 0 */
  67. void dmaCallback( struct __DMA_HandleTypeDef * hdma)
  68. {
  69. printf("DMA callback\n");
  70. }
  71. /* USER CODE END 0 */
  72. /**
  73. * @brief The application entry point.
  74. * @retval int
  75. */
  76. int main(void)
  77. {
  78. /* USER CODE BEGIN 1 */
  79. /* USER CODE END 1 */
  80. /* MPU Configuration--------------------------------------------------------*/
  81. MPU_Config();
  82. /* Enable the CPU Cache */
  83. /* Enable I-Cache---------------------------------------------------------*/
  84. SCB_EnableICache();
  85. /* Enable D-Cache---------------------------------------------------------*/
  86. SCB_EnableDCache();
  87. /* MCU Configuration--------------------------------------------------------*/
  88. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  89. HAL_Init();
  90. /* USER CODE BEGIN Init */
  91. /* USER CODE END Init */
  92. /* Configure the system clock */
  93. SystemClock_Config();
  94. /* USER CODE BEGIN SysInit */
  95. /* USER CODE END SysInit */
  96. /* Initialize all configured peripherals */
  97. MX_GPIO_Init();
  98. MX_DMA_Init();
  99. MX_UART8_Init();
  100. MX_CRC_Init();
  101. MX_RNG_Init();
  102. /* USER CODE BEGIN 2 */
  103. // HAL_DMA_RegisterCallback(&hdma_uart8_rx, HAL_DMA_XFER_CPLT_CB_ID, dmaCallback);
  104. /* USER CODE END 2 */
  105. /* Init scheduler */
  106. osKernelInitialize();
  107. /* USER CODE BEGIN RTOS_MUTEX */
  108. /* add mutexes, ... */
  109. /* USER CODE END RTOS_MUTEX */
  110. /* USER CODE BEGIN RTOS_SEMAPHORES */
  111. /* add semaphores, ... */
  112. /* USER CODE END RTOS_SEMAPHORES */
  113. /* USER CODE BEGIN RTOS_TIMERS */
  114. /* start timers, add new ones, ... */
  115. /* USER CODE END RTOS_TIMERS */
  116. /* USER CODE BEGIN RTOS_QUEUES */
  117. /* add queues, ... */
  118. /* USER CODE END RTOS_QUEUES */
  119. /* Create the thread(s) */
  120. /* creation of defaultTask */
  121. defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
  122. /* USER CODE BEGIN RTOS_THREADS */
  123. /* add threads, ... */
  124. mqtt_cli_init();
  125. Uart8TasksInit();
  126. #ifdef USER_MOCKS
  127. MockMeasurmetsTaskInit();
  128. #else
  129. MeasurmentsReqSchedulerTaskInit();
  130. #endif
  131. /* USER CODE END RTOS_THREADS */
  132. /* USER CODE BEGIN RTOS_EVENTS */
  133. /* add events, ... */
  134. /* USER CODE END RTOS_EVENTS */
  135. /* Start scheduler */
  136. osKernelStart();
  137. /* We should never get here as control is now taken by the scheduler */
  138. /* Infinite loop */
  139. /* USER CODE BEGIN WHILE */
  140. while (1)
  141. {
  142. /* USER CODE END WHILE */
  143. /* USER CODE BEGIN 3 */
  144. }
  145. /* USER CODE END 3 */
  146. }
  147. /**
  148. * @brief System Clock Configuration
  149. * @retval None
  150. */
  151. void SystemClock_Config(void)
  152. {
  153. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  154. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  155. /** Supply configuration update enable
  156. */
  157. HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  158. /** Configure the main internal regulator output voltage
  159. */
  160. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  161. while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  162. /** Initializes the RCC Oscillators according to the specified parameters
  163. * in the RCC_OscInitTypeDef structure.
  164. */
  165. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;
  166. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  167. RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  168. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  169. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  170. RCC_OscInitStruct.PLL.PLLM = 5;
  171. RCC_OscInitStruct.PLL.PLLN = 160;
  172. RCC_OscInitStruct.PLL.PLLP = 2;
  173. RCC_OscInitStruct.PLL.PLLQ = 2;
  174. RCC_OscInitStruct.PLL.PLLR = 2;
  175. RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  176. RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  177. RCC_OscInitStruct.PLL.PLLFRACN = 0;
  178. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  179. {
  180. Error_Handler();
  181. }
  182. /** Initializes the CPU, AHB and APB buses clocks
  183. */
  184. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  185. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  186. |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  187. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  188. RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  189. RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  190. RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  191. RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  192. RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  193. RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  194. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  195. {
  196. Error_Handler();
  197. }
  198. }
  199. /**
  200. * @brief CRC Initialization Function
  201. * @param None
  202. * @retval None
  203. */
  204. static void MX_CRC_Init(void)
  205. {
  206. /* USER CODE BEGIN CRC_Init 0 */
  207. // hcrc.Init.GeneratingPolynomial = 0x1021;
  208. // hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
  209. /* USER CODE END CRC_Init 0 */
  210. /* USER CODE BEGIN CRC_Init 1 */
  211. /* USER CODE END CRC_Init 1 */
  212. hcrc.Instance = CRC;
  213. hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
  214. hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  215. hcrc.Init.GeneratingPolynomial = 4129;
  216. hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
  217. hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  218. hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  219. hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  220. if (HAL_CRC_Init(&hcrc) != HAL_OK)
  221. {
  222. Error_Handler();
  223. }
  224. /* USER CODE BEGIN CRC_Init 2 */
  225. /* USER CODE END CRC_Init 2 */
  226. }
  227. /**
  228. * @brief RNG Initialization Function
  229. * @param None
  230. * @retval None
  231. */
  232. static void MX_RNG_Init(void)
  233. {
  234. /* USER CODE BEGIN RNG_Init 0 */
  235. /* USER CODE END RNG_Init 0 */
  236. /* USER CODE BEGIN RNG_Init 1 */
  237. /* USER CODE END RNG_Init 1 */
  238. hrng.Instance = RNG;
  239. hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
  240. if (HAL_RNG_Init(&hrng) != HAL_OK)
  241. {
  242. Error_Handler();
  243. }
  244. /* USER CODE BEGIN RNG_Init 2 */
  245. /* USER CODE END RNG_Init 2 */
  246. }
  247. /**
  248. * @brief UART8 Initialization Function
  249. * @param None
  250. * @retval None
  251. */
  252. static void MX_UART8_Init(void)
  253. {
  254. /* USER CODE BEGIN UART8_Init 0 */
  255. /* USER CODE END UART8_Init 0 */
  256. /* USER CODE BEGIN UART8_Init 1 */
  257. /* USER CODE END UART8_Init 1 */
  258. huart8.Instance = UART8;
  259. huart8.Init.BaudRate = 115200;
  260. huart8.Init.WordLength = UART_WORDLENGTH_8B;
  261. huart8.Init.StopBits = UART_STOPBITS_1;
  262. huart8.Init.Parity = UART_PARITY_NONE;
  263. huart8.Init.Mode = UART_MODE_TX_RX;
  264. huart8.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  265. huart8.Init.OverSampling = UART_OVERSAMPLING_16;
  266. huart8.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  267. huart8.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  268. huart8.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  269. if (HAL_UART_Init(&huart8) != HAL_OK)
  270. {
  271. Error_Handler();
  272. }
  273. if (HAL_UARTEx_SetTxFifoThreshold(&huart8, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  274. {
  275. Error_Handler();
  276. }
  277. if (HAL_UARTEx_SetRxFifoThreshold(&huart8, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  278. {
  279. Error_Handler();
  280. }
  281. if (HAL_UARTEx_DisableFifoMode(&huart8) != HAL_OK)
  282. {
  283. Error_Handler();
  284. }
  285. /* USER CODE BEGIN UART8_Init 2 */
  286. /* USER CODE END UART8_Init 2 */
  287. }
  288. /**
  289. * Enable DMA controller clock
  290. */
  291. static void MX_DMA_Init(void)
  292. {
  293. /* DMA controller clock enable */
  294. __HAL_RCC_DMA2_CLK_ENABLE();
  295. /* DMA interrupt init */
  296. /* DMA2_Stream6_IRQn interrupt configuration */
  297. HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 5, 0);
  298. HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
  299. /* DMA2_Stream7_IRQn interrupt configuration */
  300. HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 5, 0);
  301. HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
  302. }
  303. /**
  304. * @brief GPIO Initialization Function
  305. * @param None
  306. * @retval None
  307. */
  308. static void MX_GPIO_Init(void)
  309. {
  310. /* USER CODE BEGIN MX_GPIO_Init_1 */
  311. GPIO_InitTypeDef GPIO_InitStruct = {0};
  312. /* USER CODE END MX_GPIO_Init_1 */
  313. /* GPIO Ports Clock Enable */
  314. __HAL_RCC_GPIOH_CLK_ENABLE();
  315. __HAL_RCC_GPIOC_CLK_ENABLE();
  316. __HAL_RCC_GPIOA_CLK_ENABLE();
  317. __HAL_RCC_GPIOB_CLK_ENABLE();
  318. __HAL_RCC_GPIOE_CLK_ENABLE();
  319. /* USER CODE BEGIN MX_GPIO_Init_2 */
  320. __HAL_RCC_GPIOE_CLK_ENABLE();
  321. GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
  322. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  323. GPIO_InitStruct.Pull = GPIO_PULLUP;
  324. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  325. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  326. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14, GPIO_PIN_RESET);
  327. HAL_Delay(100);
  328. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14, GPIO_PIN_SET);
  329. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_SET);
  330. /* USER CODE END MX_GPIO_Init_2 */
  331. }
  332. /* USER CODE BEGIN 4 */
  333. /* USER CODE END 4 */
  334. /* USER CODE BEGIN Header_StartDefaultTask */
  335. /**
  336. * @brief Function implementing the defaultTask thread.
  337. * @param argument: Not used
  338. * @retval None
  339. */
  340. /* USER CODE END Header_StartDefaultTask */
  341. void StartDefaultTask(void *argument)
  342. {
  343. /* init code for LWIP */
  344. MX_LWIP_Init();
  345. /* USER CODE BEGIN 5 */
  346. /* Infinite loop */
  347. for(;;)
  348. {
  349. osDelay(pdMS_TO_TICKS(1000));
  350. }
  351. /* USER CODE END 5 */
  352. }
  353. /* MPU Configuration */
  354. void MPU_Config(void)
  355. {
  356. MPU_Region_InitTypeDef MPU_InitStruct = {0};
  357. /* Disables the MPU */
  358. HAL_MPU_Disable();
  359. /** Initializes and configures the Region and the memory to be protected
  360. */
  361. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  362. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  363. MPU_InitStruct.BaseAddress = 0x0;
  364. MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  365. MPU_InitStruct.SubRegionDisable = 0x87;
  366. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  367. MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  368. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  369. MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  370. MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  371. MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  372. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  373. /** Initializes and configures the Region and the memory to be protected
  374. */
  375. MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  376. MPU_InitStruct.BaseAddress = 0x24020000;
  377. MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  378. MPU_InitStruct.SubRegionDisable = 0x0;
  379. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  380. MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  381. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  382. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  383. /** Initializes and configures the Region and the memory to be protected
  384. */
  385. MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  386. MPU_InitStruct.BaseAddress = 0x24040000;
  387. MPU_InitStruct.Size = MPU_REGION_SIZE_512B;
  388. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  389. MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  390. MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  391. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  392. /* Enables the MPU */
  393. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  394. }
  395. /**
  396. * @brief Period elapsed callback in non blocking mode
  397. * @note This function is called when TIM6 interrupt took place, inside
  398. * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  399. * a global variable "uwTick" used as application time base.
  400. * @param htim : TIM handle
  401. * @retval None
  402. */
  403. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  404. {
  405. /* USER CODE BEGIN Callback 0 */
  406. /* USER CODE END Callback 0 */
  407. if (htim->Instance == TIM6) {
  408. HAL_IncTick();
  409. }
  410. /* USER CODE BEGIN Callback 1 */
  411. if (htim->Instance == TIM6) {
  412. MilliTimer++;
  413. }
  414. /* USER CODE END Callback 1 */
  415. }
  416. /**
  417. * @brief This function is executed in case of error occurrence.
  418. * @retval None
  419. */
  420. void Error_Handler(void)
  421. {
  422. /* USER CODE BEGIN Error_Handler_Debug */
  423. /* User can add his own implementation to report the HAL error return state */
  424. __disable_irq();
  425. while (1)
  426. {
  427. }
  428. /* USER CODE END Error_Handler_Debug */
  429. }
  430. #ifdef USE_FULL_ASSERT
  431. /**
  432. * @brief Reports the name of the source file and the source line number
  433. * where the assert_param error has occurred.
  434. * @param file: pointer to the source file name
  435. * @param line: assert_param error line source number
  436. * @retval None
  437. */
  438. void assert_failed(uint8_t *file, uint32_t line)
  439. {
  440. /* USER CODE BEGIN 6 */
  441. /* User can add his own implementation to report the file name and line number,
  442. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  443. /* USER CODE END 6 */
  444. }
  445. #endif /* USE_FULL_ASSERT */