summaryrefslogtreecommitdiffstatshomepage
path: root/stmhal/uart.c
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 /stmhal/uart.c
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.
Diffstat (limited to 'stmhal/uart.c')
-rw-r--r--stmhal/uart.c22
1 files changed, 22 insertions, 0 deletions
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;
}