//------------------------------------------------------------------------------ // main.c //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "stm32f4xx_hal.h" #include "stm-init.h" #include "stm-led.h" #include "stm-fmc.h" #include "stm-uart.h" //------------------------------------------------------------------------------ // Defines //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Macros //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Variables //------------------------------------------------------------------------------ RNG_HandleTypeDef rng_inst; // FT: "I changed some interesting-to-look-at-in-the-debugger values to be // volatile, so that my compiler wouldn't optimize/obscure them." volatile uint32_t data_diff = 0; volatile uint32_t addr_diff = 0; //------------------------------------------------------------------------------ // Prototypes //------------------------------------------------------------------------------ /* XXX move this to stm-rng.[ch] */ static void MX_RNG_Init(void); int test_fpga_data_bus(void); int test_fpga_address_bus(void); //------------------------------------------------------------------------------ // Defines //------------------------------------------------------------------------------ #define TEST_NUM_ROUNDS 100000 //------------------------------------------------------------------------------ int main(void) //------------------------------------------------------------------------------ { int i; stm_init(); uart_send_string("Keep calm for Novena boot...\r\n"); // Blink blue LED for six seconds to not upset the Novena at boot. led_on(LED_BLUE); for (i = 0; i < 12; i++) { HAL_Delay(500); led_toggle(LED_BLUE); } // initialize rng MX_RNG_Init(); // prepare fmc interface fmc_init(); // turn on green led, turn off other leds led_on(LED_GREEN); led_off(LED_YELLOW); led_off(LED_RED); led_off(LED_BLUE); // vars volatile int data_test_ok = 0, addr_test_ok = 0, successful_runs = 0, failed_runs = 0, sleep = 0; // main loop (test, until an error is detected) while (1) { // test data bus data_test_ok = test_fpga_data_bus(); // test address bus addr_test_ok = test_fpga_address_bus(); uart_send_string("Data: "); uart_send_integer(data_test_ok, 6); uart_send_string(", addr: "); uart_send_integer(addr_test_ok, 6); uart_send_string("\r\n"); if (data_test_ok == TEST_NUM_ROUNDS && addr_test_ok == TEST_NUM_ROUNDS) { // toggle yellow led to indicate, that we are alive led_toggle(LED_YELLOW); successful_runs++; sleep = 100; } else { led_on(LED_RED); failed_runs++; sleep = 2000; } uart_send_string("Success "); uart_send_integer(successful_runs, 0); uart_send_string(", fail "); uart_send_integer(failed_runs, 0); uart_send_string("\r\n\r\n"); HAL_Delay(sleep); } // should never reach this line } //------------------------------------------------------------------------------ int test_fpga_data_bus(void) //------------------------------------------------------------------------------ { int c, ok; uint32_t rnd, buf; HAL_StatusTypeDef hal_result; // run some rounds of data bus test for (c=0; c