若该文为原创文章,转载请注明原文出处。

记录下SU-03T通过串口和STM32通讯处理应用

一、实物图

二、原理图

引脚定义

三、固件生成

1、平台介绍

智能公元/AI产品零代码平台

自行注册

2、创建产品

注册账号后依次点击产品管理,所有产品,创建产品(按照序号1-2-3)

3、点击台灯

4、点击纯离线方案

5、选择型号

点击SU-03T

如图设置,产品名称自定义,设置完点下一步

6、串口设置

7、自定义唤醒词(只支持中文)

8、控制详细

参数

9、固件生成

点击网页右上角的保存和发布版本

等待10-30分钟即可下载固件
 

四、固件烧写

烧写固件需要TTL转串口工具。

接线:

打开下载的固件

模块先不上电,点击烧写后在上电,会自动烧写

五、STM32串口程序

使用的是串口1,需要做的是接收数据并解析

1、串口1初始化

*/
void Usart1_Init(unsigned int baud)
{

	GPIO_InitTypeDef gpio_initstruct;
	USART_InitTypeDef usart_initstruct;
	NVIC_InitTypeDef nvic_initstruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	//PA9	TXD
	gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
	gpio_initstruct.GPIO_Pin = GPIO_Pin_9;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	//PA10	RXD
	gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	gpio_initstruct.GPIO_Pin = GPIO_Pin_10;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	usart_initstruct.USART_BaudRate = baud;
	usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		//无硬件流控
	usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;						//接收和发送
	usart_initstruct.USART_Parity = USART_Parity_No;									//无校验
	usart_initstruct.USART_StopBits = USART_StopBits_1;								//1位停止位
	usart_initstruct.USART_WordLength = USART_WordLength_8b;							//8位数据位
	USART_Init(USART1, &usart_initstruct);
	
	USART_Cmd(USART1, ENABLE);														//使能串口
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);									//使能接收中断
	
	nvic_initstruct.NVIC_IRQChannel = USART1_IRQn;
	nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
	nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;
	nvic_initstruct.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&nvic_initstruct);

}

2、中断处理


// 语音识别功能
void USART1_IRQHandler(void)
{
    u8 res;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
    {
        res = USART_ReceiveData(USART1);
        
        rec_buf[rec_cnt] = res;
        rec_cnt++;

        if(rec_cnt >= 3)  // 只需要接收2个字节的指令
        {
            // 收到完整指令
            u8 cmd1 = rec_buf[0];
            u8 cmd2 = rec_buf[1];
            rec_cnt = 0;  // 重置接收计数器
            
            if((cmd1 == 0x3f) && (cmd2 == 0x01))  // 指令处理
            {
                
            }
        }
        
        USART_ClearFlag(USART1, USART_FLAG_RXNE);
    }
}

以上就是全部流程

如有侵权,或需要完整代码,请及时联系博主。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐