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