main.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2023 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. /* Private includes ----------------------------------------------------------*/
  22. /* USER CODE BEGIN Includes */
  23. #include "nbus_app.h"
  24. #include "memory_ec20.h"
  25. #if MODULE == MODULE_FSR
  26. #include "app_adc.h"
  27. #endif
  28. #if MODULE == MODULE_DUMMY
  29. #include "app_dummy.h"
  30. #endif
  31. #if MODULE == MODULE_IMU
  32. #include <app_imu_dmp.h>
  33. #endif
  34. #if MODULE == MODULE_DMP
  35. #include <app_imu_dmp.h>
  36. #endif
  37. #include "app_interface.h"
  38. /* USER CODE END Includes */
  39. /* Private typedef -----------------------------------------------------------*/
  40. /* USER CODE BEGIN PTD */
  41. /* USER CODE END PTD */
  42. /* Private define ------------------------------------------------------------*/
  43. /* USER CODE BEGIN PD */
  44. /* USER CODE END PD */
  45. /* Private macro -------------------------------------------------------------*/
  46. /* USER CODE BEGIN PM */
  47. /* USER CODE END PM */
  48. /* Private variables ---------------------------------------------------------*/
  49. ADC_HandleTypeDef hadc;
  50. DMA_HandleTypeDef hdma_adc;
  51. SPI_HandleTypeDef hspi1;
  52. TIM_HandleTypeDef htim21;
  53. UART_HandleTypeDef huart1;
  54. DMA_HandleTypeDef hdma_usart1_rx;
  55. DMA_HandleTypeDef hdma_usart1_tx;
  56. /* USER CODE BEGIN PV */
  57. /* USER CODE END PV */
  58. /* Private function prototypes -----------------------------------------------*/
  59. void SystemClock_Config(void);
  60. static void MX_GPIO_Init(void);
  61. static void MX_DMA_Init(void);
  62. static void MX_TIM21_Init(void);
  63. static void MX_ADC_Init(void);
  64. static void MX_SPI1_Init(void);
  65. static void MX_USART1_UART_Init(void);
  66. /* USER CODE BEGIN PFP */
  67. /* USER CODE END PFP */
  68. /* Private user code ---------------------------------------------------------*/
  69. /* USER CODE BEGIN 0 */
  70. typedef struct {
  71. uint8_t payload[PAYLOAD_SIZE];
  72. uint8_t length;
  73. } rx_packet_t;
  74. #define MAX_SYSTICK 0xFFFFFFFF
  75. uint8_t rx_ring_buffer[BUFF_SIZE];
  76. uint8_t *dataUART; // pointee for rx_buffer
  77. rx_packet_t packet_fifo[FIFO_DEPTH];
  78. volatile uint8_t fifo_head = 0; // index pre zápis (z UARTu)
  79. volatile uint8_t fifo_tail = 0; // index pre čítanie (do nBus)
  80. volatile uint8_t fifo_count = 0; // počet nespracovaných paketov vo FIFO
  81. // UART DMA related variables
  82. volatile uint32_t uart_timeout = MAX_SYSTICK;
  83. volatile uint16_t rx_read_pos = 0; // DAM UART CIRCULAR - tail
  84. volatile uint8_t msg_len = 0;
  85. volatile uint8_t msg_idx = 0;
  86. ProtocolState state = STATE_WAIT_LEN;
  87. #if MODULE == MODULE_IMU || MODULE == MODULE_DMP
  88. volatile uint8_t icm_data_ready = 0;
  89. #endif
  90. inline void uart_send(uint8_t *data, int n)
  91. {
  92. #if USE_USART_DMA_TX == 1
  93. HAL_UART_Transmit_DMA(&huart1, data, n);
  94. #else
  95. HAL_UART_Transmit(&huart1, data, n, 10);
  96. #endif
  97. }
  98. inline void uart_receive(uint8_t *dataNBUS, int n)
  99. {
  100. dataUART = dataNBUS;
  101. rx_ring_buffer[0] = 0;
  102. uart_timeout = HAL_GetTick();
  103. HAL_UART_Receive_DMA(&huart1, rx_ring_buffer, n);
  104. }
  105. inline void led_on(){
  106. HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
  107. }
  108. inline void led_off(){
  109. HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
  110. }
  111. inline void led_toggle(){
  112. HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
  113. }
  114. inline void app_delay(uint8_t ms){
  115. HAL_Delay(ms);
  116. }
  117. static uint8_t Parse_Protocol_Byte(uint8_t b) {
  118. uint8_t packet_finished = 0;
  119. // Timeout reset logic
  120. if (state != STATE_WAIT_LEN) {
  121. if ((HAL_GetTick() - uart_timeout) > NBUS_UART_FRAME_TIMEOUT){
  122. state = STATE_WAIT_LEN;
  123. msg_len = 0;
  124. msg_idx = 0;
  125. }
  126. }
  127. switch (state) {
  128. case STATE_WAIT_LEN:
  129. // Validácia dĺžky
  130. if (b > 3 && b < PAYLOAD_SIZE) {
  131. msg_len = b;
  132. msg_idx = 0;
  133. state = STATE_PAYLOAD;
  134. uart_timeout = HAL_GetTick();
  135. }
  136. break;
  137. case STATE_PAYLOAD:
  138. // Zapisujeme do hlavy FIFO namiesto priamo do dataUART
  139. packet_fifo[fifo_head].payload[msg_idx++] = b;
  140. uart_timeout = HAL_GetTick();
  141. //led_toggle();
  142. //HAL_GPIO_TogglePin(SPI_SS_GPIO_Port, SPI_SS_Pin);
  143. if (msg_idx >= msg_len) { // Koniec paketu
  144. packet_fifo[fifo_head].length = msg_len;
  145. // Posunieme hlavu FIFO, ak máme miesto
  146. if (fifo_count < FIFO_DEPTH) {
  147. fifo_head = (fifo_head + 1) % FIFO_DEPTH;
  148. fifo_count++;
  149. } else {
  150. // FIFO je plné - tu by sa dal riešiť error handling
  151. // (momentálne sa nový paket zahodí, resp. prepíše aktuálny head)
  152. }
  153. state = STATE_WAIT_LEN;
  154. packet_finished = 1;
  155. }
  156. break;
  157. }
  158. return packet_finished;
  159. }
  160. static void Process_UART_RingBuffer(void) {
  161. uint16_t rx_dma_pos = BUFF_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx);
  162. // Spracuj všetky dostupné bajty z DMA a nalož pakety do FIFO
  163. while (rx_read_pos != rx_dma_pos) {
  164. uint8_t byte = rx_ring_buffer[rx_read_pos];
  165. rx_read_pos++;
  166. if (rx_read_pos >= BUFF_SIZE) {
  167. rx_read_pos = 0;
  168. }
  169. // Funkcia už automaticky rieši zápis do FIFO
  170. Parse_Protocol_Byte(byte);
  171. }
  172. }
  173. uint8_t nbus_fifo_pull(uint8_t *dest_buffer, uint8_t *out_len) {
  174. if (fifo_count == 0) {
  175. return 0; // FIFO je prázdne
  176. }
  177. // Prekopírujeme dáta a dĺžku
  178. *out_len = packet_fifo[fifo_tail].length;
  179. memcpy(dest_buffer, packet_fifo[fifo_tail].payload, *out_len);
  180. // Posunieme tail a znížime počítadlo nespracovaných paketov
  181. fifo_tail = (fifo_tail + 1) % FIFO_DEPTH;
  182. fifo_count--;
  183. return 1;
  184. }
  185. static inline uint8_t loop_callback(nBusStateCallbackType_t state_check) {
  186. // treba kontrolovat kazdy stav (state_check) zvlast. Moznost doplnit dalsie kontroly
  187. if (state_check == CallbackType_SENSOR) {
  188. #if MODULE == MODULE_IMU || MODULE == MODULE_DMP
  189. if(icm_data_ready == 1){
  190. icm_data_ready = 0;
  191. return 1; // TEMPORARY ALWAYS ENABLE STATE. interrupt from external sensor: data ready
  192. }
  193. #endif
  194. return 0;
  195. }
  196. if (state_check == CallbackType_UART) {
  197. Process_UART_RingBuffer();
  198. }
  199. return 0;
  200. }
  201. // Application callbacks
  202. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart){
  203. uart_timeout = MAX_SYSTICK;
  204. HAL_UART_Receive_DMA(huart, rx_ring_buffer, BUFF_SIZE);
  205. }
  206. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  207. #if MODULE == MODULE_IMU || MODULE == MODULE_DMP
  208. if (GPIO_Pin == SPI_INT_Pin) {
  209. icm_data_ready = 1;
  210. }
  211. #endif
  212. }
  213. /* USER CODE END 0 */
  214. /**
  215. * @brief The application entry point.
  216. * @retval int
  217. */
  218. int main(void)
  219. {
  220. /* USER CODE BEGIN 1 */
  221. /* USER CODE END 1 */
  222. /* MCU Configuration--------------------------------------------------------*/
  223. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  224. HAL_Init();
  225. /* USER CODE BEGIN Init */
  226. /* USER CODE END Init */
  227. /* Configure the system clock */
  228. SystemClock_Config();
  229. /* USER CODE BEGIN SysInit */
  230. /* USER CODE END SysInit */
  231. /* Initialize all configured peripherals */
  232. MX_GPIO_Init();
  233. MX_DMA_Init();
  234. MX_TIM21_Init();
  235. MX_SPI1_Init();
  236. MX_USART1_UART_Init();
  237. /* USER CODE BEGIN 2 */
  238. #ifdef MODULE_INIT_IP_ADC
  239. MX_ADC_Init();
  240. #endif
  241. #ifdef MODULE_INIT_IP_SPI
  242. MX_SPI1_Init();
  243. #endif
  244. #if MODULE_MASTER == 1
  245. MX_RTC_Init();
  246. #endif
  247. nBusPlatformInterface_t hw_platform = {
  248. uart_receive,
  249. uart_send,
  250. led_on,
  251. led_off,
  252. led_toggle,
  253. app_delay,
  254. loop_callback,
  255. nbus_fifo_pull,
  256. };
  257. #if MODULE_MASTER == 1
  258. periph.rtc = &hrtc;
  259. #endif
  260. #if MODULE == MODULE_DUMMY
  261. nbus_init(getDummyDriver(), &hw_platform);
  262. nbus_init_app(NULL, NULL);
  263. #endif
  264. #if MODULE == MODULE_DMP
  265. nbus_init(getImuDriver(), &hw_platform);
  266. nbus_init_app(NULL, NULL);
  267. #endif
  268. #if MODULE == MODULE_FSR
  269. nbus_init(getMcuAdcDriver(), &hw_platform);
  270. nbus_init_app(&hadc, NULL);
  271. #endif
  272. #if MODULE == MODULE_IMU
  273. icm20948_Config config;
  274. McuPin_typeDef pinCS;
  275. pinCS.pin = SPI_SS_Pin;
  276. pinCS.port = SPI_SS_GPIO_Port;
  277. config.pinCS = &pinCS;
  278. config.gyro.low_pass_filter = GYRO_lpf_196_6Hz;
  279. config.gyro.sample_rate = GYRO_samplerate_281_3Hz;
  280. config.accel.low_pass_filter = ACCEL_lpf_246Hz;
  281. config.accel.sample_rate = ACCEL_samplerate_281_3Hz;
  282. config.int_source = interrupt_RAW_DATA_0_RDY_EN;
  283. config.mag.mode = mag_mode_power_down;
  284. nbus_init(getImuDriver(), &hw_platform);
  285. nbus_init_app(NULL, NULL);
  286. #endif
  287. nBus_MemoryDriver memory_ec20 = {
  288. DS28EC20_init,
  289. DS28EC20_readData4B,
  290. DS28EC20_readData2B,
  291. DS28EC20_readData1B,
  292. DS28EC20_writeData,
  293. DS28EC20_getId,
  294. DS28EC20_getCapacity
  295. };
  296. memory_ec20.init(ONE_WIRE_GPIO_Port, ONE_WIRE_Pin);
  297. nbus_init_memory_driver(&memory_ec20);
  298. nbus_stack();
  299. /* USER CODE END 2 */
  300. /* Infinite loop */
  301. /* USER CODE BEGIN WHILE */
  302. while (1)
  303. {
  304. /* USER CODE END WHILE */
  305. /* USER CODE BEGIN 3 */
  306. }
  307. /* USER CODE END 3 */
  308. }
  309. /**
  310. * @brief System Clock Configuration
  311. * @retval None
  312. */
  313. void SystemClock_Config(void)
  314. {
  315. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  316. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  317. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  318. /** Configure the main internal regulator output voltage
  319. */
  320. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  321. /** Initializes the RCC Oscillators according to the specified parameters
  322. * in the RCC_OscInitTypeDef structure.
  323. */
  324. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  325. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  326. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  327. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  328. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  329. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
  330. RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
  331. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  332. {
  333. Error_Handler();
  334. }
  335. /** Initializes the CPU, AHB and APB buses clocks
  336. */
  337. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  338. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  339. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  340. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  341. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  342. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  343. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  344. {
  345. Error_Handler();
  346. }
  347. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  348. PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  349. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  350. {
  351. Error_Handler();
  352. }
  353. }
  354. /**
  355. * @brief ADC Initialization Function
  356. * @param None
  357. * @retval None
  358. */
  359. static void MX_ADC_Init(void)
  360. {
  361. /* USER CODE BEGIN ADC_Init 0 */
  362. /* USER CODE END ADC_Init 0 */
  363. ADC_ChannelConfTypeDef sConfig = {0};
  364. /* USER CODE BEGIN ADC_Init 1 */
  365. /* USER CODE END ADC_Init 1 */
  366. /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  367. */
  368. hadc.Instance = ADC1;
  369. hadc.Init.OversamplingMode = DISABLE;
  370. hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  371. hadc.Init.Resolution = ADC_RESOLUTION_12B;
  372. hadc.Init.SamplingTime = ADC_SAMPLETIME_79CYCLES_5;
  373. hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  374. hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  375. hadc.Init.ContinuousConvMode = ENABLE;
  376. hadc.Init.DiscontinuousConvMode = DISABLE;
  377. hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  378. hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  379. hadc.Init.DMAContinuousRequests = ENABLE;
  380. hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  381. hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  382. hadc.Init.LowPowerAutoWait = DISABLE;
  383. hadc.Init.LowPowerFrequencyMode = DISABLE;
  384. hadc.Init.LowPowerAutoPowerOff = DISABLE;
  385. if (HAL_ADC_Init(&hadc) != HAL_OK)
  386. {
  387. Error_Handler();
  388. }
  389. /** Configure for the selected ADC regular channel to be converted.
  390. */
  391. sConfig.Channel = ADC_CHANNEL_0;
  392. sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  393. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  394. {
  395. Error_Handler();
  396. }
  397. /** Configure for the selected ADC regular channel to be converted.
  398. */
  399. sConfig.Channel = ADC_CHANNEL_1;
  400. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  401. {
  402. Error_Handler();
  403. }
  404. /** Configure for the selected ADC regular channel to be converted.
  405. */
  406. sConfig.Channel = ADC_CHANNEL_2;
  407. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  408. {
  409. Error_Handler();
  410. }
  411. /** Configure for the selected ADC regular channel to be converted.
  412. */
  413. sConfig.Channel = ADC_CHANNEL_3;
  414. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  415. {
  416. Error_Handler();
  417. }
  418. /** Configure for the selected ADC regular channel to be converted.
  419. */
  420. sConfig.Channel = ADC_CHANNEL_4;
  421. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  422. {
  423. Error_Handler();
  424. }
  425. /** Configure for the selected ADC regular channel to be converted.
  426. */
  427. sConfig.Channel = ADC_CHANNEL_5;
  428. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  429. {
  430. Error_Handler();
  431. }
  432. /** Configure for the selected ADC regular channel to be converted.
  433. */
  434. sConfig.Channel = ADC_CHANNEL_6;
  435. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  436. {
  437. Error_Handler();
  438. }
  439. /** Configure for the selected ADC regular channel to be converted.
  440. */
  441. sConfig.Channel = ADC_CHANNEL_7;
  442. if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  443. {
  444. Error_Handler();
  445. }
  446. /* USER CODE BEGIN ADC_Init 2 */
  447. /* USER CODE END ADC_Init 2 */
  448. }
  449. /**
  450. * @brief SPI1 Initialization Function
  451. * @param None
  452. * @retval None
  453. */
  454. static void MX_SPI1_Init(void)
  455. {
  456. /* USER CODE BEGIN SPI1_Init 0 */
  457. /* USER CODE END SPI1_Init 0 */
  458. /* USER CODE BEGIN SPI1_Init 1 */
  459. /* USER CODE END SPI1_Init 1 */
  460. /* SPI1 parameter configuration*/
  461. hspi1.Instance = SPI1;
  462. hspi1.Init.Mode = SPI_MODE_MASTER;
  463. hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  464. hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  465. hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  466. hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  467. hspi1.Init.NSS = SPI_NSS_SOFT;
  468. hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  469. hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  470. hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  471. hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  472. hspi1.Init.CRCPolynomial = 7;
  473. if (HAL_SPI_Init(&hspi1) != HAL_OK)
  474. {
  475. Error_Handler();
  476. }
  477. /* USER CODE BEGIN SPI1_Init 2 */
  478. /* USER CODE END SPI1_Init 2 */
  479. }
  480. /**
  481. * @brief TIM21 Initialization Function
  482. * @param None
  483. * @retval None
  484. */
  485. static void MX_TIM21_Init(void)
  486. {
  487. /* USER CODE BEGIN TIM21_Init 0 */
  488. /* USER CODE END TIM21_Init 0 */
  489. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  490. TIM_MasterConfigTypeDef sMasterConfig = {0};
  491. /* USER CODE BEGIN TIM21_Init 1 */
  492. /* USER CODE END TIM21_Init 1 */
  493. htim21.Instance = TIM21;
  494. htim21.Init.Prescaler = 32000;
  495. htim21.Init.CounterMode = TIM_COUNTERMODE_UP;
  496. htim21.Init.Period = 100;
  497. htim21.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  498. htim21.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  499. if (HAL_TIM_Base_Init(&htim21) != HAL_OK)
  500. {
  501. Error_Handler();
  502. }
  503. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  504. if (HAL_TIM_ConfigClockSource(&htim21, &sClockSourceConfig) != HAL_OK)
  505. {
  506. Error_Handler();
  507. }
  508. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  509. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  510. if (HAL_TIMEx_MasterConfigSynchronization(&htim21, &sMasterConfig) != HAL_OK)
  511. {
  512. Error_Handler();
  513. }
  514. /* USER CODE BEGIN TIM21_Init 2 */
  515. /* USER CODE END TIM21_Init 2 */
  516. }
  517. /**
  518. * @brief USART1 Initialization Function
  519. * @param None
  520. * @retval None
  521. */
  522. static void MX_USART1_UART_Init(void)
  523. {
  524. /* USER CODE BEGIN USART1_Init 0 */
  525. /* USER CODE END USART1_Init 0 */
  526. /* USER CODE BEGIN USART1_Init 1 */
  527. /* USER CODE END USART1_Init 1 */
  528. huart1.Instance = USART1;
  529. huart1.Init.BaudRate = UART_BAUDRATE;
  530. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  531. huart1.Init.StopBits = UART_STOPBITS_1;
  532. huart1.Init.Parity = UART_PARITY_NONE;
  533. huart1.Init.Mode = UART_MODE_TX_RX;
  534. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  535. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  536. huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  537. huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  538. if (HAL_RS485Ex_Init(&huart1, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
  539. {
  540. Error_Handler();
  541. }
  542. /* USER CODE BEGIN USART1_Init 2 */
  543. /* USER CODE END USART1_Init 2 */
  544. }
  545. /**
  546. * Enable DMA controller clock
  547. */
  548. static void MX_DMA_Init(void)
  549. {
  550. /* DMA controller clock enable */
  551. __HAL_RCC_DMA1_CLK_ENABLE();
  552. /* DMA interrupt init */
  553. /* DMA1_Channel1_IRQn interrupt configuration */
  554. HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  555. HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  556. /* DMA1_Channel2_3_IRQn interrupt configuration */
  557. HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);
  558. HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
  559. }
  560. /**
  561. * @brief GPIO Initialization Function
  562. * @param None
  563. * @retval None
  564. */
  565. static void MX_GPIO_Init(void)
  566. {
  567. GPIO_InitTypeDef GPIO_InitStruct = {0};
  568. /* USER CODE BEGIN MX_GPIO_Init_1 */
  569. /* USER CODE END MX_GPIO_Init_1 */
  570. /* GPIO Ports Clock Enable */
  571. __HAL_RCC_GPIOC_CLK_ENABLE();
  572. __HAL_RCC_GPIOA_CLK_ENABLE();
  573. __HAL_RCC_GPIOB_CLK_ENABLE();
  574. /*Configure GPIO pin Output Level */
  575. HAL_GPIO_WritePin(GPIOB, LD3_Pin|ONE_WIRE_Pin, GPIO_PIN_RESET);
  576. /*Configure GPIO pin Output Level */
  577. HAL_GPIO_WritePin(SPI_SS_GPIO_Port, SPI_SS_Pin, GPIO_PIN_SET);
  578. /*Configure GPIO pin : LD3_Pin */
  579. GPIO_InitStruct.Pin = LD3_Pin;
  580. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  581. GPIO_InitStruct.Pull = GPIO_NOPULL;
  582. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  583. HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct);
  584. /*Configure GPIO pin : SPI_SS_Pin */
  585. GPIO_InitStruct.Pin = SPI_SS_Pin;
  586. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  587. GPIO_InitStruct.Pull = GPIO_PULLUP;
  588. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  589. HAL_GPIO_Init(SPI_SS_GPIO_Port, &GPIO_InitStruct);
  590. /*Configure GPIO pin : SPI_INT_Pin */
  591. GPIO_InitStruct.Pin = SPI_INT_Pin;
  592. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  593. GPIO_InitStruct.Pull = GPIO_PULLUP;
  594. HAL_GPIO_Init(SPI_INT_GPIO_Port, &GPIO_InitStruct);
  595. /*Configure GPIO pin : ONE_WIRE_Pin */
  596. GPIO_InitStruct.Pin = ONE_WIRE_Pin;
  597. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  598. GPIO_InitStruct.Pull = GPIO_PULLUP;
  599. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  600. HAL_GPIO_Init(ONE_WIRE_GPIO_Port, &GPIO_InitStruct);
  601. /*Configure GPIO pins : PB6 PB7 */
  602. GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  603. GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  604. GPIO_InitStruct.Pull = GPIO_NOPULL;
  605. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  606. GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
  607. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  608. /* EXTI interrupt init*/
  609. HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  610. HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
  611. /* USER CODE BEGIN MX_GPIO_Init_2 */
  612. /* USER CODE END MX_GPIO_Init_2 */
  613. }
  614. /* USER CODE BEGIN 4 */
  615. /* USER CODE END 4 */
  616. /**
  617. * @brief This function is executed in case of error occurrence.
  618. * @retval None
  619. */
  620. void Error_Handler(void)
  621. {
  622. /* USER CODE BEGIN Error_Handler_Debug */
  623. /* User can add his own implementation to report the HAL error return state */
  624. __disable_irq();
  625. while (1)
  626. {
  627. }
  628. /* USER CODE END Error_Handler_Debug */
  629. }
  630. #ifdef USE_FULL_ASSERT
  631. /**
  632. * @brief Reports the name of the source file and the source line number
  633. * where the assert_param error has occurred.
  634. * @param file: pointer to the source file name
  635. * @param line: assert_param error line source number
  636. * @retval None
  637. */
  638. void assert_failed(uint8_t *file, uint32_t line)
  639. {
  640. /* USER CODE BEGIN 6 */
  641. /* User can add his own implementation to report the file name and line number,
  642. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  643. /* USER CODE END 6 */
  644. }
  645. #endif /* USE_FULL_ASSERT */