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

Last change on this file was 83, checked in by Zed, 11 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.