//------------------------------------------------------------------------------ // main.c //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "stm32f4xx_hal.h" #include "stm-fmc.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(); // 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; // 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(); // check for errors (abort testing in case of error) if (data_test_ok < TEST_NUM_ROUNDS) break; // check for errors (abort testing in case of error) if (addr_test_ok < TEST_NUM_ROUNDS) break; // toggle yellow led to indicate, that we are alive led_toggle(GPIO_PIN_LED_YELLOW); successful_runs++; } // error handler while (1) { // turn on red led, turn off other leds led_on(GPIO_PIN_LED_RED); led_off(GPIO_PIN_LED_GREEN); led_off(GPIO_PIN_LED_YELLOW); led_off(GPIO_PIN_LED_BLUE); } // 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