From 0306ce3add02dbe28826f687f86c2c2fae53354c Mon Sep 17 00:00:00 2001 From: Paul Selkirk Date: Mon, 2 Nov 2015 18:46:16 -0500 Subject: rewrite and unify uart_send_ --- include/stm-uart.h | 7 ++-- self-test/fmc-perf.c | 2 +- self-test/fmc-test.c | 4 +-- src/stm-uart.c | 96 +++++++++++++++++----------------------------------- 4 files changed, 38 insertions(+), 71 deletions(-) diff --git a/include/stm-uart.h b/include/stm-uart.h index 62b2efd..c57afd5 100644 --- a/include/stm-uart.h +++ b/include/stm-uart.h @@ -9,8 +9,9 @@ extern void MX_USART2_UART_Init(void); extern void uart_send_char(uint8_t ch); extern void uart_send_string(char *s); -extern void uart_send_binary(uint32_t num, uint8_t bits); -extern void uart_send_integer(uint32_t data, uint32_t mag); -extern void uart_send_hex(uint32_t num, uint8_t digits); +extern void uart_send_number(uint32_t num, uint8_t digits, uint8_t radix); +#define uart_send_binary(num, bits) uart_send_number(num, bits, 2) +#define uart_send_integer(num, digits) uart_send_number(num, digits, 10) +#define uart_send_hex(num, digits) uart_send_number(num, digits, 16) #endif /* __STM32_DEV_BRIDGE_UART_H */ diff --git a/self-test/fmc-perf.c b/self-test/fmc-perf.c index 9dd623e..cf6fe19 100644 --- a/self-test/fmc-perf.c +++ b/self-test/fmc-perf.c @@ -58,7 +58,7 @@ static void _time_check(char *label, const uint32_t t0) uart_send_string(label); uart_send_integer(t / 1000, 0); uart_send_char('.'); - uart_send_integer(t % 1000, 100); + uart_send_integer(t % 1000, 3); uart_send_string(" seconds, "); uart_send_integer(((1000 * TEST_NUM_ROUNDS) / t), 0); uart_send_string("/sec\r\n"); diff --git a/self-test/fmc-test.c b/self-test/fmc-test.c index 0e8ff39..cf17087 100644 --- a/self-test/fmc-test.c +++ b/self-test/fmc-test.c @@ -91,9 +91,9 @@ int main(void) addr_test_ok = test_fpga_address_bus(); uart_send_string("Data: "); - uart_send_integer(data_test_ok, 100000); + uart_send_integer(data_test_ok, 6); uart_send_string(", addr: "); - uart_send_integer(addr_test_ok, 100000); + uart_send_integer(addr_test_ok, 6); uart_send_string("\r\n"); if (data_test_ok == TEST_NUM_ROUNDS && diff --git a/src/stm-uart.c b/src/stm-uart.c index 61f3e5b..7676645 100644 --- a/src/stm-uart.c +++ b/src/stm-uart.c @@ -41,70 +41,36 @@ void uart_send_string(char *s) HAL_UART_Transmit(&huart2, (uint8_t *) s, strlen(s), 0x1); } -void uart_send_binary(uint32_t num, uint8_t bits) +/* Generalized routine to send binary, decimal, and hex integers. + * This code is adapted from Chris Giese's printf.c + */ +void uart_send_number(uint32_t num, uint8_t digits, uint8_t radix) { - uint32_t i; - uint8_t ch; - - bits--; /* bits 4 should give i = 1000, not 10000 */ - - i = 1 << bits; - while (i) { - ch = '0'; - if (num & i) { - ch = '1'; - } - uart_send_char(ch); - i = i >> 1; - } -} - -/* XXX this takes a mask, not a number of digits */ -void uart_send_integer(uint32_t data, uint32_t mag) { - uint32_t i, t; - uint8_t ch; - - if (! mag) { - /* Find magnitude */ - if (data < 10) { - ch = '0' + data; - uart_send_char(ch); - return; - } - - for (mag = 10; mag < data; mag = i) { - i = mag * 10; - if (i > data || i < mag) - break; - } - } - /* mag is now 10 if data is 45, and 1000 if data is 1009 */ - for (i = mag; i; i /= 10) { - t = (data / i); - ch = '0' + t; - uart_send_char(ch); - data -= (t * i); - } -} - -void uart_send_hex(uint32_t num, uint8_t digits) -{ - uint8_t ch; - uint32_t mask; - - mask = 0x0FL << ((digits - 1) * 4); - - if (digits == 0 || digits > 8) - digits = 8; - - while (digits) { - ch = (num & mask) >> ((digits - 1) * 4); - if (ch < 10) - ch += '0'; - else - ch += 'A' - 10; - uart_send_char(ch); - --digits; - mask >>= 4; - } + #define BUFSIZE 32 + char buf[BUFSIZE]; + char *where = buf + BUFSIZE; + + /* initialize buf so we can add leading 0 by adjusting the pointer */ + memset(buf, '0', BUFSIZE); + + /* build the string backwards, starting with the least significant digit */ + do { + uint32_t temp; + temp = num % radix; + where--; + if (temp < 10) + *where = temp + '0'; + else + *where = temp - 10 + 'A'; + num = num / radix; + } while (num != 0); + + if (where > buf + BUFSIZE - digits) + /* pad with leading 0 */ + where = buf + BUFSIZE - digits; + else + /* number is larger than the specified number of digits */ + digits = buf + BUFSIZE - where; + + HAL_UART_Transmit(&huart2, (uint8_t *) where, digits, 0x1); } -- cgit v1.2.3