一、材料准备

1.asrpro开发板+喇叭(或者asrpro基础版+麦克风+喇叭)

2.asrpro专用烧录器或者普通的USB-TTL(开发板有手动下载,比较麻烦,我用的很难受)

3.ch32v307vct6评估板(核心板应该也可以)

4.接线

asrpro                 ch32v307vct6

GND                   GND

5v                       5v

PA2                     PA3

PA3                    PA2

二、代码

1、ch32v307vct6端

uatr.c

#include "debug.h"


/* UART2初始化函数 */
void Usart2_Init()
{

        GPIO_InitTypeDef  GPIO_InitStructure;
            USART_InitTypeDef USART_InitStructure;
            NVIC_InitTypeDef  NVIC_InitStructure;

            RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

            // 配置PA2(TX)和PA3(RX)
                    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
                    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                    GPIO_Init(GPIOA, &GPIO_InitStructure);

                    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
                    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                    GPIO_Init(GPIOA, &GPIO_InitStructure);

            GPIO_Init(GPIOA, &GPIO_InitStructure);
            USART_InitStructure.USART_BaudRate = 115200;
            USART_InitStructure.USART_WordLength = USART_WordLength_8b;
            USART_InitStructure.USART_StopBits = USART_StopBits_1;
            USART_InitStructure.USART_Parity = USART_Parity_No;
            USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
            USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
            USART_Init(USART2, &USART_InitStructure);
            USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
             NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
             NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
             NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
             NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
             NVIC_Init(&NVIC_InitStructure);

             USART_Cmd(USART2, ENABLE);
             USART_ClearFlag(USART2,USART_FLAG_TC);//清空串口2的发送标志位
}

main.c

#include "debug.h"
#include "ch32v30x.h"
#include "uart.h"


void USART2_SendByte(uint8_t data) {
    USART_SendData(USART2, data);
    while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // 等待发送完成
}

void USART2_SendString(char *str) {
    while (*str) {
        USART_SendData(USART2, *str++);
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    }
}




int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(115200);
	Usart2_Init();




	while(1)
    {
	    USART2_SendString("OFF");
	    Delay_Ms(1500);
	    USART2_SendString("ON");
	    Delay_Ms(1500);

    }
}

2、ASRPRO端

(1)图片格式

(2)C语言格式

注意:这个是个大家参考的,不能运行的

#include "asr.h"
extern "C"{ void * __dso_handle = 0 ;}
#include "setup.h"
#include "myLib/asr_event.h"
#include "HardwareSerial.h"

uint32_t snid;
String Rec;
void UART1_RX();
void ASR_CODE();

//{speak:小蝶-清新女声,vol:2,speed:10,platform:haohaodada}
//{playid:10001,voice:欢迎使用语音助手,用小心唤醒我。}
//{playid:10002,voice:}

void UART1_RX(){
  while (1) {
    if(Serial1.available() > 0){
      Rec = Serial1.readString();
      Serial1.print(Rec);
      if(Rec == "ON"){
        delay(200);
        enter_wakeup(5000);
        delay(200);
        //{playid:10500,voice:关闭灯光}
        play_audio(10500);
        digitalWrite(4,1);
      }
      if(Rec == "OFF"){
        delay(200);
        enter_wakeup(5000);
        delay(200);
        //{playid:10501,voice:打开灯光}
        play_audio(10501);
        digitalWrite(4,0);
      }
    }
    delay(2);
  }
  vTaskDelete(NULL);
}

/*描述该功能...
*/
void ASR_CODE(){
  switch (snid) {
   case 1:
    digitalWrite(4,0);
    break;
   case 2:
    digitalWrite(4,1);
    break;
  }
  if((snid) == 3){
    digitalWrite(4,0);
  }
  if((snid) == 4){
    digitalWrite(4,1);
  }

}

void hardware_init(){
  setPinFun(2,FORTH_FUNCTION);
  setPinFun(3,FORTH_FUNCTION);
  Serial1.begin(115200);
  Serial1.setTimeout(10);
  Rec = "";
  vol_set(1);
  xTaskCreate(UART1_RX,"UART1_RX",128,NULL,4,NULL);
  vTaskDelete(NULL);
}

void setup()
{
  set_wakeup_forever();
  //{ID:0,keyword:"唤醒词",ASR:"小心",ASRTO:"我在"}
  //{ID:1,keyword:"命令词",ASR:"打开灯光",ASRTO:"好的,马上打开灯光"}
  //{ID:2,keyword:"命令词",ASR:"关闭灯光",ASRTO:"好的,马上关闭灯光"}
  //{ID:3,keyword:"命令词",ASR:"灯光打开",ASRTO:"好的,马上打开灯光"}
  //{ID:4,keyword:"命令词",ASR:"灯光关闭",ASRTO:"好的,马上关闭灯光"}
  setPinFun(4,FIRST_FUNCTION);
  pinMode(4,output);
}

三、运行结果

上电后,语音会一直打开灯光关闭灯光重复话语,lcd灯也会一直打开关闭

希望以上能帮助到你,想要了解更多可以去论坛:ASRPRO学习资源汇总 - 天问开发者 - 好好搭搭论坛 - 好好搭搭在线

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐