Skip to content

Commit 88171b6

Browse files
committed
Added missing U(S)ART peripherals management
Signed-off-by: Frederic.Pillon <[email protected]>
1 parent 57e2d31 commit 88171b6

File tree

2 files changed

+255
-4
lines changed

2 files changed

+255
-4
lines changed

cores/arduino/stm32/uart.c

+188-4
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,15 @@
5858
#endif
5959

6060
// @brief uart caracteristics
61+
#if defined(STM32F4xx)
62+
#define UART_NUM (10)
63+
#elif defined(STM32F0xx) || defined(STM32F7xx)
6164
#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
6270
static UART_HandleTypeDef *uart_handlers[UART_NUM] = {NULL};
6371
static void (*rx_callback[UART_NUM])(serial_t*);
6472
static serial_t *rx_callback_obj[UART_NUM];
@@ -131,6 +139,14 @@ void uart_init(serial_t *obj)
131139
obj->index = 3;
132140
obj->irq = UART4_IRQn;
133141
}
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+
}
134150
#endif
135151
#if defined(UART5_BASE)
136152
else if(obj->uart == UART5) {
@@ -140,6 +156,14 @@ void uart_init(serial_t *obj)
140156
obj->index = 4;
141157
obj->irq = UART5_IRQn;
142158
}
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+
}
143167
#endif
144168
#if defined(USART6_BASE)
145169
else if(obj->uart == USART6) {
@@ -158,6 +182,14 @@ void uart_init(serial_t *obj)
158182
obj->index = 6;
159183
obj->irq = UART7_IRQn;
160184
}
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+
}
161193
#endif
162194
#if defined(UART8_BASE)
163195
else if(obj->uart == UART8) {
@@ -167,6 +199,32 @@ void uart_init(serial_t *obj)
167199
obj->index = 7;
168200
obj->irq = UART8_IRQn;
169201
}
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+
}
170228
#endif
171229

172230
//Configure GPIOs
@@ -245,13 +303,25 @@ void uart_deinit(serial_t *obj)
245303
__HAL_RCC_UART4_RELEASE_RESET();
246304
__HAL_RCC_UART4_CLK_DISABLE();
247305
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;
248312
#endif
249313
#if defined(UART5_BASE)
250314
case 4:
251315
__HAL_RCC_UART5_FORCE_RESET();
252316
__HAL_RCC_UART5_RELEASE_RESET();
253317
__HAL_RCC_UART5_CLK_DISABLE();
254318
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;
255325
#endif
256326
#if defined(USART6_BASE)
257327
case 5:
@@ -266,15 +336,41 @@ void uart_deinit(serial_t *obj)
266336
__HAL_RCC_UART7_RELEASE_RESET();
267337
__HAL_RCC_UART7_CLK_DISABLE();
268338
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;
269345
#endif
270346
#if defined(UART8_BASE)
271347
case 7:
272348
__HAL_RCC_UART8_FORCE_RESET();
273349
__HAL_RCC_UART8_RELEASE_RESET();
274350
__HAL_RCC_UART8_CLK_DISABLE();
275351
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;
276358
#endif
277-
}
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+
}
278374

279375
HAL_UART_DeInit(uart_handlers[obj->index]);
280376
}
@@ -544,7 +640,50 @@ void USART2_IRQHandler(void)
544640
void USART3_IRQHandler(void)
545641
{
546642
HAL_NVIC_ClearPendingIRQ(USART3_IRQn);
547-
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
548687
}
549688
#endif
550689

@@ -562,7 +701,26 @@ void UART4_IRQHandler(void)
562701
#endif
563702

564703
/**
565-
* @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+
{
711+
HAL_NVIC_ClearPendingIRQ(USART4_IRQn);
712+
if(uart_handlers[3] != NULL) {
713+
HAL_UART_IRQHandler(uart_handlers[3]);
714+
}
715+
if(uart_handlers[4] != NULL) {
716+
HAL_UART_IRQHandler(uart_handlers[4]);
717+
}
718+
}
719+
#endif
720+
#endif
721+
722+
/**
723+
* @brief USART 5 IRQ handler
566724
* @param None
567725
* @retval None
568726
*/
@@ -579,7 +737,7 @@ void UART5_IRQHandler(void)
579737
* @param None
580738
* @retval None
581739
*/
582-
#if defined(USART6_BASE)
740+
#if defined(USART6_BASE) && !defined(STM32F0xx)
583741
void USART6_IRQHandler(void)
584742
{
585743
HAL_NVIC_ClearPendingIRQ(USART6_IRQn);
@@ -613,6 +771,32 @@ void UART8_IRQHandler(void)
613771
}
614772
#endif
615773

774+
/**
775+
* @brief UART 9 IRQ handler
776+
* @param None
777+
* @retval None
778+
*/
779+
#if defined(UART9_BASE)
780+
void UART9_IRQHandler(void)
781+
{
782+
HAL_NVIC_ClearPendingIRQ(UART9_IRQn);
783+
HAL_UART_IRQHandler(uart_handlers[8]);
784+
}
785+
#endif
786+
787+
/**
788+
* @brief UART 10 IRQ handler
789+
* @param None
790+
* @retval None
791+
*/
792+
#if defined(UART10_BASE)
793+
void UART10_IRQHandler(void)
794+
{
795+
HAL_NVIC_ClearPendingIRQ(UART10_IRQn);
796+
HAL_UART_IRQHandler(uart_handlers[9]);
797+
}
798+
#endif
799+
616800
#ifdef __cplusplus
617801
}
618802
#endif

cores/arduino/stm32/uart.h

+67
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,73 @@ struct serial_s {
7272
/* Exported constants --------------------------------------------------------*/
7373
#define TX_TIMEOUT 1000
7474

75+
#if defined(USART3_BASE) && !defined(USART3_IRQn)
76+
#if defined(STM32F0xx)
77+
#if defined(STM32F091xC) || defined (STM32F098xx)
78+
#define USART3_IRQn USART3_8_IRQn
79+
#define USART3_IRQHandler USART3_8_IRQHandler
80+
#elif defined(STM32F030xC)
81+
#define USART3_IRQn USART3_6_IRQn
82+
#define USART3_IRQHandler USART3_6_IRQHandler
83+
#else
84+
#define USART3_IRQn USART3_4_IRQn
85+
#define USART3_IRQHandler USART3_4_IRQHandler
86+
87+
#endif // STM32F091xC || STM32F098xx
88+
#endif // STM32F0xx
89+
#endif
90+
91+
#if defined(USART4_BASE) && !defined(USART4_IRQn)
92+
#if defined(STM32F0xx)
93+
// IRQHandler is mapped on USART3_IRQHandler for STM32F0xx
94+
#if defined(STM32F091xC) || defined (STM32F098xx)
95+
#define USART4_IRQn USART3_8_IRQn
96+
#elif defined(STM32F030xC)
97+
#define USART4_IRQn USART3_6_IRQn
98+
#else
99+
#define USART4_IRQn USART3_4_IRQn
100+
#endif // STM32F091xC || STM32F098xx
101+
#elif defined(STM32L0xx)
102+
#define USART4_IRQn USART4_5_IRQn
103+
#endif // STM32F0xx
104+
#endif
105+
106+
#if defined(USART5_BASE) && !defined(USART5_IRQn)
107+
#if defined(STM32F0xx)
108+
// IRQHandler is mapped on USART3_IRQHandler for STM32F0xx
109+
#if defined(STM32F091xC) || defined (STM32F098xx)
110+
#define USART5_IRQn USART3_8_IRQn
111+
#elif defined(STM32F030xC)
112+
#define USART5_IRQn USART3_6_IRQn
113+
#endif // STM32F091xC || STM32F098xx
114+
#elif defined(STM32L0xx)
115+
#define USART5_IRQn USART4_5_IRQn
116+
#endif // STM32F0xx
117+
#endif
118+
119+
#if defined (STM32F0xx)
120+
// IRQHandler is mapped on USART3_IRQHandler for STM32F0xx
121+
#if defined(USART6_BASE) && !defined(USART6_IRQn)
122+
#if defined(STM32F091xC) || defined (STM32F098xx)
123+
#define USART6_IRQn USART3_8_IRQn
124+
#elif defined(STM32F030xC)
125+
#define USART6_IRQn USART3_6_IRQn
126+
#endif // STM32F091xC || STM32F098xx
127+
#endif
128+
129+
#if defined(USART7_BASE) && !defined(USART7_IRQn)
130+
#if defined(STM32F091xC) || defined (STM32F098xx)
131+
#define USART7_IRQn USART3_8_IRQn
132+
#endif // STM32F091xC || STM32F098xx
133+
#endif
134+
135+
#if defined(USART8_BASE) && !defined(USART8_IRQn)
136+
#if defined(STM32F091xC) || defined (STM32F098xx)
137+
#define USART8_IRQn USART3_8_IRQn
138+
#endif // STM32F091xC || STM32F098xx
139+
#endif
140+
#endif // STM32F0xx
141+
75142
/* Exported macro ------------------------------------------------------------*/
76143
/* Exported functions ------------------------------------------------------- */
77144
void uart_init(serial_t *obj);

0 commit comments

Comments
 (0)