#include "ch.h" #include "hal.h" /* ****************************************************************************** * DEFINES ****************************************************************************** */ #define SPI_BUF_SIZE 512 /* ****************************************************************************** * EXTERNS ****************************************************************************** */ /* ****************************************************************************** * PROTOTYPES ****************************************************************************** */ static void spi_end_cb(SPIDriver *spip); /* ****************************************************************************** * GLOBAL VARIABLES ****************************************************************************** */ static uint8_t testbuf_ram[SPI_BUF_SIZE]; static const uint8_t testbuf_flash[SPI_BUF_SIZE]; /* * */ static const SPIConfig spicfg = { spi_end_cb, GPIOA, GPIOA_SPI1_NSS, 0, //SPI_CR1_BR_1 | SPI_CR1_BR_0 }; static uint32_t its; static binary_semaphore_t sem; static bool stop = false; /* ****************************************************************************** ****************************************************************************** * LOCAL FUNCTIONS ****************************************************************************** ****************************************************************************** */ static void spi_end_cb(SPIDriver *spip){ its++; if (stop){ chSysLockFromISR(); chBSemSignalI(&sem); chSysUnlockFromISR(); return; } else{ chSysLockFromISR(); spiStartExchangeI(spip, SPI_BUF_SIZE, testbuf_flash, testbuf_ram); chSysUnlockFromISR(); } } /* ****************************************************************************** * EXPORTED FUNCTIONS ****************************************************************************** */ void dma_storm_spi_start(void){ its = 0; stop = false; chBSemObjectInit(&sem, true); spiStart(&SPID1, &spicfg); spiStartExchange(&SPID1, SPI_BUF_SIZE, testbuf_flash, testbuf_ram); } uint32_t dma_storm_spi_stop(void){ stop = true; chBSemWait(&sem); spiStop(&SPID1); return its; }