38uint8_t
__attribute__((aligned(4))) uart_rxdmabuff[UART_BUFF_LEN];
53 uint32_t uart_clk = 0x00;
55 uint32_t div, mul, clk_ctl, adj_div, m0_fclk_div;
57 m0_fclk_div = cpr_m0_fclk_ctl__m0_fclk_div__getf();
60 mul = (uart_cfg->BaudRate >> 20) & 0xFFFF;
61 div = (uart_cfg->BaudRate >> 4) & 0xFFFF;
63 adj_div = uart_clk / 1000000;
64 clk_ctl = (mul << 16) | (div * adj_div / 32);
66 if (reg_idx == UART0_IDX) {
67 cpr_rstctl_subrst_sw__uart0_rstn__setf(RSTCTL_ENABLE);
68 cpr_rstctl_subrst_sw__uart0_rstn__setf(RSTCTL_DISABLE);
70 val = cpr_lp_ctl_get();
71 val &= ~(UART0_CLK_OFF_PROTECT_EN_BIT);
74 cpr_ctlapbclken_grctl__uart0_pclk_en__setf(ENABLE);
75 cpr_uart0_clk_grctl__uart0_clk_gr__setf(8);
76 cpr_uart0_clk_grctl__uart0_clk_gr_upd__setf(ENABLE);
77 cpr_uart0_clk_ctl_set(clk_ctl);
79 if (reg_idx == UART1_IDX) {
80 cpr_rstctl_subrst_sw__uart1_rstn__setf(RSTCTL_ENABLE);
81 cpr_rstctl_subrst_sw__uart1_rstn__setf(RSTCTL_DISABLE);
83 val = cpr_lp_ctl_get();
84 val &= ~(UART1_CLK_OFF_PROTECT_EN_BIT);
87 cpr_ctlapbclken_grctl__uart1_pclk_en__setf(ENABLE);
88 cpr_uart1_clk_grctl__uart1_clk_gr__setf(8);
89 cpr_uart1_clk_grctl__uart1_clk_gr_upd__setf(ENABLE);
90 cpr_uart1_clk_ctl_set(clk_ctl);
92 if (reg_idx == UART2_IDX) {
93 cpr_rstctl_subrst_sw__uart2_rstn__setf(RSTCTL_ENABLE);
94 cpr_rstctl_subrst_sw__uart2_rstn__setf(RSTCTL_DISABLE);
96 cpr_uart2_clk_grctl__uart2_pclk_en__setf(ENABLE);
97 cpr_uart2_clk_grctl__uart2_clk_gr__setf(8);
98 cpr_uart2_clk_grctl__uart2_clk_gr_upd__setf(ENABLE);
100 cpr_uart2_clk_ctl_set(clk_ctl);
103 uart_tcr__dlab__setf(reg_idx, UART_TCR_DLAB_DLLH_ENABLE);
104 uart_dll__dll__setf(reg_idx, (uart_cfg->BaudRate & 0xF));
105 uart_ier_set(reg_idx, 0);
106 uart_tcr__dlab__setf(reg_idx, UART_TCR_DLAB_DLLH_DISABLE);
108 while (uart_usr_get(reg_idx) == 1) {
111 uart_tcr__eps__setf(reg_idx, uart_cfg->Parity);
113 uart_tcr__stop__setf(reg_idx, uart_cfg->StopBits);
115 uart_tcr__cls__setf(reg_idx, uart_cfg->WordLength);
117 uart_mcr__afce__setf(reg_idx, uart_cfg->HardwareFlowControl);
119 uart_fcr_pack(reg_idx, UART_FCR_RCVR_TRIGGER_FIFO_2_1, UART_FCR_TX_EMPTY_TRIGGER_FIFO_2_1,
120 UART_FCR_XMIT_FIFO_RESET_CLEAR, UART_FCR_RCVR_FIFO_RESET_CLEAR, UART_FCR_FIFO_ENABLE_ENABLE);
130 if (uart_tsr__thre__getf(reg_idx) & UART_TSR_THRE_VALID) {
135 uart_thr__thr__setf(reg_idx,
byte);
140 for (
int i = 0; i < len; i++) {
147 memset(&uart_ctl_block, 0,
sizeof(uart_ctl_block));
148 uart_ctl_block.uart_receive_cb = NULL;
158 IIR = uart_iir__iid__getf(reg_idx);
159 TSR = uart_tsr_get(reg_idx);
161 if (((IIR & IID_MASK) == UART_IIR_IID_BUSY)) {
162 uart_usr_get(reg_idx);
165 if (((IIR & IID_MASK) == UART_IIR_IID_ETSI)) {
166 DEBUG(
"line=%d, error handle \n", __LINE__);
169 if (((IIR & IID_MASK) == UART_IIR_IID_ERDAI)) {
170 TSR = uart_tsr_get(reg_idx);
171 while ((TSR & UART_TSR_DR_VALID) == UART_TSR_DR_VALID) {
172 rx_val = uart_rbr__rbr__getf(reg_idx);
173 TSR = uart_tsr_get(reg_idx);
174 if (uart_ctl_block.uart_receive_cb != NULL) {
175 uart_ctl_block.uart_receive_cb(&rx_val, 1);
180 if ((IIR & IID_MASK) == UART_IIR_IID_TO) {
181 TSR = uart_tsr_get(reg_idx);
182 while ((TSR & UART_TSR_DR_VALID) == UART_TSR_DR_VALID) {
184 rx_val = uart_rbr__rbr__getf(reg_idx);
185 TSR = uart_tsr_get(reg_idx);
186 if (uart_ctl_block.uart_receive_cb != NULL) {
187 uart_ctl_block.uart_receive_cb(&rx_val, 1);
UART Init Structure Definition
CLOCK_HFCLK_In_Typedef xc_clock_hfclk_in_get(void)
xc_clock_hfclk_in_get
void xc_uart_register_receive_cb(uart_handler_callback uart_cb)
__WEAK void uart_user_handler(uint8_t reg_idx)
uint8_t __attribute__((aligned(4)))
void xc_uart_enable_rx_it(uint8_t reg_idx)
void xc_uart_ctl_block_reset(void)
void xc_uart_send_byte(uint8_t reg_idx, uint8_t byte)
void xc_uart_send_data(uint8_t reg_idx, uint8_t *data, uint16_t len)
void xc_uart_disable_rx_it(uint8_t reg_idx)
The header of xc_drv_uart.c
void(* uart_handler_callback)(uint8_t *buff, uint16_t len)
void xc_uart_init(uint8_t reg_idx, UART_InitCfg_t *uart_cfg)