项目中需要 用到两个uart
但主芯片 NRF52832 只有一个串口
尝试过用模拟的方法, 经常丢bit (蓝牙终端导致)
只能使用复用的方法:
开启 ->关闭 --> 再开启(切换IO)–> 在关闭的方法
如何切换参考例程比较容易, 但也有坑
主要是不能用官方的宏定义的串口初始化方法:
APP_UART_FIFO_INIT(&comm_params,
rx_buf,
tx_buf,
uart_event_handle,
APP_IRQ_PRIORITY_LOWEST,
err_code);
这个宏定义会定义一个数组变量, 会泄漏内存或FIFO 异常 造成芯片重启。
// 切换代码
void change_uart_mode(bool mode)
{
if (Work_Mode == mode) return;
Work_Mode = mode;
app_uart_close();
uart_init(mode);
}
/@brief Function for initializing the UART module.
*/
/@snippet [UART Initialization] */
uint8_t rx_buf[UART_RX_BUF_SIZE];
uint8_t tx_buf[UART_TX_BUF_SIZE];
app_uart_buffers_t Uart_Buffers;
void uart_init(bool mode)
{
uint32_t err_code;
uint32_t rx_pin, tx_pin;
if (mode == GPRS_MODE)
{
rx_pin = RX_PIN_NUMBER;
tx_pin = TX_PIN_NUMBER;
}
else
{
rx_pin = GPS_RX_PIN_NUMBER;
tx_pin = GPS_TX_PIN_NUMBER;
}
app_uart_comm_params_t const comm_params =
{
.rx_pin_no = rx_pin,
.tx_pin_no = tx_pin,
.rts_pin_no = RTS_PIN_NUMBER,
.cts_pin_no = CTS_PIN_NUMBER,
.flow_control = APP_UART_FLOW_CONTROL_DISABLED,
.use_parity = false,
#if defined (UART_PRESENT)
.baud_rate = NRF_UART_BAUDRATE_115200
#else
.baud_rate = NRF_UARTE_BAUDRATE_115200
#endif
};
Uart_Buffers.rx_buf = rx_buf;
Uart_Buffers.rx_buf_size = sizeof (rx_buf);
Uart_Buffers.tx_buf = tx_buf;
Uart_Buffers.tx_buf_size = sizeof (tx_buf);
err_code = app_uart_init(&comm_params,
&Uart_Buffers,
uart_event_handle,
APP_IRQ_PRIORITY_LOWEST);
}