目录
概要
STM32 微控制器与 LD3320 语言模块通过串口进行数据交互,实现语音识别和控制功能。
整体架构流程
- 通过STC-ISP将LD3320部分的代码烧录进LD3320自带的STC51单片机中(注意:只有串口版模块具备)。
- 将USB转TTL与LD3320相连接(接线部分见下方技术细节处),通过串口助手测试是否能够收到指令。
- 通过keil将代码烧录进STM32F103C8T6,其中交互部分采用串口收发数据包的形式。
- 连接STM32最小系统板与LD3320和LED,通过ST-LINK(烧录方式可自行选择,确保提前安装好驱动)
技术名词解释
- STC-ISP:是一款用于给 STC 系列单片机烧录程序的软件工具。
- LD3320:是一种语音识别芯片。
- STC51:是一种 8 位的单片机系列。
- STM32F103C8T6:是 STM32 系列的一款 32 位微控制器。
- keil:是一款广泛使用的嵌入式系统开发软件,用于编写和编译程序。
- ST-LINK:是一种用于调试和下载程序的工具。
- LED:发光二极管,常用于指示或显示状态。
- 串口通讯:是一种串行通信方式,按照位(bit)的顺序依次传输数据。
- 串口助手是一种用于辅助进行串口通信调试和数据监测的工具软件。
技术细节
LD3320部分
LDchip.c中用户自定义部分,可自行更改关键词
uint8 LD_AsrAddFixed()
{
uint8 k, flag;
uint8 nAsrAddLength;
#define DATE_A 50
#define DATE_B 20
uint8 code sRecog[DATE_A][DATE_B] =
{
"xiao jun", \
"kai deng", \
"guan deng", \
"liang du jian xiao", \
"da kai chuagn", \
"guan bi chaung", \
};
uint8 code pCode[DATE_A] =
{
CODE_CMD, \
CODE_1, \
CODE_2, \
};
LD3320主函数部分,需要打包词条与32单片机词条一致
void User_handle(uint8 dat)
{
if(0 == dat)
{
G0_flag = ENABLE;
over_time=0;
PrintCom("Welcome!\r\n");
LED = 0;
}
else if(ENABLE == G0_flag)
{
// G0_flag = DISABLE;
// LED = 1;
switch(dat)
{
case CODE_1:
over_time=0;
SRD1 = 1;
PrintCom("@LED_ON\r\n");
break;
case CODE_2:
over_time=0;
SRD1 = 0;
PrintCom("@LED_LOW\r\n");
break;
}
}
else
{
//PrintCom("");
}
}
void tm0_isr() interrupt 1
{
TL0 = 0x00;
TH0 = 0x28;
WDT_CONTR=0x3D;
if(G0_flag == ENABLE)
{
over_time++;
}
}
LD3320串口测试
32单片机代码部分
main.c(要与LD3320保持一致)
#include "stm32f10x.h"
#include "Delay.h"
#include "Serial.h"
#include "string.h"
#include "LED.h"
//PA9(TX)接RX
//PA10(RX)接TX
int main(void)
{
Serial_Init ();
LED_Init();
while(1)
{
if(Serial_RxFlag==1)
{
if(strcmp(Serial_RxPacket,"LED_ON")==0)
{
LED_ON();
Serial_SendString("LED_ON_OK\r\n");
}
else if(strcmp(Serial_RxPacket,"LED_LOW")==0)
{
LED_LOW();
Serial_SendString("LED_LOW_OK\r\n");
}
}
Serial_RxFlag =0;
}
}
串口部分
江科大的串口收发数据包
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "stdarg.h"
char Serial_RxPacket[100];
uint8_t Serial_RxFlag;
void Serial_Init(void)
{
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//ÉÏÀÊäÈë
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx ;//
USART_InitStructure.USART_Parity=USART_Parity_No ;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);//
NVIC_PriorityGroupConfig (NVIC_PriorityGroup_3 );
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1,ENABLE);
}
void Serial_SendByte(uint8_t Byte)
{
USART_SendData(USART1,Byte);
while(USART_GetFlagStatus (USART1,USART_FLAG_TXE)==RESET);
}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{
uint16_t i;
for(i=0;i<Length;i++)
{
Serial_SendByte(Array[i]);
}
}
void Serial_SendString(char *String)
{
uint8_t i;
for(i=0;String[i]!=0;i++)
{
Serial_SendByte(String[i]);
}
}
uint32_t Serial_Pow(uint32_t x,uint32_t y)
{
uint32_t Result=1;
while (y--)
{Result*=x;}
return Result;
}
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{
uint8_t i;
for(i=0;i<Length;i++)
{
Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+0x30);
}
}
int fputc(int ch,FILE *f)
{
Serial_SendByte(ch);
return ch;
}
void Serial_Printf(char *format,...)
{
char String[100];
va_list arg;
va_start(arg,format);
vsprintf(String,format,arg);
va_end(arg);
Serial_SendString(String);
}
void USART1_IRQHandler(void)
{
static uint8_t pRxPacket=0;//
static uint8_t RxState=0;//
if(USART_GetITStatus (USART1,USART_IT_RXNE)==SET)
{
uint8_t RxData=USART_ReceiveData(USART1);
if(RxState==0)
{
if(RxData=='@'&&Serial_RxFlag==0)
{
RxState =1;
pRxPacket=0;
}
}
else if(RxState==1)
{
if(RxData=='\r')
{
RxState=2;
}
else{
Serial_RxPacket[pRxPacket]=RxData;
pRxPacket ++;}
}
else if(RxState==2)
{
if(RxData=='\n')
{
RxState=0;
Serial_RxPacket[pRxPacket]='\0';
Serial_RxFlag=1;
}
}
}
}
开源代码
链接: https://pan.baidu.com/s/1ux5kNWptjNWX_GOn-fcBhg?pwd=2003 提取码: 2003
标签:LED,USART,串口,NVIC,LD3320,InitStructure,STM32F103C8T6,GPIO From: https://blog.csdn.net/JK03820/article/details/140656823