NuMaker tickless example

Committer:
SHLIU1@OANBE02333.nuvoton.com
Date:
Thu Feb 25 15:25:00 2021 +0800
Revision:
21:5424989f037f
Parent:
19:adb1816661ee
Child:
22:59740ecd1781
Support the both V5.X and V6.X for mbed-os

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 19:adb1816661ee 32 #elif defined(TARGET_NUMAKER_IOT_M487)
ccli8 19:adb1816661ee 33 // Serial
ccli8 19:adb1816661ee 34 #define SERIAL_RX D13
ccli8 19:adb1816661ee 35 #define SERIAL_TX D10
ccli8 19:adb1816661ee 36 #define SERIAL_CTS D12
ccli8 19:adb1816661ee 37 #define SERIAL_RTS D11
ccli8 19:adb1816661ee 38
ccli8 17:0f81445cbbf0 39 #elif defined(TARGET_NUMAKER_IOT_M263A)
ccli8 10:d2e2c79389e1 40 // Serial
ccli8 10:d2e2c79389e1 41 #define SERIAL_RX D0
ccli8 10:d2e2c79389e1 42 #define SERIAL_TX D1
ccli8 17:0f81445cbbf0 43 #define SERIAL_CTS PB_9
ccli8 17:0f81445cbbf0 44 #define SERIAL_RTS PB_8
ccli8 10:d2e2c79389e1 45
ccli8 18:e236110ce841 46 #elif defined(TARGET_NUMAKER_M252KG)
ccli8 18:e236110ce841 47 // Serial
ccli8 18:e236110ce841 48 #define SERIAL_RX D0
ccli8 18:e236110ce841 49 #define SERIAL_TX D1
ccli8 18:e236110ce841 50 #define SERIAL_CTS PB_9
ccli8 18:e236110ce841 51 #define SERIAL_RTS PB_8
ccli8 18:e236110ce841 52
ccli8 1:eb1da9d36e12 53 #endif
ccli8 1:eb1da9d36e12 54
ccli8 1:eb1da9d36e12 55 /* This handler is to be called in UART interrupt context (which is extended by Nuvoton's UART HAL implementation
ccli8 1:eb1da9d36e12 56 * on mbed OS) to support wake-up by UART CTS state change. */
ccli8 1:eb1da9d36e12 57 extern "C" void nu_uart_cts_wakeup_handler(UART_T *uart_base);
ccli8 1:eb1da9d36e12 58
ccli8 1:eb1da9d36e12 59 static void poll_serial(void);
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 60 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 61 static void serial_tx_callback(UnbufferedSerial *serial_);
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 62 #else
ccli8 1:eb1da9d36e12 63 static void serial_tx_callback(Serial *serial_);
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 64 #endif
ccli8 1:eb1da9d36e12 65
ccli8 1:eb1da9d36e12 66 /* Support wake-up by UART CTS state change */
ccli8 1:eb1da9d36e12 67 static Semaphore sem_serial(0, 1);
ccli8 1:eb1da9d36e12 68
ccli8 1:eb1da9d36e12 69 void config_uart_wakeup(void)
ccli8 1:eb1da9d36e12 70 {
ccli8 1:eb1da9d36e12 71 static Thread thread_serial;
ccli8 1:eb1da9d36e12 72
ccli8 1:eb1da9d36e12 73 Callback<void()> callback(&poll_serial);
ccli8 1:eb1da9d36e12 74 thread_serial.start(callback);
ccli8 1:eb1da9d36e12 75 }
ccli8 1:eb1da9d36e12 76
ccli8 1:eb1da9d36e12 77 static void poll_serial(void)
ccli8 1:eb1da9d36e12 78 {
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 79 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 80 static UnbufferedSerial serial(SERIAL_TX, SERIAL_RX);
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 81 #else
ccli8 1:eb1da9d36e12 82 static Serial serial(SERIAL_TX, SERIAL_RX);
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 83 #endif
ccli8 1:eb1da9d36e12 84 /* UART CTS wake-up: clock source is not limited.
ccli8 1:eb1da9d36e12 85 * UART data wake-up: clock source is required to be LXT/LIRC. */
ccli8 1:eb1da9d36e12 86 serial.set_flow_control(SerialBase::RTSCTS, SERIAL_RTS, SERIAL_CTS);
ccli8 1:eb1da9d36e12 87
ccli8 1:eb1da9d36e12 88 /* We need to register one interrupt handler to enable interrupt. */
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 89 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 90 Callback<void()> callback((void (*)(UnbufferedSerial *)) &serial_tx_callback, (UnbufferedSerial *) &serial);
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 91 #else
ccli8 1:eb1da9d36e12 92 Callback<void()> callback((void (*)(Serial *)) &serial_tx_callback, (Serial *) &serial);
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 93 #endif
ccli8 1:eb1da9d36e12 94 serial.attach(callback, mbed::SerialBase::TxIrq);
ccli8 1:eb1da9d36e12 95
ccli8 1:eb1da9d36e12 96 while (true) {
ccli8 16:ed2c228cbc9c 97 sem_serial.acquire();
ccli8 16:ed2c228cbc9c 98
ccli8 1:eb1da9d36e12 99 wakeup_eventflags.set(EventFlag_Wakeup_UART_CTS);
ccli8 1:eb1da9d36e12 100 }
ccli8 1:eb1da9d36e12 101 }
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 102 #if MBED_MAJOR_VERSION >= 6
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 103 static void serial_tx_callback(UnbufferedSerial *serial_)
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 104 #else
ccli8 1:eb1da9d36e12 105 static void serial_tx_callback(Serial *serial_)
SHLIU1@OANBE02333.nuvoton.com 21:5424989f037f 106 #endif
ccli8 1:eb1da9d36e12 107 {
ccli8 1:eb1da9d36e12 108 (void) serial_;
ccli8 1:eb1da9d36e12 109 }
ccli8 1:eb1da9d36e12 110
ccli8 1:eb1da9d36e12 111 void nu_uart_cts_wakeup_handler(UART_T *uart_base)
ccli8 1:eb1da9d36e12 112 {
ccli8 1:eb1da9d36e12 113 (void) uart_base;
ccli8 16:ed2c228cbc9c 114
ccli8 16:ed2c228cbc9c 115 /* FIXME: Clear wake-up event to enable re-entering Power-down mode */
ccli8 16:ed2c228cbc9c 116
ccli8 1:eb1da9d36e12 117 sem_serial.release();
ccli8 1:eb1da9d36e12 118 }