恒玄BES2500串口通信调试及AT指令开发总结

2023-11-27 16:29:26 浏览数 (2)

一 前记

恒玄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指令协议:

这块也是以前调试好的,可上次没保存代码,这次又不得不从新来一次。程序要要积累。就是把每个砖头做好,不要每次来做砖头。

0 人点赞