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
|
/*
* Test read/write performance of the fmc bus
*/
#include "stm-init.h"
#include "stm-led.h"
#include "stm-fmc.h"
#include "stm-uart.h"
#define TEST_NUM_ROUNDS 2000000
RNG_HandleTypeDef rng_inst;
static void MX_RNG_Init(void)
{
rng_inst.Instance = RNG;
HAL_RNG_Init(&rng_inst);
}
static uint32_t random(void)
{
uint32_t rnd;
if (HAL_RNG_GenerateRandomNumber(&rng_inst, &rnd) != HAL_OK) {
uart_send_string("HAL_RNG_GenerateRandomNumber failed\r\n");
Error_Handler();
}
return rnd;
}
static void sanity(void)
{
uint32_t rnd, data;
rnd = random();
fmc_write_32(0, rnd);
fmc_read_32(0, &data);
if (data != rnd) {
uart_send_string("Data bus fail: expected ");
uart_send_hex(rnd, 8);
uart_send_string(", got ");
uart_send_hex(data, 8);
uart_send_string(", diff ");
uart_send_hex(data ^ rnd, 8);
uart_send_string("\r\n");
Error_Handler();
}
}
static void _time_check(char *label, const uint32_t t0)
{
uint32_t t = HAL_GetTick() - t0;
uart_send_string(label);
uart_send_integer(t / 1000, 1);
uart_send_char('.');
uart_send_integer(t % 1000, 3);
uart_send_string(" seconds, ");
uart_send_integer(((1000 * TEST_NUM_ROUNDS) / t), 1);
uart_send_string("/sec\r\n");
}
#define time_check(_label_, _expr_) \
do { \
uint32_t _t = HAL_GetTick(); \
(_expr_); \
_time_check(_label_, _t); \
} while (0)
static void test_read(void)
{
uint32_t i, data;
for (i = 0; i < TEST_NUM_ROUNDS; ++i) {
fmc_read_32(0, &data);
}
}
static void test_write(void)
{
uint32_t i;
for (i = 0; i < TEST_NUM_ROUNDS; ++i) {
fmc_write_32(0, i);
}
}
int main(void)
{
stm_init();
// initialize rng
MX_RNG_Init();
sanity();
time_check("read ", test_read());
time_check("write ", test_write());
uart_send_string("Done.\r\n\r\n");
return 0;
}
|