aboutsummaryrefslogtreecommitdiff
path: root/src/sample/io_sample/UART/Polling/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sample/io_sample/UART/Polling/main.c')
-rw-r--r--src/sample/io_sample/UART/Polling/main.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/src/sample/io_sample/UART/Polling/main.c b/src/sample/io_sample/UART/Polling/main.c
new file mode 100644
index 0000000..abc03d4
--- /dev/null
+++ b/src/sample/io_sample/UART/Polling/main.c
@@ -0,0 +1,213 @@
+/**
+*********************************************************************************************************
+* Copyright(c) 2018, Realtek Semiconductor Corporation. All rights reserved.
+**********************************************************************************************************
+* @file main.c
+* @brief uart demo polling tx and rx.
+* @details
+* @author yuan
+* @date 2018-06-28
+* @version v0.1
+*********************************************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <string.h>
+#include "rtl876x_nvic.h"
+#include "rtl876x_pinmux.h"
+#include "rtl876x_rcc.h"
+#include "rtl876x_uart.h"
+#include "trace.h"
+
+/* Defines ------------------------------------------------------------------*/
+#define UART_TX_PIN P3_0
+#define UART_RX_PIN P3_1
+
+
+/** @brief UART_BaudRate_Table
+ * div ovsr ovsr_adj :These three parameters set the baud rate calibration parameters of UART.
+ baudrate | div | ovsr | ovsr_adj
+--------------------------------------------------------
+ 1200Hz | 2400 | 8 | 0x3EF
+ 2400Hz | 1200 | 8 | 0x3EF
+ 4800Hz | 600 | 8 | 0x3EF
+ 9600Hz | 300 | 8 | 0x3EF
+ 14400Hz | 250 | 6 | 0x010
+ 19200Hz | 150 | 8 | 0x3EF
+ 28800Hz | 125 | 6 | 0x010
+ 38400Hz | 75 | 8 | 0x3EF
+ 57600Hz | 50 | 8 | 0x3EF
+ 76800Hz | 43 | 7 | 0x010
+ 115200Hz | 20 | 12 | 0x252
+ 128000Hz | 19 | 11 | 0x2AA
+ 153600Hz | 17 | 10 | 0x292
+ 230400Hz | 11 | 10 | 0x3BB
+ 460800Hz | 6 | 9 | 0x0AA
+ 500000Hz | 8 | 5 | 0
+ 921600Hz | 3 | 9 | 0x0AA
+ 1000000Hz | 4 | 5 | 0
+ 1382400Hz | 2 | 9 | 0x0AA
+ 1444400Hz | 2 | 8 | 0x3F7
+ 1500000Hz | 2 | 8 | 0x292
+ 2000000Hz | 2 | 5 | 0
+ 3000000Hz | 1 | 8 | 0x292
+-----------------------------------------------------
+*/ /* End of UART_BaudRate_Table */
+
+/* Globals ------------------------------------------------------------------*/
+typedef struct
+{
+ uint16_t div;
+ uint16_t ovsr;
+ uint16_t ovsr_adj;
+} UART_BaudRate_TypeDef;
+
+typedef enum
+{
+ BAUD_RATE_9600,
+ BAUD_RATE_19200,
+ BAUD_RATE_115200,
+ BAUD_RATE_230400,
+ BAUD_RATE_256000,
+ BAUD_RATE_384000,
+ BAUD_RATE_460800,
+ BAUD_RATE_921600,
+ BAUD_RATE_1000000,
+ BAUD_RATE_2000000,
+ BAUD_RATE_3000000
+} UartBaudRate_TypeDef;
+
+const UART_BaudRate_TypeDef BaudRate_Table[11] =
+{
+ {271, 10, 0x24A}, // BAUD_RATE_9600
+ {150, 8, 0x3EF}, // BAUD_RATE_19200
+ {20, 12, 0x252}, // BAUD_RATE_115200
+ {11, 10, 0x3BB}, // BAUD_RATE_230400
+ {11, 9, 0x084}, // BAUD_RATE_256000
+ {7, 9, 0x3EF}, // BAUD_RATE_384000
+ {6, 9, 0x0AA}, // BAUD_RATE_460800
+ {3, 9, 0x0AA}, // BAUD_RATE_921600
+ {4, 5, 0}, // BAUD_RATE_1000000
+ {2, 5, 0}, // BAUD_RATE_2000000
+ {1, 8, 0x292}, // BAUD_RATE_3000000
+};
+
+uint8_t String_Buf[100];
+
+/**
+ * @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)
+{
+ UART_DeInit(UART0);
+
+ RCC_PeriphClockCmd(APBPeriph_UART0, APBPeriph_UART0_CLOCK, ENABLE);
+
+ /* uart init */
+ UART_InitTypeDef UART_InitStruct;
+ UART_StructInit(&UART_InitStruct);
+
+ /* Config uart baudrate */
+ UART_InitStruct.UART_Div = BaudRate_Table[BAUD_RATE_115200].div;
+ UART_InitStruct.UART_Ovsr = BaudRate_Table[BAUD_RATE_115200].ovsr;
+ UART_InitStruct.UART_OvsrAdj = BaudRate_Table[BAUD_RATE_115200].ovsr_adj;
+
+ UART_Init(UART0, &UART_InitStruct);
+}
+
+/**
+ * @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 Demo code of uart.
+ * @param No parameter.
+ * @return void
+*/
+void uart_demo(void)
+{
+ uint16_t demo_str_len = 0;
+ uint8_t rx_byte = 0;
+
+ board_uart_init();
+ driver_uart_init();
+
+ char *demo_str = "### Uart demo polling read uart data ###\r\n";
+ demo_str_len = strlen(demo_str);
+ memcpy(String_Buf, demo_str, demo_str_len);
+
+ /* Send demo tips */
+ uart_senddata_continuous(UART0, String_Buf, demo_str_len);
+
+ /* Loop rx and tx */
+ while (1)
+ {
+ if (UART_GetFlagStatus(UART0, UART_FLAG_RX_DATA_AVA) == SET)
+ {
+ rx_byte = UART_ReceiveByte(UART0);
+ UART_SendByte(UART0, rx_byte);
+ }
+ }
+}
+
+/**
+ * @brief Entry of app code
+ * @return int (To avoid compile warning)
+ */
+int main(void)
+{
+ extern uint32_t random_seed_value;
+ srand(random_seed_value);
+ uart_demo();
+
+ while (1)
+ {
+ __nop();
+ __nop();
+ __nop();
+ __nop();
+ __nop();
+ __nop();
+ }
+}
+
+/******************* (C) COPYRIGHT 2018 Realtek Semiconductor Corporation *****END OF FILE****/