blob: 866e1589072e4c10871edf7db9f72448ded572dc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
/*
* Copyright (c) 2021-2022, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef STM32_UART_H
#define STM32_UART_H
/* UART word length */
#define STM32_UART_WORDLENGTH_7B USART_CR1_M1
#define STM32_UART_WORDLENGTH_8B 0x00000000U
#define STM32_UART_WORDLENGTH_9B USART_CR1_M0
/* UART number of stop bits */
#define STM32_UART_STOPBITS_0_5 USART_CR2_STOP_0
#define STM32_UART_STOPBITS_1 0x00000000U
#define STM32_UART_STOPBITS_1_5 (USART_CR2_STOP_0 | USART_CR2_STOP_1)
#define STM32_UART_STOPBITS_2 USART_CR2_STOP_1
/* UART parity */
#define STM32_UART_PARITY_NONE 0x00000000U
#define STM32_UART_PARITY_EVEN USART_CR1_PCE
#define STM32_UART_PARITY_ODD (USART_CR1_PCE | USART_CR1_PS)
/* UART transfer mode */
#define STM32_UART_MODE_RX USART_CR1_RE
#define STM32_UART_MODE_TX USART_CR1_TE
#define STM32_UART_MODE_TX_RX (USART_CR1_TE | USART_CR1_RE)
/* UART hardware flow control */
#define STM32_UART_HWCONTROL_NONE 0x00000000U
#define STM32_UART_HWCONTROL_RTS USART_CR3_RTSE
#define STM32_UART_HWCONTROL_CTS USART_CR3_CTSE
#define STM32_UART_HWCONTROL_RTS_CTS (USART_CR3_RTSE | USART_CR3_CTSE)
/* UART prescaler */
#define STM32_UART_PRESCALER_DIV1 0x00000000U
#define STM32_UART_PRESCALER_DIV2 0x00000001U
#define STM32_UART_PRESCALER_DIV4 0x00000002U
#define STM32_UART_PRESCALER_DIV6 0x00000003U
#define STM32_UART_PRESCALER_DIV8 0x00000004U
#define STM32_UART_PRESCALER_DIV10 0x00000005U
#define STM32_UART_PRESCALER_DIV12 0x00000006U
#define STM32_UART_PRESCALER_DIV16 0x00000007U
#define STM32_UART_PRESCALER_DIV32 0x00000008U
#define STM32_UART_PRESCALER_DIV64 0x00000009U
#define STM32_UART_PRESCALER_DIV128 0x0000000AU
#define STM32_UART_PRESCALER_DIV256 0x0000000BU
#define STM32_UART_PRESCALER_NB 0x0000000CU
/* UART fifo mode */
#define STM32_UART_FIFOMODE_EN USART_CR1_FIFOEN
#define STM32_UART_FIFOMODE_DIS 0x00000000U
/* UART TXFIFO threshold level */
#define STM32_UART_TXFIFO_THRESHOLD_1EIGHTHFULL 0x00000000U
#define STM32_UART_TXFIFO_THRESHOLD_1QUARTERFUL USART_CR3_TXFTCFG_0
#define STM32_UART_TXFIFO_THRESHOLD_HALFFULL USART_CR3_TXFTCFG_1
#define STM32_UART_TXFIFO_THRESHOLD_3QUARTERSFULL (USART_CR3_TXFTCFG_0 | USART_CR3_TXFTCFG_1)
#define STM32_UART_TXFIFO_THRESHOLD_7EIGHTHFULL USART_CR3_TXFTCFG_2
#define STM32_UART_TXFIFO_THRESHOLD_EMPTY (USART_CR3_TXFTCFG_2 | USART_CR3_TXFTCFG_0)
/* UART RXFIFO threshold level */
#define STM32_UART_RXFIFO_THRESHOLD_1EIGHTHFULL 0x00000000U
#define STM32_UART_RXFIFO_THRESHOLD_1QUARTERFULL USART_CR3_RXFTCFG_0
#define STM32_UART_RXFIFO_THRESHOLD_HALFFULL USART_CR3_RXFTCFG_1
#define STM32_UART_RXFIFO_THRESHOLD_3QUARTERSFULL (USART_CR3_RXFTCFG_0 | USART_CR3_RXFTCFG_1)
#define STM32_UART_RXFIFO_THRESHOLD_7EIGHTHFULL USART_CR3_RXFTCFG_2
#define STM32_UART_RXFIFO_THRESHOLD_FULL (USART_CR3_RXFTCFG_2 | USART_CR3_RXFTCFG_0)
struct stm32_uart_init_s {
uint32_t baud_rate; /*
* Configures the UART communication
* baud rate.
*/
uint32_t word_length; /*
* Specifies the number of data bits
* transmitted or received in a frame.
* This parameter can be a value of
* @ref STM32_UART_WORDLENGTH_*.
*/
uint32_t stop_bits; /*
* Specifies the number of stop bits
* transmitted. This parameter can be
* a value of @ref STM32_UART_STOPBITS_*.
*/
uint32_t parity; /*
* Specifies the parity mode.
* This parameter can be a value of
* @ref STM32_UART_PARITY_*.
*/
uint32_t mode; /*
* Specifies whether the receive or
* transmit mode is enabled or
* disabled. This parameter can be a
* value of @ref @ref STM32_UART_MODE_*.
*/
uint32_t hw_flow_control; /*
* Specifies whether the hardware flow
* control mode is enabled or
* disabled. This parameter can be a
* value of @ref STM32_UARTHWCONTROL_*.
*/
uint32_t one_bit_sampling; /*
* Specifies whether a single sample
* or three samples' majority vote is
* selected. This parameter can be 0
* or USART_CR3_ONEBIT.
*/
uint32_t prescaler; /*
* Specifies the prescaler value used
* to divide the UART clock source.
* This parameter can be a value of
* @ref STM32_UART_PRESCALER_*.
*/
uint32_t fifo_mode; /*
* Specifies if the FIFO mode will be
* used. This parameter can be a value
* of @ref STM32_UART_FIFOMODE_*.
*/
uint32_t tx_fifo_threshold; /*
* Specifies the TXFIFO threshold
* level. This parameter can be a
* value of @ref
* STM32_UART_TXFIFO_THRESHOLD_*.
*/
uint32_t rx_fifo_threshold; /*
* Specifies the RXFIFO threshold
* level. This parameter can be a
* value of @ref
* STM32_UART_RXFIFO_THRESHOLD_*.
*/
};
struct stm32_uart_handle_s {
uint32_t base;
uint32_t rdr_mask;
};
int stm32_uart_init(struct stm32_uart_handle_s *huart,
uintptr_t base_addr,
const struct stm32_uart_init_s *init);
void stm32_uart_stop(uintptr_t base_addr);
int stm32_uart_putc(struct stm32_uart_handle_s *huart, int c);
int stm32_uart_flush(struct stm32_uart_handle_s *huart);
int stm32_uart_getc(struct stm32_uart_handle_s *huart);
#endif /* STM32_UART_H */
|