Skip to content

Commit 7487390

Browse files
authored
Merge pull request #119 from fpistm/Fix_UART
Added missing U(S)ART peripherals management
2 parents 7132500 + 18cce4b commit 7487390

File tree

3 files changed

+251
-58
lines changed

3 files changed

+251
-58
lines changed

Diff for: cores/arduino/stm32/stm32_def.h

-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@
5252

5353
// Here define some compatibility
5454
#ifdef STM32F0xx
55-
#define USART3_IRQn USART3_8_IRQn
56-
#define USART6_IRQn USART3_8_IRQn
5755
#define I2C1_EV_IRQn I2C1_IRQn
5856

5957
#elif defined(STM32F1xx)

Diff for: cores/arduino/stm32/uart.c

+184-56
Original file line numberDiff line numberDiff line change
@@ -57,61 +57,23 @@
5757
extern "C" {
5858
#endif
5959

60-
/**
61-
* @}
62-
*/
63-
64-
/** @addtogroup STM32F4xx_System_Private_Defines
65-
* @{
66-
*/
67-
68-
/**
69-
* @}
70-
*/
71-
72-
/** @addtogroup STM32F4xx_System_Private_TypesDefinitions
73-
* @{
74-
*/
75-
76-
/**
77-
* @}
78-
*/
79-
80-
/** @addtogroup STM32F4xx_System_Private_Macros
81-
* @{
82-
*/
83-
84-
/**
85-
* @}
86-
*/
87-
88-
/** @addtogroup STM32F4xx_System_Private_Variables
89-
* @{
90-
*/
91-
/// @brief uart caracteristics
60+
// @brief uart caracteristics
61+
#if defined(STM32F4xx)
62+
#define UART_NUM (10)
63+
#elif defined(STM32F0xx) || defined(STM32F7xx)
9264
#define UART_NUM (8)
65+
#elif defined(STM32F2xx)
66+
#define UART_NUM (6)
67+
#else // STM32F1xx || STM32F3xx || STM32L0xx || STM32L1xx || STM32L4xx
68+
#define UART_NUM (5)
69+
#endif
9370
static UART_HandleTypeDef *uart_handlers[UART_NUM] = {NULL};
9471
static void (*rx_callback[UART_NUM])(serial_t*);
9572
static serial_t *rx_callback_obj[UART_NUM];
9673
static int (*tx_callback[UART_NUM])(serial_t*);
9774
static serial_t *tx_callback_obj[UART_NUM];
9875

9976
static uint8_t rx_buffer[1] = {0};
100-
/**
101-
* @}
102-
*/
103-
104-
/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
105-
* @{
106-
*/
107-
108-
/**
109-
* @}
110-
*/
111-
112-
/** @addtogroup STM32F4xx_System_Private_Functions
113-
* @{
114-
*/
11577

11678
/**
11779
* @brief Function called to initialize the uart interface
@@ -177,6 +139,14 @@ void uart_init(serial_t *obj)
177139
obj->index = 3;
178140
obj->irq = UART4_IRQn;
179141
}
142+
#elif defined(USART4_BASE)
143+
else if(obj->uart == USART4) {
144+
__HAL_RCC_USART4_FORCE_RESET();
145+
__HAL_RCC_USART4_RELEASE_RESET();
146+
__HAL_RCC_USART4_CLK_ENABLE();
147+
obj->index = 3;
148+
obj->irq = USART4_IRQn;
149+
}
180150
#endif
181151
#if defined(UART5_BASE)
182152
else if(obj->uart == UART5) {
@@ -186,6 +156,14 @@ void uart_init(serial_t *obj)
186156
obj->index = 4;
187157
obj->irq = UART5_IRQn;
188158
}
159+
#elif defined(USART5_BASE)
160+
else if(obj->uart == USART5) {
161+
__HAL_RCC_USART5_FORCE_RESET();
162+
__HAL_RCC_USART5_RELEASE_RESET();
163+
__HAL_RCC_USART5_CLK_ENABLE();
164+
obj->index = 4;
165+
obj->irq = USART5_IRQn;
166+
}
189167
#endif
190168
#if defined(USART6_BASE)
191169
else if(obj->uart == USART6) {
@@ -204,6 +182,14 @@ void uart_init(serial_t *obj)
204182
obj->index = 6;
205183
obj->irq = UART7_IRQn;
206184
}
185+
#elif defined(USART7_BASE)
186+
else if(obj->uart == USART7) {
187+
__HAL_RCC_USART7_FORCE_RESET();
188+
__HAL_RCC_USART7_RELEASE_RESET();
189+
__HAL_RCC_USART7_CLK_ENABLE();
190+
obj->index = 6;
191+
obj->irq = USART7_IRQn;
192+
}
207193
#endif
208194
#if defined(UART8_BASE)
209195
else if(obj->uart == UART8) {
@@ -213,6 +199,32 @@ void uart_init(serial_t *obj)
213199
obj->index = 7;
214200
obj->irq = UART8_IRQn;
215201
}
202+
#elif defined(USART8_BASE)
203+
else if(obj->uart == USART8) {
204+
__HAL_RCC_USART8_FORCE_RESET();
205+
__HAL_RCC_USART8_RELEASE_RESET();
206+
__HAL_RCC_USART8_CLK_ENABLE();
207+
obj->index = 7;
208+
obj->irq = USART8_IRQn;
209+
}
210+
#endif
211+
#if defined(UART9_BASE)
212+
else if(obj->uart == UART9) {
213+
__HAL_RCC_UART9_FORCE_RESET();
214+
__HAL_RCC_UART9_RELEASE_RESET();
215+
__HAL_RCC_UART9_CLK_ENABLE();
216+
obj->index = 8;
217+
obj->irq = UART9_IRQn;
218+
}
219+
#endif
220+
#if defined(UART10_BASE)
221+
else if(obj->uart == UART10) {
222+
__HAL_RCC_UART10_FORCE_RESET();
223+
__HAL_RCC_UART10_RELEASE_RESET();
224+
__HAL_RCC_UART10_CLK_ENABLE();
225+
obj->index = 9;
226+
obj->irq = UART10_IRQn;
227+
}
216228
#endif
217229

218230
//Configure GPIOs
@@ -291,13 +303,25 @@ void uart_deinit(serial_t *obj)
291303
__HAL_RCC_UART4_RELEASE_RESET();
292304
__HAL_RCC_UART4_CLK_DISABLE();
293305
break;
306+
#elif defined(USART4_BASE)
307+
case 3:
308+
__HAL_RCC_USART4_FORCE_RESET();
309+
__HAL_RCC_USART4_RELEASE_RESET();
310+
__HAL_RCC_USART4_CLK_DISABLE();
311+
break;
294312
#endif
295313
#if defined(UART5_BASE)
296314
case 4:
297315
__HAL_RCC_UART5_FORCE_RESET();
298316
__HAL_RCC_UART5_RELEASE_RESET();
299317
__HAL_RCC_UART5_CLK_DISABLE();
300318
break;
319+
#elif defined(USART5_BASE)
320+
case 4:
321+
__HAL_RCC_USART5_FORCE_RESET();
322+
__HAL_RCC_USART5_RELEASE_RESET();
323+
__HAL_RCC_USART5_CLK_DISABLE();
324+
break;
301325
#endif
302326
#if defined(USART6_BASE)
303327
case 5:
@@ -312,15 +336,41 @@ void uart_deinit(serial_t *obj)
312336
__HAL_RCC_UART7_RELEASE_RESET();
313337
__HAL_RCC_UART7_CLK_DISABLE();
314338
break;
339+
#elif defined(USART7_BASE)
340+
case 6:
341+
__HAL_RCC_USART7_FORCE_RESET();
342+
__HAL_RCC_USART7_RELEASE_RESET();
343+
__HAL_RCC_USART7_CLK_DISABLE();
344+
break;
315345
#endif
316346
#if defined(UART8_BASE)
317347
case 7:
318348
__HAL_RCC_UART8_FORCE_RESET();
319349
__HAL_RCC_UART8_RELEASE_RESET();
320350
__HAL_RCC_UART8_CLK_DISABLE();
321351
break;
352+
#elif defined(USART8_BASE)
353+
case 7:
354+
__HAL_RCC_USART8_FORCE_RESET();
355+
__HAL_RCC_USART8_RELEASE_RESET();
356+
__HAL_RCC_USART8_CLK_DISABLE();
357+
break;
322358
#endif
323-
}
359+
#if defined(UART9_BASE)
360+
case 8:
361+
__HAL_RCC_UART9_FORCE_RESET();
362+
__HAL_RCC_UART9_RELEASE_RESET();
363+
__HAL_RCC_UART9_CLK_DISABLE();
364+
break;
365+
#endif
366+
#if defined(UART10_BASE)
367+
case 9:
368+
__HAL_RCC_UART10_FORCE_RESET();
369+
__HAL_RCC_UART10_RELEASE_RESET();
370+
__HAL_RCC_UART10_CLK_DISABLE();
371+
break;
372+
#endif
373+
}
324374

325375
HAL_UART_DeInit(uart_handlers[obj->index]);
326376
}
@@ -590,7 +640,50 @@ void USART2_IRQHandler(void)
590640
void USART3_IRQHandler(void)
591641
{
592642
HAL_NVIC_ClearPendingIRQ(USART3_IRQn);
593-
HAL_UART_IRQHandler(uart_handlers[2]);
643+
#if defined(STM32F091xC) || defined (STM32F098xx)
644+
if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART3)!= RESET)
645+
{
646+
HAL_UART_IRQHandler(uart_handlers[2]);
647+
}
648+
if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART4)!= RESET)
649+
{
650+
HAL_UART_IRQHandler(uart_handlers[3]);
651+
}
652+
if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART5)!= RESET)
653+
{
654+
HAL_UART_IRQHandler(uart_handlers[4]);
655+
}
656+
if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART6)!= RESET)
657+
{
658+
HAL_UART_IRQHandler(uart_handlers[5]);
659+
}
660+
if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART7)!= RESET)
661+
{
662+
HAL_UART_IRQHandler(uart_handlers[6]);
663+
}
664+
if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART8)!= RESET)
665+
{
666+
HAL_UART_IRQHandler(uart_handlers[7]);
667+
}
668+
#else
669+
if(uart_handlers[2] != NULL) {
670+
HAL_UART_IRQHandler(uart_handlers[2]);
671+
}
672+
#if defined(STM32F0xx)
673+
// USART3_4_IRQn
674+
if(uart_handlers[3] != NULL) {
675+
HAL_UART_IRQHandler(uart_handlers[3]);
676+
}
677+
#if defined(STM32F030xC)
678+
if(uart_handlers[4] != NULL) {
679+
HAL_UART_IRQHandler(uart_handlers[4]);
680+
}
681+
if(uart_handlers[5] != NULL) {
682+
HAL_UART_IRQHandler(uart_handlers[5]);
683+
}
684+
#endif // STM32F030xC
685+
#endif // STM32F0xx
686+
#endif // STM32F091xC || STM32F098xx
594687
}
595688
#endif
596689

@@ -608,7 +701,27 @@ void UART4_IRQHandler(void)
608701
#endif
609702

610703
/**
611-
* @brief USART 3 IRQ handler
704+
* @brief USART 4/5 IRQ handler
705+
* @param None
706+
* @retval None
707+
*/
708+
#if defined(STM32L0xx)
709+
#if defined(USART4_BASE) || defined(USART5_BASE)
710+
void USART4_5_IRQHandler(void)
711+
{
712+
HAL_NVIC_ClearPendingIRQ(USART4_IRQn);
713+
if(uart_handlers[3] != NULL) {
714+
HAL_UART_IRQHandler(uart_handlers[3]);
715+
}
716+
if(uart_handlers[4] != NULL) {
717+
HAL_UART_IRQHandler(uart_handlers[4]);
718+
}
719+
}
720+
#endif
721+
#endif
722+
723+
/**
724+
* @brief USART 5 IRQ handler
612725
* @param None
613726
* @retval None
614727
*/
@@ -625,7 +738,7 @@ void UART5_IRQHandler(void)
625738
* @param None
626739
* @retval None
627740
*/
628-
#if defined(USART6_BASE)
741+
#if defined(USART6_BASE) && !defined(STM32F0xx)
629742
void USART6_IRQHandler(void)
630743
{
631744
HAL_NVIC_ClearPendingIRQ(USART6_IRQn);
@@ -660,16 +773,31 @@ void UART8_IRQHandler(void)
660773
#endif
661774

662775
/**
663-
* @}
776+
* @brief UART 9 IRQ handler
777+
* @param None
778+
* @retval None
664779
*/
780+
#if defined(UART9_BASE)
781+
void UART9_IRQHandler(void)
782+
{
783+
HAL_NVIC_ClearPendingIRQ(UART9_IRQn);
784+
HAL_UART_IRQHandler(uart_handlers[8]);
785+
}
786+
#endif
665787

666788
/**
667-
* @}
789+
* @brief UART 10 IRQ handler
790+
* @param None
791+
* @retval None
668792
*/
793+
#if defined(UART10_BASE)
794+
void UART10_IRQHandler(void)
795+
{
796+
HAL_NVIC_ClearPendingIRQ(UART10_IRQn);
797+
HAL_UART_IRQHandler(uart_handlers[9]);
798+
}
799+
#endif
669800

670-
/**
671-
* @}
672-
*/
673801
#ifdef __cplusplus
674802
}
675803
#endif

0 commit comments

Comments
 (0)