main.c 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061
  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. /* Private includes ----------------------------------------------------------*/
  23. /* USER CODE BEGIN Includes */
  24. #include "uart_tasks.h"
  25. #include "mock_tasks.h"
  26. #include "node-red-config.h"
  27. #include "adc_buffers.h"
  28. #include "meas_tasks.h"
  29. #include "peripherial.h"
  30. /* USER CODE END Includes */
  31. /* Private typedef -----------------------------------------------------------*/
  32. /* USER CODE BEGIN PTD */
  33. /* USER CODE END PTD */
  34. /* Private define ------------------------------------------------------------*/
  35. /* USER CODE BEGIN PD */
  36. /* USER CODE END PD */
  37. /* Private macro -------------------------------------------------------------*/
  38. /* USER CODE BEGIN PM */
  39. /* USER CODE END PM */
  40. /* Private variables ---------------------------------------------------------*/
  41. ADC_HandleTypeDef hadc1;
  42. ADC_HandleTypeDef hadc2;
  43. ADC_HandleTypeDef hadc3;
  44. DMA_HandleTypeDef hdma_adc1;
  45. DMA_HandleTypeDef hdma_adc2;
  46. DMA_HandleTypeDef hdma_adc3;
  47. CRC_HandleTypeDef hcrc;
  48. RNG_HandleTypeDef hrng;
  49. TIM_HandleTypeDef htim2;
  50. UART_HandleTypeDef huart8;
  51. UART_HandleTypeDef huart1;
  52. /* Definitions for defaultTask */
  53. osThreadId_t defaultTaskHandle;
  54. const osThreadAttr_t defaultTask_attributes = {
  55. .name = "defaultTask",
  56. .stack_size = 512 * 4,
  57. .priority = (osPriority_t) osPriorityNormal,
  58. };
  59. /* USER CODE BEGIN PV */
  60. /* USER CODE END PV */
  61. /* Private function prototypes -----------------------------------------------*/
  62. void SystemClock_Config(void);
  63. void PeriphCommonClock_Config(void);
  64. static void MPU_Config(void);
  65. static void MX_GPIO_Init(void);
  66. static void MX_DMA_Init(void);
  67. static void MX_RNG_Init(void);
  68. static void MX_USART1_UART_Init(void);
  69. static void MX_ADC1_Init(void);
  70. static void MX_UART8_Init(void);
  71. static void MX_CRC_Init(void);
  72. static void MX_ADC2_Init(void);
  73. static void MX_ADC3_Init(void);
  74. static void MX_TIM2_Init(void);
  75. void StartDefaultTask(void *argument);
  76. /* USER CODE BEGIN PFP */
  77. /* USER CODE END PFP */
  78. /* Private user code ---------------------------------------------------------*/
  79. /* USER CODE BEGIN 0 */
  80. /* USER CODE END 0 */
  81. /**
  82. * @brief The application entry point.
  83. * @retval int
  84. */
  85. int main(void)
  86. {
  87. /* USER CODE BEGIN 1 */
  88. /* USER CODE END 1 */
  89. /* MPU Configuration--------------------------------------------------------*/
  90. MPU_Config();
  91. /* Enable the CPU Cache */
  92. /* Enable I-Cache---------------------------------------------------------*/
  93. SCB_EnableICache();
  94. /* Enable D-Cache---------------------------------------------------------*/
  95. SCB_EnableDCache();
  96. /* MCU Configuration--------------------------------------------------------*/
  97. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  98. HAL_Init();
  99. /* USER CODE BEGIN Init */
  100. /* USER CODE END Init */
  101. /* Configure the system clock */
  102. SystemClock_Config();
  103. /* Configure the peripherals common clocks */
  104. PeriphCommonClock_Config();
  105. /* USER CODE BEGIN SysInit */
  106. /* USER CODE END SysInit */
  107. /* Initialize all configured peripherals */
  108. MX_GPIO_Init();
  109. MX_DMA_Init();
  110. MX_RNG_Init();
  111. MX_USART1_UART_Init();
  112. MX_ADC1_Init();
  113. MX_UART8_Init();
  114. MX_CRC_Init();
  115. MX_ADC2_Init();
  116. MX_ADC3_Init();
  117. MX_TIM2_Init();
  118. /* USER CODE BEGIN 2 */
  119. /* USER CODE END 2 */
  120. /* Init scheduler */
  121. osKernelInitialize();
  122. /* USER CODE BEGIN RTOS_MUTEX */
  123. /* add mutexes, ... */
  124. /* USER CODE END RTOS_MUTEX */
  125. /* USER CODE BEGIN RTOS_SEMAPHORES */
  126. /* add semaphores, ... */
  127. /* USER CODE END RTOS_SEMAPHORES */
  128. /* USER CODE BEGIN RTOS_TIMERS */
  129. /* start timers, add new ones, ... */
  130. /* USER CODE END RTOS_TIMERS */
  131. /* USER CODE BEGIN RTOS_QUEUES */
  132. /* add queues, ... */
  133. /* USER CODE END RTOS_QUEUES */
  134. /* Create the thread(s) */
  135. /* creation of defaultTask */
  136. defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
  137. /* USER CODE BEGIN RTOS_THREADS */
  138. /* add threads, ... */
  139. // Uart8TasksInit();
  140. UartTasksInit();
  141. #ifdef USER_MOCKS
  142. MockMeasurmetsTaskInit();
  143. #else
  144. MeasTasksInit();
  145. #endif
  146. /* USER CODE END RTOS_THREADS */
  147. /* USER CODE BEGIN RTOS_EVENTS */
  148. /* add events, ... */
  149. /* USER CODE END RTOS_EVENTS */
  150. /* Start scheduler */
  151. osKernelStart();
  152. /* We should never get here as control is now taken by the scheduler */
  153. /* Infinite loop */
  154. /* USER CODE BEGIN WHILE */
  155. while (1)
  156. {
  157. /* USER CODE END WHILE */
  158. /* USER CODE BEGIN 3 */
  159. }
  160. /* USER CODE END 3 */
  161. }
  162. /**
  163. * @brief System Clock Configuration
  164. * @retval None
  165. */
  166. void SystemClock_Config(void)
  167. {
  168. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  169. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  170. /** Supply configuration update enable
  171. */
  172. HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  173. /** Configure the main internal regulator output voltage
  174. */
  175. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  176. while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  177. /** Initializes the RCC Oscillators according to the specified parameters
  178. * in the RCC_OscInitTypeDef structure.
  179. */
  180. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;
  181. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  182. RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  183. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  184. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  185. RCC_OscInitStruct.PLL.PLLM = 5;
  186. RCC_OscInitStruct.PLL.PLLN = 160;
  187. RCC_OscInitStruct.PLL.PLLP = 2;
  188. RCC_OscInitStruct.PLL.PLLQ = 2;
  189. RCC_OscInitStruct.PLL.PLLR = 2;
  190. RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  191. RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  192. RCC_OscInitStruct.PLL.PLLFRACN = 0;
  193. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  194. {
  195. Error_Handler();
  196. }
  197. /** Initializes the CPU, AHB and APB buses clocks
  198. */
  199. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  200. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  201. |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  202. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  203. RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  204. RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  205. RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  206. RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  207. RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  208. RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  209. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  210. {
  211. Error_Handler();
  212. }
  213. }
  214. /**
  215. * @brief Peripherals Common Clock Configuration
  216. * @retval None
  217. */
  218. void PeriphCommonClock_Config(void)
  219. {
  220. RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  221. /** Initializes the peripherals clock
  222. */
  223. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  224. PeriphClkInitStruct.PLL2.PLL2M = 5;
  225. PeriphClkInitStruct.PLL2.PLL2N = 52;
  226. PeriphClkInitStruct.PLL2.PLL2P = 26;
  227. PeriphClkInitStruct.PLL2.PLL2Q = 2;
  228. PeriphClkInitStruct.PLL2.PLL2R = 2;
  229. PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
  230. PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
  231. PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
  232. PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
  233. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  234. {
  235. Error_Handler();
  236. }
  237. }
  238. /**
  239. * @brief ADC1 Initialization Function
  240. * @param None
  241. * @retval None
  242. */
  243. static void MX_ADC1_Init(void)
  244. {
  245. /* USER CODE BEGIN ADC1_Init 0 */
  246. /* USER CODE END ADC1_Init 0 */
  247. ADC_MultiModeTypeDef multimode = {0};
  248. ADC_ChannelConfTypeDef sConfig = {0};
  249. /* USER CODE BEGIN ADC1_Init 1 */
  250. /* USER CODE END ADC1_Init 1 */
  251. /** Common config
  252. */
  253. hadc1.Instance = ADC1;
  254. hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  255. hadc1.Init.Resolution = ADC_RESOLUTION_16B;
  256. hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  257. hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  258. hadc1.Init.LowPowerAutoWait = DISABLE;
  259. hadc1.Init.ContinuousConvMode = ENABLE;
  260. hadc1.Init.NbrOfConversion = 6;
  261. hadc1.Init.DiscontinuousConvMode = DISABLE;
  262. hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
  263. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  264. hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  265. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  266. hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  267. hadc1.Init.OversamplingMode = DISABLE;
  268. if (HAL_ADC_Init(&hadc1) != HAL_OK)
  269. {
  270. Error_Handler();
  271. }
  272. /** Configure the ADC multi-mode
  273. */
  274. multimode.Mode = ADC_MODE_INDEPENDENT;
  275. if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  276. {
  277. Error_Handler();
  278. }
  279. /** Configure Regular Channel
  280. */
  281. sConfig.Channel = ADC_CHANNEL_8;
  282. sConfig.Rank = ADC_REGULAR_RANK_1;
  283. sConfig.SamplingTime = ADC_SAMPLETIME_387CYCLES_5;
  284. sConfig.SingleDiff = ADC_SINGLE_ENDED;
  285. sConfig.OffsetNumber = ADC_OFFSET_NONE;
  286. sConfig.Offset = 0;
  287. sConfig.OffsetSignedSaturation = DISABLE;
  288. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  289. {
  290. Error_Handler();
  291. }
  292. /** Configure Regular Channel
  293. */
  294. sConfig.Channel = ADC_CHANNEL_7;
  295. sConfig.Rank = ADC_REGULAR_RANK_2;
  296. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  297. {
  298. Error_Handler();
  299. }
  300. /** Configure Regular Channel
  301. */
  302. sConfig.Channel = ADC_CHANNEL_9;
  303. sConfig.Rank = ADC_REGULAR_RANK_3;
  304. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  305. {
  306. Error_Handler();
  307. }
  308. /** Configure Regular Channel
  309. */
  310. sConfig.Channel = ADC_CHANNEL_16;
  311. sConfig.Rank = ADC_REGULAR_RANK_4;
  312. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  313. {
  314. Error_Handler();
  315. }
  316. /** Configure Regular Channel
  317. */
  318. sConfig.Channel = ADC_CHANNEL_17;
  319. sConfig.Rank = ADC_REGULAR_RANK_5;
  320. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  321. {
  322. Error_Handler();
  323. }
  324. /** Configure Regular Channel
  325. */
  326. sConfig.Channel = ADC_CHANNEL_14;
  327. sConfig.Rank = ADC_REGULAR_RANK_6;
  328. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  329. {
  330. Error_Handler();
  331. }
  332. /* USER CODE BEGIN ADC1_Init 2 */
  333. if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
  334. {
  335. Error_Handler();
  336. }
  337. /* USER CODE END ADC1_Init 2 */
  338. }
  339. /**
  340. * @brief ADC2 Initialization Function
  341. * @param None
  342. * @retval None
  343. */
  344. static void MX_ADC2_Init(void)
  345. {
  346. /* USER CODE BEGIN ADC2_Init 0 */
  347. /* USER CODE END ADC2_Init 0 */
  348. ADC_ChannelConfTypeDef sConfig = {0};
  349. /* USER CODE BEGIN ADC2_Init 1 */
  350. /* USER CODE END ADC2_Init 1 */
  351. /** Common config
  352. */
  353. hadc2.Instance = ADC2;
  354. hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  355. hadc2.Init.Resolution = ADC_RESOLUTION_16B;
  356. hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
  357. hadc2.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  358. hadc2.Init.LowPowerAutoWait = DISABLE;
  359. hadc2.Init.ContinuousConvMode = ENABLE;
  360. hadc2.Init.NbrOfConversion = 3;
  361. hadc2.Init.DiscontinuousConvMode = DISABLE;
  362. hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
  363. hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  364. hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  365. hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  366. hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  367. hadc2.Init.OversamplingMode = DISABLE;
  368. if (HAL_ADC_Init(&hadc2) != HAL_OK)
  369. {
  370. Error_Handler();
  371. }
  372. /** Configure Regular Channel
  373. */
  374. sConfig.Channel = ADC_CHANNEL_3;
  375. sConfig.Rank = ADC_REGULAR_RANK_1;
  376. sConfig.SamplingTime = ADC_SAMPLETIME_387CYCLES_5;
  377. sConfig.SingleDiff = ADC_SINGLE_ENDED;
  378. sConfig.OffsetNumber = ADC_OFFSET_NONE;
  379. sConfig.Offset = 0;
  380. sConfig.OffsetSignedSaturation = DISABLE;
  381. if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  382. {
  383. Error_Handler();
  384. }
  385. /** Configure Regular Channel
  386. */
  387. sConfig.Channel = ADC_CHANNEL_4;
  388. sConfig.Rank = ADC_REGULAR_RANK_2;
  389. if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  390. {
  391. Error_Handler();
  392. }
  393. /** Configure Regular Channel
  394. */
  395. sConfig.Channel = ADC_CHANNEL_5;
  396. sConfig.Rank = ADC_REGULAR_RANK_3;
  397. if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  398. {
  399. Error_Handler();
  400. }
  401. /* USER CODE BEGIN ADC2_Init 2 */
  402. if (HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
  403. {
  404. Error_Handler();
  405. }
  406. /* USER CODE END ADC2_Init 2 */
  407. }
  408. /**
  409. * @brief ADC3 Initialization Function
  410. * @param None
  411. * @retval None
  412. */
  413. static void MX_ADC3_Init(void)
  414. {
  415. /* USER CODE BEGIN ADC3_Init 0 */
  416. /* USER CODE END ADC3_Init 0 */
  417. ADC_ChannelConfTypeDef sConfig = {0};
  418. /* USER CODE BEGIN ADC3_Init 1 */
  419. /* USER CODE END ADC3_Init 1 */
  420. /** Common config
  421. */
  422. hadc3.Instance = ADC3;
  423. hadc3.Init.Resolution = ADC_RESOLUTION_16B;
  424. hadc3.Init.ScanConvMode = ADC_SCAN_ENABLE;
  425. hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  426. hadc3.Init.LowPowerAutoWait = DISABLE;
  427. hadc3.Init.ContinuousConvMode = ENABLE;
  428. hadc3.Init.NbrOfConversion = 5;
  429. hadc3.Init.DiscontinuousConvMode = DISABLE;
  430. hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
  431. hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  432. hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  433. hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  434. hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  435. hadc3.Init.OversamplingMode = DISABLE;
  436. if (HAL_ADC_Init(&hadc3) != HAL_OK)
  437. {
  438. Error_Handler();
  439. }
  440. /** Configure Regular Channel
  441. */
  442. sConfig.Channel = ADC_CHANNEL_0;
  443. sConfig.Rank = ADC_REGULAR_RANK_1;
  444. sConfig.SamplingTime = ADC_SAMPLETIME_387CYCLES_5;
  445. sConfig.SingleDiff = ADC_SINGLE_ENDED;
  446. sConfig.OffsetNumber = ADC_OFFSET_NONE;
  447. sConfig.Offset = 0;
  448. sConfig.OffsetSignedSaturation = DISABLE;
  449. if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  450. {
  451. Error_Handler();
  452. }
  453. /** Configure Regular Channel
  454. */
  455. sConfig.Channel = ADC_CHANNEL_1;
  456. sConfig.Rank = ADC_REGULAR_RANK_2;
  457. if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  458. {
  459. Error_Handler();
  460. }
  461. /** Configure Regular Channel
  462. */
  463. sConfig.Channel = ADC_CHANNEL_10;
  464. sConfig.Rank = ADC_REGULAR_RANK_3;
  465. if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  466. {
  467. Error_Handler();
  468. }
  469. /** Configure Regular Channel
  470. */
  471. sConfig.Channel = ADC_CHANNEL_11;
  472. sConfig.Rank = ADC_REGULAR_RANK_4;
  473. if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  474. {
  475. Error_Handler();
  476. }
  477. /** Configure Regular Channel
  478. */
  479. sConfig.Channel = ADC_CHANNEL_VREFINT;
  480. sConfig.Rank = ADC_REGULAR_RANK_5;
  481. if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  482. {
  483. Error_Handler();
  484. }
  485. /* USER CODE BEGIN ADC3_Init 2 */
  486. if (HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
  487. {
  488. Error_Handler();
  489. }
  490. /* USER CODE END ADC3_Init 2 */
  491. }
  492. /**
  493. * @brief CRC Initialization Function
  494. * @param None
  495. * @retval None
  496. */
  497. static void MX_CRC_Init(void)
  498. {
  499. /* USER CODE BEGIN CRC_Init 0 */
  500. /* USER CODE END CRC_Init 0 */
  501. /* USER CODE BEGIN CRC_Init 1 */
  502. /* USER CODE END CRC_Init 1 */
  503. hcrc.Instance = CRC;
  504. hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
  505. hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  506. hcrc.Init.GeneratingPolynomial = 4129;
  507. hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
  508. hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  509. hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  510. hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  511. if (HAL_CRC_Init(&hcrc) != HAL_OK)
  512. {
  513. Error_Handler();
  514. }
  515. /* USER CODE BEGIN CRC_Init 2 */
  516. /* USER CODE END CRC_Init 2 */
  517. }
  518. /**
  519. * @brief RNG Initialization Function
  520. * @param None
  521. * @retval None
  522. */
  523. static void MX_RNG_Init(void)
  524. {
  525. /* USER CODE BEGIN RNG_Init 0 */
  526. /* USER CODE END RNG_Init 0 */
  527. /* USER CODE BEGIN RNG_Init 1 */
  528. /* USER CODE END RNG_Init 1 */
  529. hrng.Instance = RNG;
  530. hrng.Init.ClockErrorDetection = RNG_CED_ENABLE;
  531. if (HAL_RNG_Init(&hrng) != HAL_OK)
  532. {
  533. Error_Handler();
  534. }
  535. /* USER CODE BEGIN RNG_Init 2 */
  536. /* USER CODE END RNG_Init 2 */
  537. }
  538. /**
  539. * @brief TIM2 Initialization Function
  540. * @param None
  541. * @retval None
  542. */
  543. static void MX_TIM2_Init(void)
  544. {
  545. /* USER CODE BEGIN TIM2_Init 0 */
  546. /* USER CODE END TIM2_Init 0 */
  547. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  548. TIM_MasterConfigTypeDef sMasterConfig = {0};
  549. /* USER CODE BEGIN TIM2_Init 1 */
  550. /* USER CODE END TIM2_Init 1 */
  551. htim2.Instance = TIM2;
  552. htim2.Init.Prescaler = 0;
  553. htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  554. htim2.Init.Period = 9999999;
  555. htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
  556. htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  557. if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  558. {
  559. Error_Handler();
  560. }
  561. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  562. if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  563. {
  564. Error_Handler();
  565. }
  566. sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  567. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  568. if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  569. {
  570. Error_Handler();
  571. }
  572. /* USER CODE BEGIN TIM2_Init 2 */
  573. /* USER CODE END TIM2_Init 2 */
  574. }
  575. /**
  576. * @brief UART8 Initialization Function
  577. * @param None
  578. * @retval None
  579. */
  580. static void MX_UART8_Init(void)
  581. {
  582. /* USER CODE BEGIN UART8_Init 0 */
  583. /* USER CODE END UART8_Init 0 */
  584. /* USER CODE BEGIN UART8_Init 1 */
  585. /* USER CODE END UART8_Init 1 */
  586. huart8.Instance = UART8;
  587. huart8.Init.BaudRate = 115200;
  588. huart8.Init.WordLength = UART_WORDLENGTH_8B;
  589. huart8.Init.StopBits = UART_STOPBITS_1;
  590. huart8.Init.Parity = UART_PARITY_NONE;
  591. huart8.Init.Mode = UART_MODE_TX_RX;
  592. huart8.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  593. huart8.Init.OverSampling = UART_OVERSAMPLING_16;
  594. huart8.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  595. huart8.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  596. huart8.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  597. if (HAL_UART_Init(&huart8) != HAL_OK)
  598. {
  599. Error_Handler();
  600. }
  601. if (HAL_UARTEx_SetTxFifoThreshold(&huart8, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  602. {
  603. Error_Handler();
  604. }
  605. if (HAL_UARTEx_SetRxFifoThreshold(&huart8, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  606. {
  607. Error_Handler();
  608. }
  609. if (HAL_UARTEx_DisableFifoMode(&huart8) != HAL_OK)
  610. {
  611. Error_Handler();
  612. }
  613. /* USER CODE BEGIN UART8_Init 2 */
  614. /* USER CODE END UART8_Init 2 */
  615. }
  616. /**
  617. * @brief USART1 Initialization Function
  618. * @param None
  619. * @retval None
  620. */
  621. static void MX_USART1_UART_Init(void)
  622. {
  623. /* USER CODE BEGIN USART1_Init 0 */
  624. /* USER CODE END USART1_Init 0 */
  625. /* USER CODE BEGIN USART1_Init 1 */
  626. /* USER CODE END USART1_Init 1 */
  627. huart1.Instance = USART1;
  628. huart1.Init.BaudRate = 115200;
  629. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  630. huart1.Init.StopBits = UART_STOPBITS_1;
  631. huart1.Init.Parity = UART_PARITY_NONE;
  632. huart1.Init.Mode = UART_MODE_TX_RX;
  633. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  634. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  635. huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  636. huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  637. huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
  638. huart1.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  639. if (HAL_UART_Init(&huart1) != HAL_OK)
  640. {
  641. Error_Handler();
  642. }
  643. if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  644. {
  645. Error_Handler();
  646. }
  647. if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  648. {
  649. Error_Handler();
  650. }
  651. if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  652. {
  653. Error_Handler();
  654. }
  655. /* USER CODE BEGIN USART1_Init 2 */
  656. /* USER CODE END USART1_Init 2 */
  657. }
  658. /**
  659. * Enable DMA controller clock
  660. */
  661. static void MX_DMA_Init(void)
  662. {
  663. /* DMA controller clock enable */
  664. __HAL_RCC_DMA1_CLK_ENABLE();
  665. /* DMA interrupt init */
  666. /* DMA1_Stream0_IRQn interrupt configuration */
  667. HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 5, 0);
  668. HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
  669. /* DMA1_Stream1_IRQn interrupt configuration */
  670. HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0);
  671. HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  672. /* DMA1_Stream2_IRQn interrupt configuration */
  673. HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 5, 0);
  674. HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
  675. }
  676. /**
  677. * @brief GPIO Initialization Function
  678. * @param None
  679. * @retval None
  680. */
  681. static void MX_GPIO_Init(void)
  682. {
  683. GPIO_InitTypeDef GPIO_InitStruct = {0};
  684. /* USER CODE BEGIN MX_GPIO_Init_1 */
  685. /* USER CODE END MX_GPIO_Init_1 */
  686. /* GPIO Ports Clock Enable */
  687. __HAL_RCC_GPIOH_CLK_ENABLE();
  688. __HAL_RCC_GPIOC_CLK_ENABLE();
  689. __HAL_RCC_GPIOA_CLK_ENABLE();
  690. __HAL_RCC_GPIOB_CLK_ENABLE();
  691. __HAL_RCC_GPIOE_CLK_ENABLE();
  692. __HAL_RCC_GPIOD_CLK_ENABLE();
  693. /*Configure GPIO pin Output Level */
  694. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
  695. |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
  696. /*Configure GPIO pin Output Level */
  697. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
  698. /*Configure GPIO pins : PE7 PE8 PE9 PE10
  699. PE13 PE14 PE15 */
  700. GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
  701. |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  702. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  703. GPIO_InitStruct.Pull = GPIO_NOPULL;
  704. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  705. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  706. /*Configure GPIO pin : PD3 */
  707. GPIO_InitStruct.Pin = GPIO_PIN_3;
  708. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  709. GPIO_InitStruct.Pull = GPIO_NOPULL;
  710. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  711. /*Configure GPIO pins : PD4 PD5 PD6 PD7 */
  712. GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  713. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  714. GPIO_InitStruct.Pull = GPIO_NOPULL;
  715. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  716. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  717. /* USER CODE BEGIN MX_GPIO_Init_2 */
  718. /* USER CODE END MX_GPIO_Init_2 */
  719. }
  720. /* USER CODE BEGIN 4 */
  721. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
  722. {
  723. if(hadc->Instance == ADC1)
  724. {
  725. DbgLEDToggle(DBG_LED4);
  726. SCB_InvalidateDCache_by_Addr((uint32_t*)(((uint32_t)adc1Data.adcDataBuffer) & ~(uint32_t)0x1F), __SCB_DCACHE_LINE_SIZE);
  727. if(adc1MeasDataQueue != NULL)
  728. {
  729. osMessageQueuePut(adc1MeasDataQueue, &adc1Data, 0, 0);
  730. }
  731. if(HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1Data.adcDataBuffer, ADC1LastData) != HAL_OK)
  732. {
  733. Error_Handler();
  734. }
  735. }
  736. if(hadc->Instance == ADC2)
  737. {
  738. SCB_InvalidateDCache_by_Addr((uint32_t*)(((uint32_t)adc2Data.adcDataBuffer) & ~(uint32_t)0x1F), __SCB_DCACHE_LINE_SIZE);
  739. if(adc2MeasDataQueue != NULL)
  740. {
  741. osMessageQueuePut(adc2MeasDataQueue, &adc2Data, 0, 0);
  742. }
  743. if(HAL_ADC_Start_DMA(&hadc2, (uint32_t *)adc2Data.adcDataBuffer, ADC2LastData) != HAL_OK)
  744. {
  745. Error_Handler();
  746. }
  747. }
  748. if(hadc->Instance == ADC3)
  749. {
  750. SCB_InvalidateDCache_by_Addr((uint32_t*)(((uint32_t)adc3Data.adcDataBuffer) & ~(uint32_t)0x1F), __SCB_DCACHE_LINE_SIZE);
  751. if(adc3MeasDataQueue != NULL)
  752. {
  753. osMessageQueuePut(adc3MeasDataQueue, &adc3Data, 0, 0);
  754. }
  755. if(HAL_ADC_Start_DMA(&hadc3, (uint32_t *)adc3Data.adcDataBuffer, ADC3LastData) != HAL_OK)
  756. {
  757. Error_Handler();
  758. }
  759. }
  760. }
  761. /* USER CODE END 4 */
  762. /* USER CODE BEGIN Header_StartDefaultTask */
  763. /**
  764. * @brief Function implementing the defaultTask thread.
  765. * @param argument: Not used
  766. * @retval None
  767. */
  768. /* USER CODE END Header_StartDefaultTask */
  769. void StartDefaultTask(void *argument)
  770. {
  771. /* USER CODE BEGIN 5 */
  772. SelectCurrentSensorGain(CurrentSensorL1, csGain3);
  773. SelectCurrentSensorGain(CurrentSensorL2, csGain3);
  774. SelectCurrentSensorGain(CurrentSensorL3, csGain3);
  775. EnableCurrentSensors();
  776. osDelay(pdMS_TO_TICKS(1000));
  777. if(HAL_TIM_Base_Start(&htim2) != HAL_OK)
  778. {
  779. Error_Handler();
  780. }
  781. // if(HAL_ADC_Start_IT(&hadc1) != HAL_OK)
  782. // {
  783. // Error_Handler();
  784. // }
  785. if(HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1Data.adcDataBuffer, ADC1LastData) != HAL_OK)
  786. {
  787. Error_Handler();
  788. }
  789. if(HAL_ADC_Start_DMA(&hadc2, (uint32_t *)adc2Data.adcDataBuffer, ADC2LastData) != HAL_OK)
  790. {
  791. Error_Handler();
  792. }
  793. if(HAL_ADC_Start_DMA(&hadc3, (uint32_t *)adc3Data.adcDataBuffer, ADC3LastData) != HAL_OK)
  794. {
  795. Error_Handler();
  796. }
  797. /* Infinite loop */
  798. for(;;)
  799. {
  800. osDelay(pdMS_TO_TICKS(1000));
  801. }
  802. /* USER CODE END 5 */
  803. }
  804. /* MPU Configuration */
  805. void MPU_Config(void)
  806. {
  807. MPU_Region_InitTypeDef MPU_InitStruct = {0};
  808. /* Disables the MPU */
  809. HAL_MPU_Disable();
  810. /** Initializes and configures the Region and the memory to be protected
  811. */
  812. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  813. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  814. MPU_InitStruct.BaseAddress = 0x0;
  815. MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  816. MPU_InitStruct.SubRegionDisable = 0x87;
  817. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  818. MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  819. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  820. MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  821. MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  822. MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  823. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  824. /** Initializes and configures the Region and the memory to be protected
  825. */
  826. MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  827. MPU_InitStruct.BaseAddress = 0x24020000;
  828. MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  829. MPU_InitStruct.SubRegionDisable = 0x0;
  830. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  831. MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  832. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  833. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  834. /** Initializes and configures the Region and the memory to be protected
  835. */
  836. MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  837. MPU_InitStruct.BaseAddress = 0x24040000;
  838. MPU_InitStruct.Size = MPU_REGION_SIZE_512B;
  839. MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  840. MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  841. MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  842. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  843. /* Enables the MPU */
  844. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  845. }
  846. /**
  847. * @brief Period elapsed callback in non blocking mode
  848. * @note This function is called when TIM6 interrupt took place, inside
  849. * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  850. * a global variable "uwTick" used as application time base.
  851. * @param htim : TIM handle
  852. * @retval None
  853. */
  854. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  855. {
  856. /* USER CODE BEGIN Callback 0 */
  857. /* USER CODE END Callback 0 */
  858. if (htim->Instance == TIM6) {
  859. HAL_IncTick();
  860. }
  861. /* USER CODE BEGIN Callback 1 */
  862. else if (htim->Instance == TIM2)
  863. {
  864. // HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_4);
  865. // HAL_ADC_Start_IT(&hadc1);
  866. }
  867. /* USER CODE END Callback 1 */
  868. }
  869. /**
  870. * @brief This function is executed in case of error occurrence.
  871. * @retval None
  872. */
  873. void Error_Handler(void)
  874. {
  875. /* USER CODE BEGIN Error_Handler_Debug */
  876. /* User can add his own implementation to report the HAL error return state */
  877. __disable_irq();
  878. while (1)
  879. {
  880. }
  881. /* USER CODE END Error_Handler_Debug */
  882. }
  883. #ifdef USE_FULL_ASSERT
  884. /**
  885. * @brief Reports the name of the source file and the source line number
  886. * where the assert_param error has occurred.
  887. * @param file: pointer to the source file name
  888. * @param line: assert_param error line source number
  889. * @retval None
  890. */
  891. void assert_failed(uint8_t *file, uint32_t line)
  892. {
  893. /* USER CODE BEGIN 6 */
  894. /* User can add his own implementation to report the file name and line number,
  895. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  896. /* USER CODE END 6 */
  897. }
  898. #endif /* USE_FULL_ASSERT */