//------------------------------------------------------------------------------ // main.c //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "stm32f4xx_hal.h" #include "stm-fmc.h" #include "stm-uart.h" //------------------------------------------------------------------------------ // Defines //------------------------------------------------------------------------------ #define GPIO_PORT_LEDS GPIOJ #define GPIO_PIN_LED_RED GPIO_PIN_1 #define GPIO_PIN_LED_YELLOW GPIO_PIN_2 #define GPIO_PIN_LED_GREEN GPIO_PIN_3 #define GPIO_PIN_LED_BLUE GPIO_PIN_4 //------------------------------------------------------------------------------ // Macros //------------------------------------------------------------------------------ #define led_on(pin) HAL_GPIO_WritePin(GPIO_PORT_LEDS,pin,GPIO_PIN_SET) #define led_off(pin) HAL_GPIO_WritePin(GPIO_PORT_LEDS,pin,GPIO_PIN_RESET) #define led_toggle(pin) HAL_GPIO_TogglePin(GPIO_PORT_LEDS,pin) //------------------------------------------------------------------------------ // Variables //------------------------------------------------------------------------------ RNG_HandleTypeDef rng_inst; volatile uint32_t data_diff = 0; volatile uint32_t addr_diff = 0; //------------------------------------------------------------------------------ // Prototypes //------------------------------------------------------------------------------ void SystemClock_Config(void); static void MX_RNG_Init(void); static void MX_GPIO_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; // initialize hal HAL_Init(); // configure system clock SystemClock_Config(); // initialize gpio MX_GPIO_Init(); // initialize UART for debug output MX_USART2_UART_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(GPIO_PIN_LED_BLUE); for (i = 0; i < 12; i++) { HAL_Delay(500); led_toggle(GPIO_PIN_LED_BLUE); } // initialize rng MX_RNG_Init(); // prepare fmc interface fmc_init(); // turn on green led, turn off other leds led_on(GPIO_PIN_LED_GREEN); led_off(GPIO_PIN_LED_YELLOW); led_off(GPIO_PIN_LED_RED); led_off(GPIO_PIN_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, 100000); uart_send_string(", addr: "); uart_send_integer(addr_test_ok, 100000); 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(GPIO_PIN_LED_YELLOW); successful_runs++; sleep = 100; } else { led_on(GPIO_PIN_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