summaryrefslogtreecommitdiff
path: root/src/rtc-test/src/stm-uart.c
blob: c98a889f6aef9041eadc8ae9050896cc410d2121 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"
#include "stm-uart.h"

#include <string.h>

extern void Error_Handler();

UART_HandleTypeDef huart2;


/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

inline void uart_putc(uint8_t *ch) {
  HAL_UART_Transmit(&huart2, ch, 1, 0x1);
}

void uart_send_binary(uint32_t num, uint8_t bits)
{
  uint32_t i;
  unsigned char ch;

  bits--;  /* bits 4 should give i = 1000, not 10000 */

  i = 1 << bits;
  while (i) {
    ch = '0';
    if (num & i) {
      ch = '1';
    }

    uart_putc(&ch);
    i = i >> 1;
  }
}

void uart_send_string(char *s)
{
  HAL_UART_Transmit(&huart2, (uint8_t *) s, strlen(s), 0x1);
}

void uart_send_integer(uint32_t data, uint32_t mag) {
  uint32_t i, t;
  unsigned char ch;

  if (! mag) {
    /* Find magnitude */
    if (data < 10) {
      ch = '0' + data;
      HAL_UART_Transmit(&huart2, (uint8_t *) &ch, 1, 0x1);
      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;
    HAL_UART_Transmit(&huart2, (uint8_t *) &ch, 1, 0x1);
    data -= (t * i);
  }
}

void uart_send_hexbyte(const uint32_t data)
{
  int i, j = 8;
  uint8_t ch;

  while (j) {
    j -= 4;
    i = (data >> j) & 0x0f;
    if (i > 9) {
      ch = 'a' + i - 10;
      uart_putc(&ch);
    } else {
      ch = '0' + i;
      uart_putc(&ch);
    }
  }
}

void uart_send_hexdump(const uint8_t *buf, const uint8_t start_offset, const uint8_t end_offset)
{
  uint32_t i;

  uart_send_string("00 -- ");

  for (i = 0; i <= end_offset; i++) {
    if (i && (! (i % 16))) {
      uart_send_string("\r\n");

      if (i != end_offset) {
	/* Output new offset unless the last byte is reached */
	uart_send_hexbyte(i);
	uart_send_string(" -- ");
      }
    }

    uart_send_hexbyte(*(buf + i));
    uart_send_string(" ");
  }
}