Skip to main content

CSK硬件驱动开发示例

本篇介绍CSK的硬件驱动使用示例,包含UART、PWM、GPIO、I2C等通信接口。 看完本篇你将了解到:

  • uart串口通信实现指令的接收和发送。

1. UART#

1.1 基本介绍#

USART 驱动功能特性如下:

  • 支持 UART(Asynchronous)模式,不支持 Synchronous 模式。

  • 使用硬件 FIFO。

  • 非阻塞数据传输接口,硬件事件通过用户事件回调上报。

  • 支持 DMA 传送(参数可配置)。

  • 支持 Modem 控制模式,支持 RTS/CTS 流控。(可选)

USART 驱动提供的静态接口实例为:Driver_USART0,Driver_USART1。

1.2 使用场景#

目标机器需要使用通讯串口与上位机进行通讯。

1.3 接口说明#

串口初始化接口:用于初始化通讯串口,同时会初始化一个串口ringbuffer来存储接收的数据

// csk uart/** * @brief 串口的初始化,同时会初始化一个串口ringbuffer来存储接收的数据 * @return */void csk_uart_init(void);

串口接收接口:用于接收串口数据

/** * @brief 从串口ringbuffer里面读取数据 * @param  dat              接收数据的指针 * @param  len              要接收的数据长度(单位:byte) * @param  ms               超时时间(单位:ms) * @return              实际收到的数据长度 */int csk_uart_recv(void *dat, int len, int ms);

串口发送接口:用于发送串口数据

/** * @brief 通过串口发送数据 * @param  dat              要发送的数据指针 * @param  len              要发送的数据长度(单位:byte) * @param  ms               超时时间(单位:ms) * @return              实际发送的数据长度 */int csk_uart_send(void *dat, int len, int ms);

1.4 硬件配置#

引脚配置

在硬件配置资源hardware.lini中配置通讯串口(uart2)的Pin脚以及功能。

[peripheral]
  [[peripheral.uart]]
  [[peripheral.uart]]
  [[peripheral.uart]]
    [peripheral.uart.txd]    pin = 4    mux = 2
    [peripheral.uart.rxd]    pin = 5    mux = 2

软件配置

在应用配置资源application.lini中配置通讯串口(uart2)的驱动接口配置。

[driver]
  [driver.uart_ctrl]  uart = 2  baudrate = 115200

1.5 应用实现#

实现通讯串口的初始化和数据接收

代码清单:

  • app_main.c

构建一个通讯串口的数据接收任务初始化接口:

static voiduart_init(void){    csk_uart_init();    if (xTaskCreate(uart_task_proc, "uart_task_proc", 2 * 1024, NULL, 13, NULL) != pdPASS) {        CLOGW("[APP]Failed creating UART task");    }}

完成通讯串口数据接收任务的实现:

static voiduart_task_proc(void *arg){    uint8_t data[MAX_CUSTOM_UART_BUF_CNT];    uint16_t size = 0;
    while (true) {        // 从 UART 读取数据        memset(&data, 0, sizeof(data));
        size = read_data(&data, sizeof(data), 0);        // size = read_data(&data, sizeof(data), portMAX_DELAY);
        // 将数据交给 ScriptEngine 处理        if (size > 0)            script_handle_uart(data, size);    }
    vTaskDelete(NULL);}

在用户的应用入口app_main中调用uart_init进行通讯串口的初始化:

voidapp_main(void){    CLOGD("[APP]Hello world");    csk_handler_register(CSK_EVENT_WAKE_UP, cb_wake_up);    csk_handler_register(CSK_EVENT_ESR_RECOGNITION, cb_esr_recognition);    csk_handler_register(CSK_EVENT_ESR_TIMEOUT, cb_esr_timeout);    csk_handler_register(CSK_EVENT_PLAYER_START, cb_player_start);    csk_handler_register(CSK_EVENT_PLAYER_FINISH, cb_player_finish);
    // 如使用 UART,解除下面这一行的注释    uart_init();

在识别回调接口中,将回调的数据通过ScriptEngine注册的mruby接口透传用户回调数据:

static voidcb_esr_recognition(keyword_attrs_t *key_attrs){    CLOGD("[APP]ESR Recognition: kid=%d", key_attrs->kid);
    // 如需在 ScriptEngine 中处理指令,解除下面这一行的注释    script_handle_intent(key_attrs->txt);}

实现mruby业务

代码清单:

  • intents.rb

在ruby代码中进行业务的部署,根据关键字的的意图进行业务实现:

on_intent "打开空调" do  EngineCore.logger.info "打开空调"  num = EngineCore.storage.get(:open) || 0  EngineCore.logger.info("count: #{num}")  EngineCore.storage.set(:open, num + 1)  UART.transmit "PWR ON"end
on_intent "关闭空调" do  EngineCore.logger.info "关闭空调"  UART.transmit "PWR OFF"end
default_intent do |intent|  EngineCore.logger.info "default_intent: #{intent}"end
on_uart_parsed do |data|  EngineCore.logger.info "UART: #{data}"end

1.6 测试#

通过"小美小美"进行语音唤醒,然后呼唤命令词"打开空调"。

从通讯串口的接收中可以看到,已经正确接收到了发送的数据"PWR ON"。

2021-01-21 21:27:09.379 PWR ON2021-01-21 21:28:34.295 2021-01-21 21:28:34.296 2021-01-21 21:28:35.647 
  • 没帮助 0
  • 文档反馈