source: ctrl/firmware/Main/CubeMX/Core/Src/usart.c

Last change on this file was 83, checked in by Zed, 3 months ago

Modbus Master and Slave Hardware were tested.

File size: 11.9 KB
Line 
1/* USER CODE BEGIN Header */
2/**
3  ******************************************************************************
4  * @file    usart.c
5  * @brief   This file provides code for the configuration
6  *          of the USART instances.
7  ******************************************************************************
8  * @attention
9  *
10  * Copyright (c) 2025 STMicroelectronics.
11  * All rights reserved.
12  *
13  * This software is licensed under terms that can be found in the LICENSE file
14  * in the root directory of this software component.
15  * If no LICENSE file comes with this software, it is provided AS-IS.
16  *
17  ******************************************************************************
18  */
19/* USER CODE END Header */
20/* Includes ------------------------------------------------------------------*/
21#include "usart.h"
22
23/* USER CODE BEGIN 0 */
24
25/* USER CODE END 0 */
26
27UART_HandleTypeDef huart2;
28UART_HandleTypeDef huart3;
29UART_HandleTypeDef huart10;
30DMA_HandleTypeDef hdma_usart3_rx;
31DMA_HandleTypeDef hdma_usart3_tx;
32
33/* USART2 init function */
34
35void MX_USART2_UART_Init(void)
36{
37
38  /* USER CODE BEGIN USART2_Init 0 */
39
40  // This USART is responsible for Modbus Slave operations
41
42  /* USER CODE END USART2_Init 0 */
43
44  /* USER CODE BEGIN USART2_Init 1 */
45
46  /* USER CODE END USART2_Init 1 */
47  huart2.Instance = USART2;
48  huart2.Init.BaudRate = 115200;
49  huart2.Init.WordLength = UART_WORDLENGTH_8B;
50  huart2.Init.StopBits = UART_STOPBITS_1;
51  huart2.Init.Parity = UART_PARITY_NONE;
52  huart2.Init.Mode = UART_MODE_TX_RX;
53  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
54  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
55  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
56  huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
57  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
58  if (HAL_RS485Ex_Init(&huart2, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
59  {
60    Error_Handler();
61  }
62  if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
63  {
64    Error_Handler();
65  }
66  if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
67  {
68    Error_Handler();
69  }
70  if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
71  {
72    Error_Handler();
73  }
74  /* USER CODE BEGIN USART2_Init 2 */
75
76  /* USER CODE END USART2_Init 2 */
77
78}
79/* USART3 init function */
80
81void MX_USART3_UART_Init(void)
82{
83
84  /* USER CODE BEGIN USART3_Init 0 */
85
86  /* USER CODE END USART3_Init 0 */
87
88  /* USER CODE BEGIN USART3_Init 1 */
89
90  /* USER CODE END USART3_Init 1 */
91  huart3.Instance = USART3;
92  huart3.Init.BaudRate = 115200;
93  huart3.Init.WordLength = UART_WORDLENGTH_8B;
94  huart3.Init.StopBits = UART_STOPBITS_1;
95  huart3.Init.Parity = UART_PARITY_NONE;
96  huart3.Init.Mode = UART_MODE_TX_RX;
97  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
98  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
99  huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
100  huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
101  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT|UART_ADVFEATURE_DMADISABLEONERROR_INIT;
102  huart3.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
103  huart3.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;
104  if (HAL_UART_Init(&huart3) != HAL_OK)
105  {
106    Error_Handler();
107  }
108  if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
109  {
110    Error_Handler();
111  }
112  if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
113  {
114    Error_Handler();
115  }
116  if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)
117  {
118    Error_Handler();
119  }
120  /* USER CODE BEGIN USART3_Init 2 */
121
122  /* USER CODE END USART3_Init 2 */
123
124}
125/* USART10 init function */
126
127void MX_USART10_UART_Init(void)
128{
129
130  /* USER CODE BEGIN USART10_Init 0 */
131
132  /* USER CODE END USART10_Init 0 */
133
134  /* USER CODE BEGIN USART10_Init 1 */
135
136  /* USER CODE END USART10_Init 1 */
137  huart10.Instance = USART10;
138  huart10.Init.BaudRate = 115200;
139  huart10.Init.WordLength = UART_WORDLENGTH_8B;
140  huart10.Init.StopBits = UART_STOPBITS_1;
141  huart10.Init.Parity = UART_PARITY_NONE;
142  huart10.Init.Mode = UART_MODE_TX_RX;
143  huart10.Init.HwFlowCtl = UART_HWCONTROL_NONE;
144  huart10.Init.OverSampling = UART_OVERSAMPLING_16;
145  huart10.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
146  huart10.Init.ClockPrescaler = UART_PRESCALER_DIV1;
147  huart10.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
148  if (HAL_RS485Ex_Init(&huart10, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
149  {
150    Error_Handler();
151  }
152  if (HAL_UARTEx_SetTxFifoThreshold(&huart10, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
153  {
154    Error_Handler();
155  }
156  if (HAL_UARTEx_SetRxFifoThreshold(&huart10, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
157  {
158    Error_Handler();
159  }
160  if (HAL_UARTEx_DisableFifoMode(&huart10) != HAL_OK)
161  {
162    Error_Handler();
163  }
164  /* USER CODE BEGIN USART10_Init 2 */
165
166  /* USER CODE END USART10_Init 2 */
167
168}
169
170void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
171{
172
173  GPIO_InitTypeDef GPIO_InitStruct = {0};
174  if(uartHandle->Instance==USART2)
175  {
176  /* USER CODE BEGIN USART2_MspInit 0 */
177
178  /* USER CODE END USART2_MspInit 0 */
179    /* USART2 clock enable */
180    __HAL_RCC_USART2_CLK_ENABLE();
181
182    __HAL_RCC_GPIOD_CLK_ENABLE();
183    /**USART2 GPIO Configuration
184    PD4     ------> USART2_DE
185    PD5     ------> USART2_TX
186    PD6     ------> USART2_RX
187    */
188    GPIO_InitStruct.Pin = USART_MODBUS_SLAVE_DE_Pin|USART_MODBUS_SLAVE_TX_Pin|USART_MODBUS_SLAVE_RX_Pin;
189    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
190    GPIO_InitStruct.Pull = GPIO_NOPULL;
191    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
192    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
193    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
194
195    /* USART2 interrupt Init */
196    HAL_NVIC_SetPriority(USART2_IRQn, 5, 0);
197    HAL_NVIC_EnableIRQ(USART2_IRQn);
198  /* USER CODE BEGIN USART2_MspInit 1 */
199
200  /* USER CODE END USART2_MspInit 1 */
201  }
202  else if(uartHandle->Instance==USART3)
203  {
204  /* USER CODE BEGIN USART3_MspInit 0 */
205
206  /* USER CODE END USART3_MspInit 0 */
207    /* USART3 clock enable */
208    __HAL_RCC_USART3_CLK_ENABLE();
209
210    __HAL_RCC_GPIOD_CLK_ENABLE();
211    /**USART3 GPIO Configuration
212    PD8     ------> USART3_TX
213    PD9     ------> USART3_RX
214    PD11     ------> USART3_CTS
215    PD12     ------> USART3_RTS
216    */
217    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12;
218    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
219    GPIO_InitStruct.Pull = GPIO_NOPULL;
220    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
221    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
222    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
223
224    /* USART3 DMA Init */
225    /* USART3_RX Init */
226    hdma_usart3_rx.Instance = DMA1_Stream1;
227    hdma_usart3_rx.Init.Request = DMA_REQUEST_USART3_RX;
228    hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
229    hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
230    hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
231    hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
232    hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
233    hdma_usart3_rx.Init.Mode = DMA_NORMAL;
234    hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
235    hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
236    if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
237    {
238      Error_Handler();
239    }
240
241    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
242
243    /* USART3_TX Init */
244    hdma_usart3_tx.Instance = DMA1_Stream2;
245    hdma_usart3_tx.Init.Request = DMA_REQUEST_USART3_TX;
246    hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
247    hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
248    hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
249    hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
250    hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
251    hdma_usart3_tx.Init.Mode = DMA_NORMAL;
252    hdma_usart3_tx.Init.Priority = DMA_PRIORITY_HIGH;
253    hdma_usart3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
254    if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK)
255    {
256      Error_Handler();
257    }
258
259    __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart3_tx);
260
261    /* USART3 interrupt Init */
262    HAL_NVIC_SetPriority(USART3_IRQn, 5, 0);
263    HAL_NVIC_EnableIRQ(USART3_IRQn);
264  /* USER CODE BEGIN USART3_MspInit 1 */
265
266  /* USER CODE END USART3_MspInit 1 */
267  }
268  else if(uartHandle->Instance==USART10)
269  {
270  /* USER CODE BEGIN USART10_MspInit 0 */
271
272  /* USER CODE END USART10_MspInit 0 */
273    /* USART10 clock enable */
274    __HAL_RCC_USART10_CLK_ENABLE();
275
276    __HAL_RCC_GPIOE_CLK_ENABLE();
277    __HAL_RCC_GPIOG_CLK_ENABLE();
278    /**USART10 GPIO Configuration
279    PE2     ------> USART10_RX
280    PE3     ------> USART10_TX
281    PG14     ------> USART10_DE
282    */
283    GPIO_InitStruct.Pin = USART_MODBUS_MASTER_RX_Pin;
284    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
285    GPIO_InitStruct.Pull = GPIO_NOPULL;
286    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
287    GPIO_InitStruct.Alternate = GPIO_AF4_USART10;
288    HAL_GPIO_Init(USART_MODBUS_MASTER_RX_GPIO_Port, &GPIO_InitStruct);
289
290    GPIO_InitStruct.Pin = USART_MODBUS_MASTER_TX_Pin;
291    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
292    GPIO_InitStruct.Pull = GPIO_NOPULL;
293    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
294    GPIO_InitStruct.Alternate = GPIO_AF11_USART10;
295    HAL_GPIO_Init(USART_MODBUS_MASTER_TX_GPIO_Port, &GPIO_InitStruct);
296
297    GPIO_InitStruct.Pin = USART_MODBUS_MASTER_DE_Pin;
298    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
299    GPIO_InitStruct.Pull = GPIO_NOPULL;
300    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
301    GPIO_InitStruct.Alternate = GPIO_AF4_USART10;
302    HAL_GPIO_Init(USART_MODBUS_MASTER_DE_GPIO_Port, &GPIO_InitStruct);
303
304    /* USART10 interrupt Init */
305    HAL_NVIC_SetPriority(USART10_IRQn, 5, 0);
306    HAL_NVIC_EnableIRQ(USART10_IRQn);
307  /* USER CODE BEGIN USART10_MspInit 1 */
308
309  /* USER CODE END USART10_MspInit 1 */
310  }
311}
312
313void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
314{
315
316  if(uartHandle->Instance==USART2)
317  {
318  /* USER CODE BEGIN USART2_MspDeInit 0 */
319
320  /* USER CODE END USART2_MspDeInit 0 */
321    /* Peripheral clock disable */
322    __HAL_RCC_USART2_CLK_DISABLE();
323
324    /**USART2 GPIO Configuration
325    PD4     ------> USART2_DE
326    PD5     ------> USART2_TX
327    PD6     ------> USART2_RX
328    */
329    HAL_GPIO_DeInit(GPIOD, USART_MODBUS_SLAVE_DE_Pin|USART_MODBUS_SLAVE_TX_Pin|USART_MODBUS_SLAVE_RX_Pin);
330
331    /* USART2 interrupt Deinit */
332    HAL_NVIC_DisableIRQ(USART2_IRQn);
333  /* USER CODE BEGIN USART2_MspDeInit 1 */
334
335  /* USER CODE END USART2_MspDeInit 1 */
336  }
337  else if(uartHandle->Instance==USART3)
338  {
339  /* USER CODE BEGIN USART3_MspDeInit 0 */
340
341  /* USER CODE END USART3_MspDeInit 0 */
342    /* Peripheral clock disable */
343    __HAL_RCC_USART3_CLK_DISABLE();
344
345    /**USART3 GPIO Configuration
346    PD8     ------> USART3_TX
347    PD9     ------> USART3_RX
348    PD11     ------> USART3_CTS
349    PD12     ------> USART3_RTS
350    */
351    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12);
352
353    /* USART3 DMA DeInit */
354    HAL_DMA_DeInit(uartHandle->hdmarx);
355    HAL_DMA_DeInit(uartHandle->hdmatx);
356
357    /* USART3 interrupt Deinit */
358    HAL_NVIC_DisableIRQ(USART3_IRQn);
359  /* USER CODE BEGIN USART3_MspDeInit 1 */
360
361  /* USER CODE END USART3_MspDeInit 1 */
362  }
363  else if(uartHandle->Instance==USART10)
364  {
365  /* USER CODE BEGIN USART10_MspDeInit 0 */
366
367  /* USER CODE END USART10_MspDeInit 0 */
368    /* Peripheral clock disable */
369    __HAL_RCC_USART10_CLK_DISABLE();
370
371    /**USART10 GPIO Configuration
372    PE2     ------> USART10_RX
373    PE3     ------> USART10_TX
374    PG14     ------> USART10_DE
375    */
376    HAL_GPIO_DeInit(GPIOE, USART_MODBUS_MASTER_RX_Pin|USART_MODBUS_MASTER_TX_Pin);
377
378    HAL_GPIO_DeInit(USART_MODBUS_MASTER_DE_GPIO_Port, USART_MODBUS_MASTER_DE_Pin);
379
380    /* USART10 interrupt Deinit */
381    HAL_NVIC_DisableIRQ(USART10_IRQn);
382  /* USER CODE BEGIN USART10_MspDeInit 1 */
383
384  /* USER CODE END USART10_MspDeInit 1 */
385  }
386}
387
388/* USER CODE BEGIN 1 */
389
390/* USER CODE END 1 */
Note: See TracBrowser for help on using the repository browser.