HelloWorld program showing SimpleDMA with mainly UART stuff
Dependencies: SimpleDMA mbed-rtos mbed
Revision 0:cf18a31facd6, committed 2013-12-26
- Comitter:
- Sissors
- Date:
- Thu Dec 26 16:32:59 2013 +0000
- Child:
- 1:418889681f13
- Commit message:
- v1.0
;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SimpleDMA.lib Thu Dec 26 16:32:59 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Sissors/code/SimpleDMA/#c3a84c6c432c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Dec 26 16:32:59 2013 +0000 @@ -0,0 +1,79 @@ +#include "mbed.h" +#include "rtos.h" +#include "SimpleDMA.h" + +DigitalOut led1(LED1); +SimpleDMA dma; +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 + UART0->C5 |= (1<<7) | (1<<5); + dma.source(characters2, true); + dma.destination(&UART0->D, false); + 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); + + dma.source(&UART0->D, false); + //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); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Thu Dec 26 16:32:59 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#ee87e782d34f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Dec 26 16:32:59 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/dc225afb6914 \ No newline at end of file