diff --git a/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h b/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h index 39d7fa2aee..ac9e8931f6 100644 --- a/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h +++ b/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h @@ -35,6 +35,14 @@ void ulp_riscv_print_str(const char *str); */ void ulp_riscv_print_hex(int h); +/** + * @brief Prints a hex number with the specified number of digits. Does not print 0x, only the digits + * + * @param Hex number to print + * @param number_of_digits Number of digits to print. + */ +void ulp_riscv_print_hex_with_number_of_digits(int h, int number_of_digits); + #ifdef __cplusplus } #endif diff --git a/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c b/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c index 6c3ed2c88a..713ed6fb86 100644 --- a/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c +++ b/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c @@ -60,3 +60,38 @@ void ulp_riscv_print_hex(int h) ULP_RISCV_EXIT_CRITICAL(); } + +void ulp_riscv_print_hex_with_number_of_digits(int h, int number_of_digits) +{ + int x; + int c; + + if (!s_print_ctx.putc) { + return; + } + + if (number_of_digits < 1) { + return; + } + + if (number_of_digits >= 8) { + ulp_riscv_print_hex(h); + return; + } + + /* Perform the bit-banged UART operation in a critical section */ + ULP_RISCV_ENTER_CRITICAL(); + + // Does not print '0x', only the digits specified by the number_of_digits argument + for (x = 0; x < number_of_digits; x++) { + c = (h >> ((number_of_digits - 1) * 4)) & 0xf; // extract the leftmost byte + if (c < 10) { + s_print_ctx.putc(s_print_ctx.putc_ctx, '0' + c); + } else { + s_print_ctx.putc(s_print_ctx.putc_ctx, 'a' + c - 10); + } + h <<= 4; // move the 2nd leftmost byte to the left, to be extracted next + } + + ULP_RISCV_EXIT_CRITICAL(); +}