Nuvoton
/
NuMaker-mbed-tickless-example
NuMaker tickless example
wakeup_uart.cpp
- Committer:
- ccli8
- Date:
- 2017-10-02
- Revision:
- 10:d2e2c79389e1
- Parent:
- 1:eb1da9d36e12
- Child:
- 16:ed2c228cbc9c
File content as of revision 10:d2e2c79389e1:
#include "mbed.h" #include "wakeup.h" #if defined(TARGET_NUMAKER_PFM_NUC472) // Serial #define SERIAL_RX PF_0 #define SERIAL_TX PD_15 #define SERIAL_CTS PD_13 #define SERIAL_RTS PD_14 #elif defined(TARGET_NUMAKER_PFM_M453) // Serial #define SERIAL_RX A2 #define SERIAL_TX A3 #define SERIAL_CTS A4 #define SERIAL_RTS A5 #elif defined(TARGET_NUMAKER_PFM_M487) // Serial #define SERIAL_RX D13 #define SERIAL_TX D10 #define SERIAL_CTS D12 #define SERIAL_RTS D11 #elif defined(TARGET_NUMAKER_PFM_NANO130) // Serial #define SERIAL_RX D0 #define SERIAL_TX D1 #define SERIAL_CTS PB_7 #define SERIAL_RTS PB_6 #endif /* This handler is to be called in UART interrupt context (which is extended by Nuvoton's UART HAL implementation * on mbed OS) to support wake-up by UART CTS state change. */ extern "C" void nu_uart_cts_wakeup_handler(UART_T *uart_base); static void poll_serial(void); static void serial_tx_callback(Serial *serial_); /* Support wake-up by UART CTS state change */ static Semaphore sem_serial(0, 1); void config_uart_wakeup(void) { static Thread thread_serial; Callback<void()> callback(&poll_serial); thread_serial.start(callback); } static void poll_serial(void) { static Serial serial(SERIAL_TX, SERIAL_RX); /* UART CTS wake-up: clock source is not limited. * UART data wake-up: clock source is required to be LXT/LIRC. */ serial.set_flow_control(SerialBase::RTSCTS, SERIAL_RTS, SERIAL_CTS); /* We need to register one interrupt handler to enable interrupt. */ Callback<void()> callback((void (*)(Serial *)) &serial_tx_callback, (Serial *) &serial); serial.attach(callback, mbed::SerialBase::TxIrq); while (true) { int32_t sem_tokens = sem_serial.wait(osWaitForever); if (sem_tokens < 1) { continue; } wakeup_eventflags.set(EventFlag_Wakeup_UART_CTS); } } static void serial_tx_callback(Serial *serial_) { (void) serial_; } void nu_uart_cts_wakeup_handler(UART_T *uart_base) { (void) uart_base; sem_serial.release(); }