diff options
Diffstat (limited to 'src/sample/io_sample/UART/DLPS/io_uart.c')
-rw-r--r-- | src/sample/io_sample/UART/DLPS/io_uart.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/src/sample/io_sample/UART/DLPS/io_uart.c b/src/sample/io_sample/UART/DLPS/io_uart.c new file mode 100644 index 0000000..3df562d --- /dev/null +++ b/src/sample/io_sample/UART/DLPS/io_uart.c @@ -0,0 +1,239 @@ +/** +********************************************************************************************************* +* Copyright(c) 2018, Realtek Semiconductor Corporation. All rights reserved. +********************************************************************************************************** +* @file io_uart.c +* @brief uart interrupt demo +* @details +* @author yuan +* @date 2018-06-28 +* @version v0.1 +********************************************************************************************************* +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "io_uart.h" + +#include <string.h> + +#include "app_task.h" + +#include "trace.h" + + +/* Globals ------------------------------------------------------------------*/ +uint8_t UART_RX_Buffer[256]; +uint8_t UART_RX_Count = 0; + +bool IO_UART_DLPS_Enter_Allowed = false; + +/** + * @brief Initialize uart global data. + * @param No parameter. + * @return void + */ +void global_data_uart_init(void) +{ + IO_UART_DLPS_Enter_Allowed = true; + UART_RX_Count = 0; + memset(UART_RX_Buffer, 0, sizeof(UART_RX_Buffer)); +} + +/** + * @brief Initialization of pinmux settings and pad settings. + * @param No parameter. + * @return void + */ +void board_uart_init(void) +{ + Pad_Config(UART_TX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH); + Pad_Config(UART_RX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH); + + Pinmux_Config(UART_TX_PIN, UART0_TX); + Pinmux_Config(UART_RX_PIN, UART0_RX); +} + +/** + * @brief Initialize uart peripheral. + * @param No parameter. + * @return void + */ +void driver_uart_init(void) +{ + RCC_PeriphClockCmd(APBPeriph_UART0, APBPeriph_UART0_CLOCK, ENABLE); + + /* uart init */ + UART_InitTypeDef UART_InitStruct; + UART_StructInit(&UART_InitStruct); + + UART_Init(UART0, &UART_InitStruct); + + //enable rx interrupt and line status interrupt + UART_INTConfig(UART0, UART_INT_RD_AVA, ENABLE); + UART_INTConfig(UART0, UART_INT_RX_IDLE, ENABLE); + + /* Enable UART IRQ */ + NVIC_InitTypeDef NVIC_InitStruct; + NVIC_InitStruct.NVIC_IRQChannel = UART0_IRQn; + NVIC_InitStruct.NVIC_IRQChannelCmd = (FunctionalState)ENABLE; + NVIC_InitStruct.NVIC_IRQChannelPriority = 3; + NVIC_Init(&NVIC_InitStruct); +} + +/** + * @brief IO enter dlps call back function. + * @param No parameter. + * @return void + */ +void io_uart_dlps_enter(void) +{ + /* Switch pad to Software mode */ + Pad_ControlSelectValue(UART_TX_PIN, PAD_SW_MODE); + Pad_ControlSelectValue(UART_RX_PIN, PAD_SW_MODE); + + System_WakeUpPinEnable(UART_RX_PIN, PAD_WAKEUP_POL_LOW, 0); +} + +/** + * @brief IO exit dlps call back function. + * @param No parameter. + * @return void + */ +void io_uart_dlps_exit(void) +{ + /* Switch pad to Pinmux mode */ + Pad_ControlSelectValue(UART_TX_PIN, PAD_PINMUX_MODE); + Pad_ControlSelectValue(UART_RX_PIN, PAD_PINMUX_MODE); + +} + +/** + * @brief IO enter dlps check function. + * @param No parameter. + * @return void + */ +bool io_uart_dlps_check(void) +{ + return IO_UART_DLPS_Enter_Allowed; +} + +/** + * @brief UARt send data continuous. + * @param No parameter. + * @return void + */ +void uart_senddata_continuous(UART_TypeDef *UARTx, const uint8_t *pSend_Buf, uint16_t vCount) +{ + uint8_t count; + + while (vCount / UART_TX_FIFO_SIZE > 0) + { + while (UART_GetFlagStatus(UARTx, UART_FLAG_TX_FIFO_EMPTY) == 0); + for (count = UART_TX_FIFO_SIZE; count > 0; count--) + { + UARTx->RB_THR = *pSend_Buf++; + } + vCount -= UART_TX_FIFO_SIZE; + } + + while (UART_GetFlagStatus(UARTx, UART_FLAG_TX_FIFO_EMPTY) == 0); + while (vCount--) + { + UARTx->RB_THR = *pSend_Buf++; + } +} + +/** + * @brief Handle uart data function. + * @param No parameter. + * @return void + */ +void io_uart_handle_msg(T_IO_MSG *io_uart_msg) +{ +// uint8_t *p_buf = io_uart_msg.u.buf; + uint16_t subtype = io_uart_msg->subtype; + + if (IO_MSG_UART_RX == subtype) + { + uart_senddata_continuous(UART0, UART_RX_Buffer, UART_RX_Count); + global_data_uart_init(); + while (UART_GetFlagStatus(UART0, UART_FLAG_TX_FIFO_EMPTY) == 0) { IO_UART_DLPS_Enter_Allowed = true; } + } +} + +/** + * @brief Handle uart msg function. + * @param No parameter. + * @return void + */ +void io_handle_uart_msg(T_IO_MSG *io_uart_msg) +{ + io_uart_handle_msg(io_uart_msg); +} + +void UART0_Handler() +{ + uint16_t rx_len = 0; + + /* Read interrupt id */ + uint32_t int_status = UART_GetIID(UART0); + + /* Disable interrupt */ + UART_INTConfig(UART0, UART_INT_RD_AVA | UART_INT_RX_LINE_STS, DISABLE); + + if (UART_GetFlagStatus(UART0, UART_FLAG_RX_IDLE) == SET) + { + /* Clear flag */ + UART_INTConfig(UART0, UART_INT_RX_IDLE, DISABLE); + + /* Send msg to app task */ + T_IO_MSG int_uart_msg; + + int_uart_msg.type = IO_MSG_TYPE_UART; + int_uart_msg.subtype = IO_MSG_UART_RX; + UART_RX_Buffer[UART_RX_Count] = UART_RX_Count; + int_uart_msg.u.buf = (void *)(&UART_RX_Buffer); + if (false == app_send_msg_to_apptask(&int_uart_msg)) + { + APP_PRINT_ERROR0("[io_uart] UART0_Handler: Send int_uart_msg failed!"); + //Add user code here! + return; + } +// IO_UART_DLPS_Enter_Allowed = true; + UART_ClearRxFIFO(UART0); + UART_INTConfig(UART0, UART_INT_RX_IDLE, ENABLE); + } + + switch (int_status & 0x0E) + { + /* Rx time out(0x0C). */ + case UART_INT_ID_RX_DATA_TIMEOUT: + rx_len = UART_GetRxFIFODataLen(UART0); + UART_ReceiveData(UART0, &UART_RX_Buffer[UART_RX_Count], rx_len); + UART_RX_Count += rx_len; + break; + + /* Receive line status interrupt(0x06). */ + case UART_INT_ID_LINE_STATUS: + break; + + /* Rx data valiable(0x04). */ + case UART_INT_ID_RX_LEVEL_REACH: + rx_len = UART_GetRxFIFODataLen(UART0); + UART_ReceiveData(UART0, &UART_RX_Buffer[UART_RX_Count], rx_len); + UART_RX_Count += rx_len; + break; + + /* Tx fifo empty(0x02), not enable. */ + case UART_INT_ID_TX_EMPTY: + /* Do nothing */ + break; + default: + break; + } + + /* enable interrupt again */ + UART_INTConfig(UART0, UART_INT_RD_AVA, ENABLE); +} + +/******************* (C) COPYRIGHT 2018 Realtek Semiconductor Corporation *****END OF FILE****/ |