Skip to content

Commit b920cdc

Browse files
committed
serial config when parity is enabled
When parity enabled the word length must be increased (CR1 bit 12 set). Word length of 9 bit with parity is not supported.
1 parent 7d2b430 commit b920cdc

1 file changed

Lines changed: 13 additions & 14 deletions

File tree

STM32F1/cores/maple/libmaple/usart_f1.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,14 @@ void usart_config_gpios_async(usart_dev *udev,
108108
gpio_set_mode(rx_dev, rx, GPIO_INPUT_FLOATING);
109109
gpio_set_mode(tx_dev, tx, GPIO_AF_OUTPUT_PP);
110110
/*
111-
112111
CR1 bit 12 Word length 0=8 1=9
113112
CR1 bit 11 wake (default value is 0) we can safely set this value to 0 (zero) each time
114113
CR1 bit 10 parity enable (1 = enabled)
115114
CR1 bit 9 Parity selection 0 = Even 1 = Odd
116115
CR2 bits 13 and 12 00 = 1 01 = 0.5 10 = 2 11 = 1.5
117116
Not all USARTs support 1.5 or 0.5 bits so its best to avoid them.
117+
When parity enabled the word length must be increased (CR1 bit 12 set).
118+
Word length of 9 bit with parity is not supported.
118119
CR2 CR1
119120
0B00 0000
120121
0B10 0000
@@ -136,21 +137,19 @@ Not all USARTs support 1.5 or 0.5 bits so its best to avoid them.
136137
#define SERIAL_9N1 0B 0000 1000
137138
#define SERIAL_9N2 0B 0010 1000
138139
139-
#define SERIAL_8E1 0B 0000 0010
140-
#define SERIAL_8E2 0B 0010 0010
141-
#define SERIAL_9E1 0B 0000 1010
142-
#define SERIAL_9E2 0B 0010 1010
143-
144-
#define SERIAL_8O1 0B 0000 0011
145-
#define SERIAL_8O2 0B 0010 0011
146-
#define SERIAL_9O1 0B 0000 1011
147-
#define SERIAL_9O2 0B 0010 1011
148-
149-
*/
140+
#define SERIAL_8E1 0B 0000 1010
141+
#define SERIAL_8E2 0B 0010 1010
142+
//#define SERIAL_9E1 0B 0000 1010
143+
//#define SERIAL_9E2 0B 0010 1010
150144
145+
#define SERIAL_8O1 0B 0000 1011
146+
#define SERIAL_8O2 0B 0010 1011
147+
//#define SERIAL_9O1 0B 0000 1011
148+
//#define SERIAL_9O2 0B 0010 1011
149+
*/
151150

152-
udev->regs->CR1 = udev->regs->CR1 ^ ((udev->regs->CR1 ^ (flags&0x0F)<<9 ) & 0B0001111000000000);
153-
udev->regs->CR2 = udev->regs->CR2 ^ ((udev->regs->CR2 ^ (flags&0xF0)<<8 ) & 0B0011000000000000);
151+
udev->regs->CR1 = (udev->regs->CR1 & 0B1110000111111111) | ((uint32_t)(flags&0x0F)<<9);
152+
udev->regs->CR2 = (udev->regs->CR2 & 0B1100111111111111) | ((uint32_t)(flags&0x30)<<8);
154153
}
155154

156155
void usart_set_baud_rate(usart_dev *dev, uint32 clock_speed, uint32 baud) {

0 commit comments

Comments
 (0)