前言:

经过这几天研读了很多csdn大佬的优秀的asrpro和stm32的联动文章,总结和反思了之后创新了一个翻转模式连接stm32和asrpro2.0的方法(除了公地和5V接线外,只需要一个TX和RX进行匹配,存在弊端,仅供参考),也试了很多错(差点烧板子了),不过好在有心人,天不负,现将我的方法分享一下,感兴趣的大佬们可以尝试一下~~~

实物连接图

以及:

接线图

  • ASRPRO  A2 → STM32  PB1
  • 5V ↔ 5V
  • GND ↔ GND
  • LED 接 PA0
串口原理概述

从STM32原理图和引脚表可以看出:

  • ASRPRO 串口 1PA2(TX1)PA3(RX1),波特率 9600
  • STM32 可用串口
    • USART1PA9(TX) / PA10(RX)(默认引脚,无需重映射)
    • USART2PA2(TX) / PA3(RX)
    • USART3PB10(TX) / PB11(RX)
  • 电平转换:ASRPRO 是 3.3V 电平,STM32 是 5V 电平,原理图中用 100Ω 限流电阻 + 4.7~10K 上拉电阻 做 5V ↔ 3.3V 适配,同时 TX 配置为开漏模式,保证通信安全。

主包也踩过了三个坑:

  • 引脚重映射问题:我之前把 ASRPRO PA2/PA3 接到了 STM32 PB0/PB1,这需要开启 USART1 完全重映射,很多开发板不支持或配置复杂,导致串口收不到数据。
  • 脉冲 vs 串口指令:ASRPRO 语音识别后只发 单次串口指令(0x01/0x02),不是持续电平。早期用 “读引脚电平翻转” 的方案,只能靠脉冲触发,无法区分 “开灯 / 关灯”,多灯控制时必然混乱。
  • 状态未保存:读电平的代码没有锁存灯的状态,脉冲结束后电平恢复,灯就会闪一下或熄灭。

ASRPRO核心板:

  • 接线
    • ASRPRO PA2(TX1) → STM32 PA10(RX1)USART1 默认 RX)
    • 共 GND,5V 供电按原理图进行连接。
  • 代码逻辑
    • 初始化 USART1 为 9600 8N1,直接接收 0x01/0x02 指令。
    • 收到 0x01 → 置低 PA0(开灯并保持)。
    • 收到 0x02 → 置高 PA0(关灯并保持)。
    • 用状态变量锁存灯的状态,避免脉冲消失后灯状态丢失。

确保ASR PRO 2.0的串口(UART)与STM32的串口正确连接,通常需要交叉连接TX和RX引脚。STM32需配置为接收串口数据,并设置相应的GPIO引脚控制LED。

ASR PRO 2.0需通过语音训练工具(如天问Block)设置语音指令和对应的串口输出数据。例如,定义“开灯”指令发送字符'1',“关灯”发送'0'

STM32代码
#include "stm32f10x.h"

// 接线说明:
// ASRPRO 输出引脚  → STM32 PB1
// LED → STM32 PA0
// GND 共地
// 5V 共5V

#define LED_PIN     GPIO_Pin_0
#define LED_PORT    GPIOA
#define ASR_PIN     GPIO_Pin_1
#define ASR_PORT    GPIOB

void GPIO_Init_All(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    // PA0 推挽输出 → 灯
    GPIO_InitStructure.GPIO_Pin = LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_PORT, &GPIO_InitStructure);
    GPIO_SetBits(LED_PORT, LED_PIN); // 初始关灯

    // PB1 输入 → 接收 ASRPRO 信号
    GPIO_InitStructure.GPIO_Pin = ASR_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入
    GPIO_Init(ASR_PORT, &GPIO_InitStructure);
}

int main(void)
{
    GPIO_Init_All();
    uint8_t led_state = 0; // 0=灭 1=亮

    while(1)
    {
        // 检测到上升沿(ASRPRO 发指令)
        if(GPIO_ReadInputDataBit(ASR_PORT, ASR_PIN) == 1)
        {
            // 延时消抖
            for(int i=0;i<10000;i++);

            if(GPIO_ReadInputDataBit(ASR_PORT, ASR_PIN) == 1)
            {
                // 翻转灯状态
                led_state = !led_state;

                if(led_state)
                    GPIO_ResetBits(LED_PORT, LED_PIN); // 亮
                else
                    GPIO_SetBits(LED_PORT, LED_PIN);   // 灭

                // 等待信号结束
                while(GPIO_ReadInputDataBit(ASR_PORT, ASR_PIN) == 1);
            }
        }
    }
}
ASR PRO 2.0天问block语音指令设置

在天问Block或类似平台中,配置语音指令与串口输出的映射:

  1. 创建新项目,选择ASR PRO 2.0芯片。
  2. 在“语音识别”模块中添加指令,如“开灯”和“关灯”。
  3. 在“串口通信”模块中设置指令触发时发送对应的字符(如10)。
  4. 烧录程序到ASR PRO 2.0模块。
翻转模式实现

具体效果见下面我录制的视频哈

实验效果

调试与测试

测试时需确保串口通信速率(波特率)一致(如9600或115200)。通过串口调试工具监控ASR PRO 2.0的输出数据,验证STM32是否正确响应。若LED无反应,检查硬件连接和GPIO初始化配置。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐