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