diff --git a/modules/UARTE_vs_Serial/UARTE_vs_Serial.ino b/modules/UARTE_vs_Serial/UARTE_vs_Serial.ino new file mode 100644 index 0000000000000000000000000000000000000000..c6057ffe8e8c90476dda9d0ebe7e6ee1dd115f9b --- /dev/null +++ b/modules/UARTE_vs_Serial/UARTE_vs_Serial.ino @@ -0,0 +1,110 @@ +// Will Langford +// Jan 16, 2018 +// Basic example comparing the Adafruit Feather Serial implementation vs Uart +// the conclusioni is essentially that they're the same (if you're sending a character string anyway) +// Serial.print is non-blocking (just like the uart_send() function) +// UNLESS: you're writing data to the UART faster than it can send out... then it will block your code + +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> + +#define n_tx_bytes 20 //only as many as needed +#define n_rx_bytes 20 //only as many as needed +const uint8_t pin_rx = 8; +const uint8_t pin_tx = 6; +static char uart_tx_data[n_tx_bytes] = {0}; +static char uart_rx_data[n_rx_bytes] = {0}; + +volatile bool timer2_triggered = false; + +const uint8_t enablePin = 27; + +uint16_t counter = 0; + +extern "C" // for some strange reason this seems necessary for the interrupt to function +{ + void TIMER2_IRQHandler(void) + { + // Clear events + NRF_TIMER2->EVENTS_COMPARE[0] = 0; + + timer2_triggered = true; + } +} + +void writeToBuffer(char *buff, char *fmt, ...) { + va_list args; + va_start(args, fmt); + vsnprintf(buff, n_tx_bytes, fmt, args); + va_end(args); +} + +void uart_setup() { + //uart with dma + NRF_UARTE0->PSEL.TXD = (pin_tx << UARTE_PSEL_TXD_PIN_Pos) & UARTE_PSEL_TXD_PIN_Msk; + NRF_UARTE0->PSEL.RXD = (pin_rx << UARTE_PSEL_RXD_PIN_Pos) & UARTE_PSEL_RXD_PIN_Msk; + NRF_UARTE0->CONFIG = ((UART_CONFIG_PARITY_Excluded << UARTE_CONFIG_PARITY_Pos) & UARTE_CONFIG_PARITY_Msk) + | ((UARTE_CONFIG_HWFC_Disabled << UARTE_CONFIG_HWFC_Pos) & UARTE_CONFIG_HWFC_Msk); + NRF_UARTE0->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud115200; + NRF_UARTE0->ENABLE = (UARTE_ENABLE_ENABLE_Enabled << UARTE_ENABLE_ENABLE_Pos) & UARTE_ENABLE_ENABLE_Msk; + + NRF_UARTE0->TXD.MAXCNT = n_tx_bytes; + NRF_UARTE0->RXD.MAXCNT = n_rx_bytes; +} + +void uart_send() { + NRF_UARTE0->EVENTS_ENDTX = 0; + NRF_UARTE0->TXD.PTR = (uint32_t)(&uart_tx_data); //reset pointer to start of buffer + NRF_UARTE0->TASKS_STARTTX = 1; //trigger start task to send data to host +} + +void timer2_init() +{ + NVIC_EnableIRQ(TIMER2_IRQn); + NVIC_ClearPendingIRQ(TIMER2_IRQn); + + NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer; // Set the timer in Timer Mode. + NRF_TIMER2->PRESCALER = 9; + NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; // 16 bit mode. + NRF_TIMER2->TASKS_CLEAR = 1; + NRF_TIMER2->CC[0] = 632; // with prescaler 9, this triggers at 200 Hz + NRF_TIMER2->EVENTS_COMPARE[0] = 0; + NRF_TIMER2->SHORTS = (TIMER_SHORTS_COMPARE0_CLEAR_Enabled << TIMER_SHORTS_COMPARE0_CLEAR_Pos); + + NRF_TIMER2->INTENSET = TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos; + NVIC_EnableIRQ(TIMER2_IRQn); +} + +void timer2_start() { + NRF_TIMER2->TASKS_START = 1; +} + +void setup() { +// Serial.begin(115200); + + NRF_GPIO->DIRSET = (1 << enablePin); + NRF_GPIO->OUTSET = (1 << enablePin); + + timer2_init(); + timer2_start(); + + uart_setup(); +} + +void loop() { + if (timer2_triggered) { + + // UARTE + writeToBuffer(&uart_tx_data[0],"count=%d \n", counter); + uart_send(); + + // Serial +// Serial.print("count="); +// Serial.println(counter); + + counter++; + + timer2_triggered = false; + } +}