Nuvoton
/
NuMaker-mbed-tickless-example
NuMaker tickless example
wakeup_uart.cpp@18:e236110ce841, 2020-02-21 (annotated)
- Committer:
- ccli8
- Date:
- Fri Feb 21 17:52:25 2020 +0800
- Revision:
- 18:e236110ce841
- Parent:
- 17:0f81445cbbf0
- Child:
- 19:adb1816661ee
Support M252
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ccli8 |
1:eb1da9d36e12 | 1 | #include "mbed.h" |
ccli8 |
1:eb1da9d36e12 | 2 | #include "wakeup.h" |
ccli8 |
1:eb1da9d36e12 | 3 | |
ccli8 |
17:0f81445cbbf0 | 4 | #if defined(TARGET_NUMAKER_PFM_NANO130) |
ccli8 |
17:0f81445cbbf0 | 5 | // Serial |
ccli8 |
17:0f81445cbbf0 | 6 | #define SERIAL_RX D0 |
ccli8 |
17:0f81445cbbf0 | 7 | #define SERIAL_TX D1 |
ccli8 |
17:0f81445cbbf0 | 8 | #define SERIAL_CTS PB_7 |
ccli8 |
17:0f81445cbbf0 | 9 | #define SERIAL_RTS PB_6 |
ccli8 |
17:0f81445cbbf0 | 10 | |
ccli8 |
17:0f81445cbbf0 | 11 | #elif defined(TARGET_NUMAKER_PFM_NUC472) |
ccli8 |
1:eb1da9d36e12 | 12 | // Serial |
ccli8 |
1:eb1da9d36e12 | 13 | #define SERIAL_RX PF_0 |
ccli8 |
1:eb1da9d36e12 | 14 | #define SERIAL_TX PD_15 |
ccli8 |
1:eb1da9d36e12 | 15 | #define SERIAL_CTS PD_13 |
ccli8 |
1:eb1da9d36e12 | 16 | #define SERIAL_RTS PD_14 |
ccli8 |
1:eb1da9d36e12 | 17 | |
ccli8 |
1:eb1da9d36e12 | 18 | #elif defined(TARGET_NUMAKER_PFM_M453) |
ccli8 |
1:eb1da9d36e12 | 19 | // Serial |
ccli8 |
1:eb1da9d36e12 | 20 | #define SERIAL_RX A2 |
ccli8 |
1:eb1da9d36e12 | 21 | #define SERIAL_TX A3 |
ccli8 |
1:eb1da9d36e12 | 22 | #define SERIAL_CTS A4 |
ccli8 |
1:eb1da9d36e12 | 23 | #define SERIAL_RTS A5 |
ccli8 |
1:eb1da9d36e12 | 24 | |
ccli8 |
1:eb1da9d36e12 | 25 | #elif defined(TARGET_NUMAKER_PFM_M487) |
ccli8 |
1:eb1da9d36e12 | 26 | // Serial |
ccli8 |
1:eb1da9d36e12 | 27 | #define SERIAL_RX D13 |
ccli8 |
1:eb1da9d36e12 | 28 | #define SERIAL_TX D10 |
ccli8 |
1:eb1da9d36e12 | 29 | #define SERIAL_CTS D12 |
ccli8 |
1:eb1da9d36e12 | 30 | #define SERIAL_RTS D11 |
ccli8 |
1:eb1da9d36e12 | 31 | |
ccli8 |
17:0f81445cbbf0 | 32 | #elif defined(TARGET_NUMAKER_IOT_M263A) |
ccli8 |
10:d2e2c79389e1 | 33 | // Serial |
ccli8 |
10:d2e2c79389e1 | 34 | #define SERIAL_RX D0 |
ccli8 |
10:d2e2c79389e1 | 35 | #define SERIAL_TX D1 |
ccli8 |
17:0f81445cbbf0 | 36 | #define SERIAL_CTS PB_9 |
ccli8 |
17:0f81445cbbf0 | 37 | #define SERIAL_RTS PB_8 |
ccli8 |
10:d2e2c79389e1 | 38 | |
ccli8 |
18:e236110ce841 | 39 | #elif defined(TARGET_NUMAKER_M252KG) |
ccli8 |
18:e236110ce841 | 40 | // Serial |
ccli8 |
18:e236110ce841 | 41 | #define SERIAL_RX D0 |
ccli8 |
18:e236110ce841 | 42 | #define SERIAL_TX D1 |
ccli8 |
18:e236110ce841 | 43 | #define SERIAL_CTS PB_9 |
ccli8 |
18:e236110ce841 | 44 | #define SERIAL_RTS PB_8 |
ccli8 |
18:e236110ce841 | 45 | |
ccli8 |
1:eb1da9d36e12 | 46 | #endif |
ccli8 |
1:eb1da9d36e12 | 47 | |
ccli8 |
1:eb1da9d36e12 | 48 | /* This handler is to be called in UART interrupt context (which is extended by Nuvoton's UART HAL implementation |
ccli8 |
1:eb1da9d36e12 | 49 | * on mbed OS) to support wake-up by UART CTS state change. */ |
ccli8 |
1:eb1da9d36e12 | 50 | extern "C" void nu_uart_cts_wakeup_handler(UART_T *uart_base); |
ccli8 |
1:eb1da9d36e12 | 51 | |
ccli8 |
1:eb1da9d36e12 | 52 | static void poll_serial(void); |
ccli8 |
1:eb1da9d36e12 | 53 | static void serial_tx_callback(Serial *serial_); |
ccli8 |
1:eb1da9d36e12 | 54 | |
ccli8 |
1:eb1da9d36e12 | 55 | /* Support wake-up by UART CTS state change */ |
ccli8 |
1:eb1da9d36e12 | 56 | static Semaphore sem_serial(0, 1); |
ccli8 |
1:eb1da9d36e12 | 57 | |
ccli8 |
1:eb1da9d36e12 | 58 | void config_uart_wakeup(void) |
ccli8 |
1:eb1da9d36e12 | 59 | { |
ccli8 |
1:eb1da9d36e12 | 60 | static Thread thread_serial; |
ccli8 |
1:eb1da9d36e12 | 61 | |
ccli8 |
1:eb1da9d36e12 | 62 | Callback<void()> callback(&poll_serial); |
ccli8 |
1:eb1da9d36e12 | 63 | thread_serial.start(callback); |
ccli8 |
1:eb1da9d36e12 | 64 | } |
ccli8 |
1:eb1da9d36e12 | 65 | |
ccli8 |
1:eb1da9d36e12 | 66 | static void poll_serial(void) |
ccli8 |
1:eb1da9d36e12 | 67 | { |
ccli8 |
1:eb1da9d36e12 | 68 | static Serial serial(SERIAL_TX, SERIAL_RX); |
ccli8 |
1:eb1da9d36e12 | 69 | |
ccli8 |
1:eb1da9d36e12 | 70 | /* UART CTS wake-up: clock source is not limited. |
ccli8 |
1:eb1da9d36e12 | 71 | * UART data wake-up: clock source is required to be LXT/LIRC. */ |
ccli8 |
1:eb1da9d36e12 | 72 | serial.set_flow_control(SerialBase::RTSCTS, SERIAL_RTS, SERIAL_CTS); |
ccli8 |
1:eb1da9d36e12 | 73 | |
ccli8 |
1:eb1da9d36e12 | 74 | /* We need to register one interrupt handler to enable interrupt. */ |
ccli8 |
1:eb1da9d36e12 | 75 | Callback<void()> callback((void (*)(Serial *)) &serial_tx_callback, (Serial *) &serial); |
ccli8 |
1:eb1da9d36e12 | 76 | serial.attach(callback, mbed::SerialBase::TxIrq); |
ccli8 |
1:eb1da9d36e12 | 77 | |
ccli8 |
1:eb1da9d36e12 | 78 | while (true) { |
ccli8 |
16:ed2c228cbc9c | 79 | sem_serial.acquire(); |
ccli8 |
16:ed2c228cbc9c | 80 | |
ccli8 |
1:eb1da9d36e12 | 81 | wakeup_eventflags.set(EventFlag_Wakeup_UART_CTS); |
ccli8 |
1:eb1da9d36e12 | 82 | } |
ccli8 |
1:eb1da9d36e12 | 83 | } |
ccli8 |
1:eb1da9d36e12 | 84 | |
ccli8 |
1:eb1da9d36e12 | 85 | static void serial_tx_callback(Serial *serial_) |
ccli8 |
1:eb1da9d36e12 | 86 | { |
ccli8 |
1:eb1da9d36e12 | 87 | (void) serial_; |
ccli8 |
1:eb1da9d36e12 | 88 | } |
ccli8 |
1:eb1da9d36e12 | 89 | |
ccli8 |
1:eb1da9d36e12 | 90 | void nu_uart_cts_wakeup_handler(UART_T *uart_base) |
ccli8 |
1:eb1da9d36e12 | 91 | { |
ccli8 |
1:eb1da9d36e12 | 92 | (void) uart_base; |
ccli8 |
16:ed2c228cbc9c | 93 | |
ccli8 |
16:ed2c228cbc9c | 94 | /* FIXME: Clear wake-up event to enable re-entering Power-down mode */ |
ccli8 |
16:ed2c228cbc9c | 95 | |
ccli8 |
1:eb1da9d36e12 | 96 | sem_serial.release(); |
ccli8 |
1:eb1da9d36e12 | 97 | } |