summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-02-22 00:26:49 +0000
committerDamien George <damien.p.george@gmail.com>2015-02-22 00:26:49 +0000
commit77fc276c08b59d67779b726668d0b377c8ef47f0 (patch)
tree1d614dfa6d480fdb6ab21b801c02f41cd9ad62fe
parente06cf89f04b3258d5dfb3849e7f2eeb359a65547 (diff)
downloadmicropython-77fc276c08b59d67779b726668d0b377c8ef47f0.tar.gz
micropython-77fc276c08b59d67779b726668d0b377c8ef47f0.zip
stmhal: For UART, check that baudrate is within 5% of desired value.
Also includes documentation about minimum baudrate. Addresses issue #1090.
-rw-r--r--docs/library/pyb.UART.rst7
-rw-r--r--stmhal/uart.c22
2 files changed, 29 insertions, 0 deletions
diff --git a/docs/library/pyb.UART.rst b/docs/library/pyb.UART.rst
index 257a9f281b..509ca40803 100644
--- a/docs/library/pyb.UART.rst
+++ b/docs/library/pyb.UART.rst
@@ -75,6 +75,13 @@ Methods
- ``timeout_char`` is the timeout in milliseconds to wait between characters.
- ``read_buf_len`` is the character length of the read buffer (0 to disable).
+ This method will raise an exception if the baudrate could not be set within
+ 5% of the desired value. The minimum baudrate is dictated by the frequency
+ of the bus that the UART is on; UART(1) and UART(6) are APB2, the rest are on
+ APB1. The default bus frequencies give a minimum baudrate of 1300 for
+ UART(1) and UART(6) and 650 for the others. Use :func:`pyb.freq <pyb.freq>`
+ to reduce the bus frequencies to get lower baudrates.
+
*Note:* with parity=None, only 8 and 9 bits are supported. With parity enabled,
only 7 and 8 bits are supported.
diff --git a/stmhal/uart.c b/stmhal/uart.c
index d888358b36..4821da95fd 100644
--- a/stmhal/uart.c
+++ b/stmhal/uart.c
@@ -457,6 +457,28 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con
HAL_NVIC_EnableIRQ(self->irqn);
}
+ // compute actual baudrate that was configured
+ // (this formula assumes UART_OVERSAMPLING_16)
+ uint32_t actual_baudrate;
+ if (self->uart.Instance == USART1 || self->uart.Instance == USART6) {
+ actual_baudrate = HAL_RCC_GetPCLK2Freq();
+ } else {
+ actual_baudrate = HAL_RCC_GetPCLK1Freq();
+ }
+ actual_baudrate /= self->uart.Instance->BRR;
+
+ // check we could set the baudrate within 5%
+ uint32_t baudrate_diff;
+ if (actual_baudrate > init->BaudRate) {
+ baudrate_diff = actual_baudrate - init->BaudRate;
+ } else {
+ baudrate_diff = init->BaudRate - actual_baudrate;
+ }
+ init->BaudRate = actual_baudrate; // remember actual baudrate for printing
+ if (20 * baudrate_diff > init->BaudRate) {
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "set baudrate %d is not within 5%% of desired value", actual_baudrate));
+ }
+
return mp_const_none;
}