首页 > 其他分享 >STM32F103C8T6与LD3320进行串口通讯控制LED灯的亮灭

STM32F103C8T6与LD3320进行串口通讯控制LED灯的亮灭

时间:2024-07-24 12:28:49浏览次数:17  
标签:LED USART 串口 NVIC LD3320 InitStructure STM32F103C8T6 GPIO

目录

概要

整体架构流程

技术名词解释

技术细节

LD3320部分

LD3320串口测试

32单片机代码部分

main.c(要与LD3320保持一致)

串口部分

概要

STM32 微控制器与 LD3320 语言模块通过串口进行数据交互,实现语音识别和控制功能。

整体架构流程

  1. 通过STC-ISP将LD3320部分的代码烧录进LD3320自带的STC51单片机中(注意:只有串口版模块具备)。
  2. 将USB转TTL与LD3320相连接(接线部分见下方技术细节处),通过串口助手测试是否能够收到指令。
  3. 通过keil将代码烧录进STM32F103C8T6,其中交互部分采用串口收发数据包的形式。
  4. 连接STM32最小系统板与LD3320和LED,通过ST-LINK(烧录方式可自行选择,确保提前安装好驱动)

技术名词解释

  1. STC-ISP:是一款用于给 STC 系列单片机烧录程序的软件工具。
  2. LD3320:是一种语音识别芯片。
  3. STC51:是一种 8 位的单片机系列。
  4. STM32F103C8T6:是 STM32 系列的一款 32 位微控制器。
  5. keil:是一款广泛使用的嵌入式系统开发软件,用于编写和编译程序。
  6. ST-LINK:是一种用于调试和下载程序的工具。
  7. LED:发光二极管,常用于指示或显示状态。
  8. 串口通讯:是一种串行通信方式,按照位(bit)的顺序依次传输数据。
  9. 串口助手是一种用于辅助进行串口通信调试和数据监测的工具软件。

技术细节

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

相关文章

  • Warning formula.jws.json update failed, falling back to cached version
    Warning:formula.jws.json:updatefailed,fallingbacktocachedversion.MacOS执行服务启动命令时,显示下载失败警告,导致无法启动服务MacBook-Pro~%brewservicesstartnginx==>Downloadinghttps://formulae.brew.sh/api/formula.jws.json########......
  • pod的端口拒绝连接:Liveness probe failed:dial tcp ,connect:connection refused
    昨天在生产环境上发版,发现pod一直起不来,一直到崩溃循环结束: 倒数第三行第四行。这个本质上是健康检查不通过导致的,意思其实是,pod启动起来,运行给定的镜像,但是在设定的超时时间过后,K8S去检查pod是否健康的时候,发现18015这个端口不通,拒绝连接。K8S判定pod存在问题。这里为啥是拒......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • Modelsim仿真时报错Error (vlog-7) Failed to open design unit file XXXXX in read m
    根据之前遇到的问题Vivado关联Modelsim仿真时一直卡在Executinganalysisandcompilationstep…的解决我在TclConsole窗口查看出现的Error信息。出现报错:Error:(vlog-7)Failedtoopendesignunitfile“XXXXX”inreadmode查阅网上解决办法VivadoError:(vlog-......
  • STM32学习(4)--OLED调试工具
    OLED调试工具4.1OLED调试工具1.调试方式2.OLED简介3.硬件电路4.OLED驱动函数4.2OLED显示屏4.1OLED调试工具1.调试方式串口调试:通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息显示屏调试:直接将显示屏连接到单片机,将调试信息打印在显示屏上Keil......
  • AP8100 外围简单的 BOOST 升压恒压控制驱动 LED 大功率升压恒流驱动芯片
    说明AP8100是一款外围电路简单的BOOST升压恒压控制驱动芯片,适用于2.8-40V输入电压范围的升压恒压电源应用领域,启动电压可以低至2.5V。芯片会根据负载的大小自动切换PWM,PFM和BURST模式以提高各个负载端的电源系统效率。本芯片可以通过EN脚实现低待机关机功能,当......
  • 7.用寄存器点亮LED
    7.用寄存器点亮LED7.1GPIO简介GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚。通过将STM32芯片的GPIO引脚与外部设备连接,可以实现外部通信、控制以及数据采集的功能。STM32芯片的GPIO被分成很多组,每组有16个引脚。例如,STM32F103VET6的芯片有GPIOA至GPIOE......
  • pymobiledevice3:如果没有抽象方法“_create_service_connection”的实现,则无法实例化
    全面披露:我不知道我在做什么。我没有编程经验。我已要求ChatGPT为我创建一个程序。ChatGPT为我创建的文件之一名为“device_detection.py”。这个特定文件应该检测通过USB端口连接到我的笔记本电脑的智能手机设备,然后在终端中打印结果。如果这就是我所需要的,那就太好了(并且......
  • WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)-RISC-V/ARM内核MCU无线DAP下
    LinkW-1V1 主机 硬创社搜索(WCH-LinkW):WCH-LinkW无线下载仿真调试器-硬创社 板载PCB天线:2.4G板载天线AD库资源-CSDN文库简介: WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)。应用场景: 1、用于RISC-V/ARM内核MCU无线DAP下载仿真调试器2、......
  • 张高兴的 MicroPython 入门指南:(三)使用串口通信
    目录什么是串口使用方法使用板载串口相互通信硬件需求电路代码使用板载的USB串口参考什么是串口串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指UART(UniversalAsynchronousReceiver/Transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一......