NuMaker tickless example

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?

UserRevisionLine numberNew 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 }