HelloWorld program showing SimpleDMA with mainly UART stuff
Dependencies: SimpleDMA mbed-rtos mbed
main.cpp
- Committer:
- Sissors
- Date:
- 2014-01-04
- Revision:
- 1:418889681f13
- Parent:
- 0:cf18a31facd6
File content as of revision 1:418889681f13:
#include "mbed.h"
#include "rtos.h"
#include "SimpleDMA.h"
DigitalOut led1(LED1);
SimpleDMA dma(0);
RawSerial pc(USBTX, USBRX);
void callback(void) {
pc.printf("Callback!\r\n");
}
void led_thread(void const *args) {
while (true) {
led1 = !led1;
Thread::wait(300);
}
}
int main() {
printf("Start\r\n");
printf("Use DMA to send 10 characters from buffer to buffer\r\n");
printf("Then send them to UART0 (PC)\r\n");
char characters[] = "abcdefgh\r\n"; //Characters we send
char characters2[11]; //Second buffer
//Set source and destination, second argument is true since
//we should run through both arrays
dma.source(characters, true);
dma.destination(characters2, true);
//dma.attach(callback);
//Start transfer of 10 characters
dma.start(10);
while(dma.isBusy());
//Now to UART, enable DMA in UART, destination is now
//a fixed address, so address pointer should not be incremented,
//thus second argument is false. Also set trigger to UART0_RX.
//This sends a new value to the UART as soon as it is possible
#ifdef TARGET_LPC1768
LPC_UART0->FCR |= 1<<3;
dma.destination(&LPC_UART0->THR, false);
#endif
#ifdef TARGET_KL25Z
UART0->C5 |= (1<<7) | (1<<5);
dma.destination(&UART0->D, false);
#endif
dma.source(characters2, true);
dma.trigger(Trigger_UART0_TX);
dma.start(10);
while(dma.isBusy());
printf("\r\n\nNow to show if it doesn't increment the address\r\n");
printf("Also we attach a callback\r\n");
dma.source(characters2, false);
dma.attach(callback);
dma.start(10);
while(dma.isBusy());
printf("\r\n\nFinally we make it a loopback, and use RTOS\r\n");
printf("The LED in another thread continues blinking while DMA send is busy\r\n");
//Make a thread with low priority, to show main thread with DMA gives way to other thread while busy sending
Thread thread(led_thread);
thread.set_priority(osPriorityLow);
#ifdef TARGET_LPC1768
dma.source(&LPC_UART0->THR, false);
#endif
#ifdef TARGET_KL25Z
dma.source(&UART0->D, false);
#endif
//Trigger is now the receiving on the UART
dma.trigger(Trigger_UART0_RX);
//dma.wait blocks the current Thread until finished while allowing other threads to run
dma.wait(10);
printf("\r\n\nFinished :-)\r\n");
//Notice the LED doesn't blink now, since this thread uses all resources in while(1)
while(1);
}
Erik -