MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
general_uart.c
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file general_uart.c
4* @brief Модуль для инициализации UART.
5**************************************************************************
6Реализация функций для работы с UART:
7 - Инициализация UART и его линий RX/TX
8 - Настройка DMA для UART
9 - Настройка GPIO для UART
10 - Настройка NVIC и тактирования UART
11**************************************************************************/
12#include "general_uart.h"
13#include "general_gpio.h"
14
15//-------------------------------------------------------------------
16//------------------------UART INIT FUNCTIONS------------------------
17/**
18 * @brief Инициализация UART с помощью структуры UART_SettingsTypeDef.
19 * @param suart Указатель на структуру с настройками UART.
20 * @return HAL status.
21 * @details
22 * Инициализирует UART и его GPIO и при необходимости DMA.
23 * Настройка аналогична HAL_UART_Init
24 * @code
25 * suart.huart.Init...
26 * @endcode
27 * но дополнительно надо прописать пины RX/TX @ref UART_SettingsTypeDef
28 * @code
29 * suart->GPIOx, suart->GPIO_PIN_RX, suart->GPIO_PIN_TX
30 * @endcode
31 */
32HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart)
33{ // function takes setting structure for init
34
35 // check is settings are valid
36 if(UART_Check_Init_Struct(suart) != HAL_OK)
37 return HAL_ERROR;
38
39 suart->huart.Init.Mode = UART_MODE_TX_RX;
40
41 UART_MspInit(&suart->huart);
42
43
44 if (HAL_UART_Init(&suart->huart) != HAL_OK)
45 {
47 return HAL_ERROR;
48 }
49
50 // init gpio from UARTSettings structure
51 UART_GPIO_Init(suart->GPIOx, suart->GPIO_PIN_RX, suart->GPIO_PIN_TX);
52
53 __HAL_UART_ENABLE_IT(&suart->huart, UART_IT_IDLE);
54 // init dma from UARTSettings structure if need
55 if (suart->DMAChannel != 0)
56 UART_DMA_Init(&suart->huart, suart->huart.hdmarx, suart->DMAChannel, suart->DMA_CHANNEL_X);
57
58
59 return HAL_OK;
60}
61
62
63/**
64 * @brief Инициализация GPIO для UART.
65 * @param GPIOx Порт для настройки.
66 * @param GPIO_PIN_RX Пин для приема.
67 * @param GPIO_PIN_TX Пин для передачи.
68 */
69void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX)
70{ // function takes port and pins (for rx and tx)
71 GPIO_InitTypeDef GPIO_InitStruct = {0};
72
73 // choose port for enable clock
74 GPIO_Clock_Enable(GPIOx);
75
76 //USART3 GPIO Configuration
77 //GPIO_PIN_TX ------> USART_TX
78 //GPIO_PIN_RX ------> USART_RX
79
80#if defined(STM32F4xx) // gpio init for 407
81 GPIO_InitStruct.Pin = GPIO_PIN_TX|GPIO_PIN_RX;
82 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
83 GPIO_InitStruct.Pull = GPIO_NOPULL;
84 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
85 GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
86 HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
87#elif defined(STM32F1xx) // gpio init for atm403/stm103
88 //GPIO_PIN_TX ------> USART_TX
89 GPIO_InitStruct.Pin = GPIO_PIN_TX;
90 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
91 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
92 HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
93
94// GPIO_PIN_RX ------> USART_RX
95 GPIO_InitStruct.Pin = GPIO_PIN_RX;
96 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
97 GPIO_InitStruct.Pull = GPIO_NOPULL;
98 HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
99#endif
100}
101
102/**
103 * @brief Инициализация DMA для UART.
104 * @param huart Указатель на хендл UART.
105 * @param hdma_rx Указатель на хендл DMA для линии приема UART.
106 * @param DMAChannel Указатель на канал DMA/поток DMA в STM32F407.
107 * @param DMA_CHANNEL_X Канал DMA.
108 */
109void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X)
110{ // function takes uart and dma handlers and dmachannel for uart
111 // for now only dma rx is supported, tx maybe later if needed
112 // calc defines on boot_project_setup.h
113
114 /* USART3 DMA Init */
115 /* USART3_RX Init */
116
117 hdma_rx->Instance = DMAChannel;
118#if defined(STM32F4xx) // dma channel choose for 407
119 hdma_rx->Init.Channel = DMA_CHANNEL_X;
120#endif
121 hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY;
122 hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE;
123 hdma_rx->Init.MemInc = DMA_MINC_ENABLE;
124 hdma_rx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
125 hdma_rx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
126 hdma_rx->Init.Mode = DMA_CIRCULAR;
127 hdma_rx->Init.Priority = DMA_PRIORITY_LOW;
128 if (HAL_DMA_Init(hdma_rx) != HAL_OK)
129 {
131 }
132
133 __USER_LINKDMA(huart,hdmarx,hdma_rx);
134
135
136 // __USER_LINKDMA is need because __HAL_LINKDMA is written for global defined hdma_rx
137 // so you get error because hal uses . insted of ->
138}
139
140/**
141 * @brief Настройка тактирования и прерываний UART.
142 * @param huart Указатель на хендл UART.
143 * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых UART,
144 дефайнами @ref UART_INIT в @ref general_uart.h определяются используемые UART.
145 */
146void UART_MspInit(UART_HandleTypeDef *huart) // analog for hal function
147{
148// __RCC_DMA_UART_CLK_ENABLE();
149// /* DMA interrupt init */
150// /* DMA1_Stream1_IRQn interrupt configuration */
151// HAL_NVIC_SetPriority(DMA_UART_IRQn, 0, 0);
152// HAL_NVIC_EnableIRQ(DMA_UART_IRQn);
153
154 // rcc, dma and interrupt init for USARTs
155 // GPIO init was moved to own functions UART_GPIO_Init
156 if(0);
157#ifdef USE_USART1
158 else if(huart->Instance==USART1)
159 {
160
161 /* DMA2 clock enable */
162 __HAL_RCC_DMA2_CLK_ENABLE();
163 /* DMA interrupt init */
164 HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
165 HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
166
167 /* USART1 clock enable */
168 __HAL_RCC_USART1_CLK_ENABLE();
169
170 /* USART1 interrupt Init */
171 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
172 HAL_NVIC_EnableIRQ(USART1_IRQn);
173 }
174#endif // USE_USART1
175#ifdef USE_USART2
176 else if(huart->Instance==USART2)
177 {
178 /* DMA1 clock enable */
179 __HAL_RCC_DMA1_CLK_ENABLE();
180 /* DMA interrupt init */
181 HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
182 HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
183
184 /* USART2 clock enable */
185 __HAL_RCC_USART2_CLK_ENABLE();
186
187 /* USART2 interrupt Init */
188 HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
189 HAL_NVIC_EnableIRQ(USART2_IRQn);
190 }
191#endif // USE_USART2
192#ifdef USE_USART3
193 else if(huart->Instance==USART3)
194 {
195 /* DMA1 clock enable */
196 __HAL_RCC_DMA1_CLK_ENABLE();
197 /* DMA interrupt init */
198 HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
199 HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
200
201 /* USART3 clock enable */
202 __HAL_RCC_USART3_CLK_ENABLE();
203 /* USART3 interrupt Init */
204 HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
205 HAL_NVIC_EnableIRQ(USART3_IRQn);
206 }
207#endif // USE_USART3
208#ifdef USE_UART4
209 else if(huart->Instance==UART4)
210 {
211 /* DMA1 clock enable */
212 __HAL_RCC_DMA1_CLK_ENABLE();
213 /* DMA interrupt init */
214 HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0);
215 HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
216
217 /* UART4 clock enable */
218 __HAL_RCC_UART4_CLK_ENABLE();
219
220 /* UART4 interrupt Init */
221 HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);
222 HAL_NVIC_EnableIRQ(UART4_IRQn);
223 }
224#endif // USE_UART4
225#ifdef USE_UART5
226 else if(huart->Instance==UART5)
227 {
228 /* DMA1 clock enable */
229 __HAL_RCC_DMA1_CLK_ENABLE();
230 /* DMA interrupt init */
231 HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
232 HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
233
234 /* UART5 clock enable */
235 __HAL_RCC_DMA1_CLK_ENABLE();
236
237 /* UART5 interrupt Init */
238 HAL_NVIC_SetPriority(UART5_IRQn, 0, 0);
239 HAL_NVIC_EnableIRQ(UART5_IRQn);
240 }
241#endif // USE_UART5
242#ifdef USE_USART6
243 else if(huart->Instance==USART6)
244 {
245 /* DMA2 clock enable */
246 __HAL_RCC_DMA2_CLK_ENABLE();
247 /* DMA interrupt init */
248 HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
249 HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
250
251 /* USART6 clock enable */
252 __HAL_RCC_USART6_CLK_ENABLE();
253
254 /* USART6 interrupt Init */
255 HAL_NVIC_SetPriority(USART6_IRQn, 0, 0);
256 HAL_NVIC_EnableIRQ(USART6_IRQn);
257 }
258#endif // USE_USART6
259}
260
261/**
262 * @brief Деинициализация тактирования и прерываний UART.
263 * @param huart Указатель на хендл UART.
264 * @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых UART,
265 дефайнами @ref UART_INIT в @ref general_uart.h определяются используемые UART.
266 */
267void UART_MspDeInit(UART_HandleTypeDef *huart) // analog for hal function
268{
269 // rcc, dma and interrupt init for USARTs
270 // GPIO init was moved to own functions UART_GPIO_Init
271 if(0);
272#ifdef USE_USART1
273 else if(huart->Instance==USART1)
274 {
275
276// /* DMA2 clock enable */
277// __HAL_RCC_DMA2_CLK_ENABLE();
278// /* DMA interrupt init */
279// HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
280// HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
281
282 /* USART1 clock reset */
283 __HAL_RCC_USART1_FORCE_RESET();
284 __HAL_RCC_USART1_RELEASE_RESET();
285 }
286#endif // USE_USART1
287#ifdef USE_USART2
288 else if(huart->Instance==USART2)
289 {
290// /* DMA1 clock enable */
291// __HAL_RCC_DMA1_CLK_ENABLE();
292// /* DMA interrupt init */
293// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
294// HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
295
296 /* USART2 clock reset */
297 __HAL_RCC_USART2_FORCE_RESET();
298 __HAL_RCC_USART2_RELEASE_RESET();
299 }
300#endif // USE_USART2
301#ifdef USE_USART3
302 else if(huart->Instance==USART3)
303 {
304// /* DMA1 clock enable */
305// __HAL_RCC_DMA1_CLK_ENABLE();
306// /* DMA interrupt init */
307// HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
308// HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
309
310 /* USART3 clock reset */
311 __HAL_RCC_USART3_FORCE_RESET();
312 __HAL_RCC_USART3_RELEASE_RESET();
313 }
314#endif // USE_USART3
315#ifdef USE_UART4
316 else if(huart->Instance==UART4)
317 {
318// /* DMA1 clock enable */
319// __HAL_RCC_DMA1_CLK_ENABLE();
320// /* DMA interrupt init */
321// HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0);
322// HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
323
324 /* UART4 clock reset */
325 __HAL_RCC_UART4_FORCE_RESET();
326 __HAL_RCC_UART4_RELEASE_RESET();
327 }
328#endif // USE_UART4
329#ifdef USE_UART5
330 else if(huart->Instance==UART5)
331 {
332// /* DMA1 clock enable */
333// __HAL_RCC_DMA1_CLK_ENABLE();
334// /* DMA interrupt init */
335// HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
336// HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
337
338 /* UART5 clock reset */
339 __HAL_RCC_UART5_FORCE_RESET();
340 __HAL_RCC_UART5_RELEASE_RESET();
341 }
342#endif // USE_UART5
343#ifdef USE_USART6
344 else if(huart->Instance==USART6)
345 {
346// /* DMA2 clock enable */
347// __HAL_RCC_DMA2_CLK_ENABLE();
348// /* DMA interrupt init */
349// HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
350// HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
351
352 /* USART6 clock reset */
353 __HAL_RCC_USART6_FORCE_RESET();
354 __HAL_RCC_USART6_RELEASE_RESET();
355 }
356#endif // USE_USART6
357}
358
359/**
360 * @brief Проверка корректности структуры инициализации UART.
361 * @param suart Указатель на структуру с настройками UART.
362 * @return HAL status.
363 */
365{
366 // check is settings are valid
367 if (!IS_UART_INSTANCE(suart->huart.Instance))
368 return HAL_ERROR;
369
370 if (!IS_UART_BAUDRATE(suart->huart.Init.BaudRate) || (suart->huart.Init.BaudRate == NULL))
371 return HAL_ERROR;
372
373 if (!IS_GPIO_ALL_INSTANCE(suart->GPIOx))
374 return HAL_ERROR;
375
376 if (!IS_GPIO_PIN(suart->GPIO_PIN_RX) && !IS_GPIO_PIN(suart->GPIO_PIN_TX)) // if both pins arent set up
377 return HAL_ERROR;
378
379 return HAL_OK;
380}
381
382//------------------------UART INIT FUNCTIONS------------------------
383//-------------------------------------------------------------------
Заголовочный файл для модуля инициализации портов и работы с ними.
void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX)
Инициализация GPIO для UART.
void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X)
Инициализация DMA для UART.
Заголовочный файл для модуля инициализации UART.
#define MyLibs_Error_Handler(params)
Error_Handler который будет вызыватся в библиотеке
Definition mylibs_defs.h:31
HAL_StatusTypeDef UART_Check_Init_Struct(UART_SettingsTypeDef *suart)
Проверка корректности структуры инициализации UART.
void UART_MspDeInit(UART_HandleTypeDef *huart)
Деинициализация тактирования и прерываний UART.
void UART_MspInit(UART_HandleTypeDef *huart)
Настройка тактирования и прерываний UART.
HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart)
Инициализация UART с помощью структуры UART_SettingsTypeDef.
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
Включить тактирование порта GPIO.
Структура настроек UART.
uint32_t DMA_CHANNEL_X
Номер канала DMA (0 если не нужен)
DMA_Stream_TypeDef * DMAChannel
Канал DMA (NULL если не нужен)
uint16_t GPIO_PIN_RX
Пин приема
uint16_t GPIO_PIN_TX
Пин передачи
UART_HandleTypeDef huart
HAL handle UART.
GPIO_TypeDef * GPIOx
Порт для UART.