一 前记
恒玄BES2500虽然是在耳机上使用的,可它凭借着超低的功耗,强大的资源,可以在很多可穿戴产品以及低功耗产品上使用。最近有一个产品需要用到它的AT指令。就自己实现了一个。中间遇到了一些问题,值得思考和反思一下。
二 源码解析
1 串口的初始化协议:
代码语言:javascript复制static void hal_uart_init(app_remoter_uart_t* remoter_uart)
{
int ret = -1;
if (HAL_UART_ID_0 == remoter_uart->id) {
hal_iomux_set_uart0();
} else if (HAL_UART_ID_1 == remoter_uart->id) {
hal_iomux_set_uart1();
} else {
hal_iomux_set_uart1();
return;
}
// TRACE("uart init id:%d",remoter_uart->id);
ret = hal_uart_open(remoter_uart->id, &uart_cfg);
ASSERT(!ret, "!!%s: UART open failed (%d)!!", __func__, ret);
// hal_uart_irq_set_dma_handler(APP_REMOTE_CONTROL_URART_ID, uart_dma_rx_irq_handler, NULL);
hal_uart_irq_set_dma_handler(remoter_uart->id, remoter_uart->rx_irq_handler, NULL);
remoter_uart->rx_start(remoter_uart);
}
这里注意,使用的是串口1,硬件上特别注意力,BES的串口是可以复用的,前提一定要排查好这个两个IO没被用。
其次,发送和接收中断的初始化一定要搞清楚。笔者就是误删了接收中断。走了一些弯路。
2 串口接收完成中断:
代码语言:javascript复制static void rx_irq_uart1_handler(uint32_t xfer_size, int dma_error, union HAL_UART_IRQ_T status)
{
app_remoter_uart_t* remoter_uart;
ARC_FUNC_ENTER();
remoter_uart = get_uart1_instance();
if (xfer_size) {
app_remoter_cmd_receive(remoter_uart->rx_buff, xfer_size);
uart_rx_start( remoter_uart );
}
ARC_FUNC_EXIT();
}
这几个地方注意中断接收函数。不要漏了。
3 AT指令的主函数:
代码语言:javascript复制void at_command_register(void)
{
at_register_command((uint8_t*)"AGC", (at_callback)get_flash_port, (at_callback)set_flash_port, 0, 0);
at_register_command((uint8_t*)"NSX", (at_callback)get_trigger_port, (at_callback)set_trigger_port, 0, 0);
at_register_command((uint8_t*)"MODE", 0, 0, 0, (at_callback)exec_trigger);
}
AT指令部分,要注意不同数据类型之间的转换。
三 总结反思
1 串口无法接收数据。
针对这个问题,花了一些时间去解决。可最后定位发现,是自己早时候把串口接收中断给注销了。这个问题是一个教训啊。平时版本一定要做好git记录。依靠人的记忆力是不靠谱的。
2 AT指令协议:
这块也是以前调试好的,可上次没保存代码,这次又不得不从新来一次。程序要要积累。就是把每个砖头做好,不要每次来做砖头。