BLE5.2 1.0
开发文档说明
xc_drv_uart.c
浏览该文件的文档.
1
25/*-----------------------------------------------------------------------------------
26 INCLUDE HEADE FILES
27 ------------------------------------------------------------------------------------*/
28#include "xc_drv_uart.h"
29
30/*------------------------------------------------------------------------------------
31 Macros
32 -------------------------------------------------------------------------------------*/
33
34/*------------------------------------------------------------------------------------
35 Local Variables
36 -------------------------------------------------------------------------------------*/
37uint8_t __attribute__((aligned(4))) uart_txdmabuff[UART_BUFF_LEN];
38uint8_t __attribute__((aligned(4))) uart_rxdmabuff[UART_BUFF_LEN];
39
40UART_Block_t uart_ctl_block;
41
42/*------------------------------------------------------------------------------------
43 Func Prototype
44 -------------------------------------------------------------------------------------*/
45
46/*------------------------------------------------------------------------------------
47 Functions
48-------------------------------------------------------------------------------------*/
49
50void xc_uart_init(uint8_t reg_idx, UART_InitCfg_t *uart_cfg)
51{
52 uint32_t val;
53 uint32_t uart_clk = 0x00;
54
55 uint32_t div, mul, clk_ctl, adj_div, m0_fclk_div;
56
57 m0_fclk_div = cpr_m0_fclk_ctl__m0_fclk_div__getf();
58 uart_clk = xc_clock_hfclk_in_get() * (m0_fclk_div + 1);
59
60 mul = (uart_cfg->BaudRate >> 20) & 0xFFFF;
61 div = (uart_cfg->BaudRate >> 4) & 0xFFFF;
62
63 adj_div = uart_clk / 1000000;
64 clk_ctl = (mul << 16) | (div * adj_div / 32);
65
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);
69
70 val = cpr_lp_ctl_get();
71 val &= ~(UART0_CLK_OFF_PROTECT_EN_BIT);
72 cpr_lp_ctl_set(val);
73
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);
78 }
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);
82
83 val = cpr_lp_ctl_get();
84 val &= ~(UART1_CLK_OFF_PROTECT_EN_BIT);
85 cpr_lp_ctl_set(val);
86
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);
91 }
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);
95
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);
99
100 cpr_uart2_clk_ctl_set(clk_ctl);
101 }
102
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);
107
108 while (uart_usr_get(reg_idx) == 1) {
109 };
110
111 uart_tcr__eps__setf(reg_idx, uart_cfg->Parity);
112
113 uart_tcr__stop__setf(reg_idx, uart_cfg->StopBits);
114
115 uart_tcr__cls__setf(reg_idx, uart_cfg->WordLength);
116
117 uart_mcr__afce__setf(reg_idx, uart_cfg->HardwareFlowControl);
118
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);
121}
122
123void xc_uart_enable_rx_it(uint8_t reg_idx) { uart_ier__erdai__setf(reg_idx, UART_IER_ERDAI_ENABLE); }
124
125void xc_uart_disable_rx_it(uint8_t reg_idx) { uart_ier__erdai__setf(reg_idx, UART_IER_ERDAI_DISABLE); }
126
127void xc_uart_send_byte(uint8_t reg_idx, uint8_t byte)
128{
129 while (1) {
130 if (uart_tsr__thre__getf(reg_idx) & UART_TSR_THRE_VALID) {
131 break;
132 }
133 }
134
135 uart_thr__thr__setf(reg_idx, byte);
136}
137
138void xc_uart_send_data(uint8_t reg_idx, uint8_t *data, uint16_t len)
139{
140 for (int i = 0; i < len; i++) {
141 xc_uart_send_byte(reg_idx, data[i]);
142 }
143}
144
146{
147 memset(&uart_ctl_block, 0, sizeof(uart_ctl_block));
148 uart_ctl_block.uart_receive_cb = NULL;
149}
150
151void xc_uart_register_receive_cb(uart_handler_callback uart_cb) { uart_ctl_block.uart_receive_cb = uart_cb; }
152
153__WEAK void uart_user_handler(uint8_t reg_idx)
154{
155 uint8_t rx_val;
156 uint32_t IIR, TSR;
157
158 IIR = uart_iir__iid__getf(reg_idx);
159 TSR = uart_tsr_get(reg_idx);
160
161 if (((IIR & IID_MASK) == UART_IIR_IID_BUSY)) {
162 uart_usr_get(reg_idx);
163 }
164
165 if (((IIR & IID_MASK) == UART_IIR_IID_ETSI)) {
166 DEBUG("line=%d, error handle \n", __LINE__);
167 }
168
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);
176 }
177 }
178 }
179
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) {
183
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);
188 }
189 }
190 }
191}
192
193void UART0_Handler(void) { uart_user_handler(UART0_IDX); }
194
195void UART1_Handler(void) { uart_user_handler(UART1_IDX); }
196
197void UART2_Handler(void) { uart_user_handler(UART2_IDX); }
UART Init Structure Definition
Definition xc_drv_uart.h:60
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)
void UART1_Handler(void)
__WEAK void uart_user_handler(uint8_t reg_idx)
void UART2_Handler(void)
uint8_t __attribute__((aligned(4)))
Definition xc_drv_uart.c:37
void UART0_Handler(void)
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)
Definition xc_drv_uart.h:41
void xc_uart_init(uint8_t reg_idx, UART_InitCfg_t *uart_cfg)