stm32单片机与LD3320语音模块交互法二

后附工程代码

stm32单片机与LD3320语音模块串口通信的方式通信
一、硬件部分
1.stm32单片机系列: stm32f103RCT6最小系统

  • 硬件接线:stm32单片机与LD3320语音模块交互法二_第1张图片
    - 更正:stm32的TXD(PB10)、RXD(PB11)

  • stm32单片机与LD3320语音模块交互法二_第2张图片

  • stm32单片机与LD3320语音模块交互法二_第3张图片

  • LD3320的+3V接口可以不管
    二、软件部分
    1- LD3320官方列程main函数修改部分
    stm32单片机与LD3320语音模块交互法二_第4张图片
    stm32单片机与LD3320语音模块交互法二_第5张图片
    2- 编译之后
    stm32单片机与LD3320语音模块交互法二_第6张图片
    3- 用stc-isp烧入软件
    stm32单片机与LD3320语音模块交互法二_第7张图片
    至此LD3320语音模块处理完成,接下来写stm32的程序(stm32是单独的一个工程文件,不要和LD3320的工程文件想成一个)
    1 -串口配置 (创建usart.c和usart.h)
    ①usart.c文件

#include "USART.h"
/*
PB10   :TXD
PB11   : RXD
*/

//串口IO初始化函数
void USART3_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;         //IO端口的初始化
	USART_InitTypeDef USART_InitStructure;			 //串口的初始化
	NVIC_InitTypeDef NVIC_InitStructure;         //使能中断接收
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能IO端口的时钟
  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能串口的时钟
	
	//发送
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;  //发送引脚
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//接收
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11;  //接收引脚
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = bound;    //设置传输的波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //设置传输一帧数据的数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;       //一位停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;					 //无奇偶校验位
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //能使接收的发送
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //无硬件流控制
	USART_Init(USART3,&USART_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);          //优先级分组
	NVIC_InitStructure.NVIC_IRQChannel= USART3_IRQn;         //开启串口3的中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; //抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //响应优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	

	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); //使能串口接收
  	USART_Cmd(USART3,ENABLE);               //使能串口3
	
}

/*
函数名:USART3串口发送函数
功能:  发送数据
入口参数:发送的字符
*/
void USART3_SendString(u8 *str)
{
		u8 index=0;
	  do
		{
					USART_SendData(USART3,str[index]);  //逐一的发送数组中的内容
					while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);  //判断是否发送完 发完为高电平
					index++;
		}
    while(str[index] != 0);   //检查字符串结束标志
}


/*
函数名:USART3中断服务函数
功能:  接收数据
注意:接收数据长度可调:RXCOUNT
*/
void USART3_IRQHandler(void)
{
	u8 temp;
  if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  {
		USART_ClearITPendingBit(USART3,USART_IT_RXNE);
		temp = USART_ReceiveData(USART3);
		if(temp == '\n' || RXCOUNT == 20)   //判断是否接收到一个完整字符
		{
			RXCOUNT = 0;
			RXOVER =1;    //接收数据完成标志位置1
			USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);//失能串口接收中断标志	
		}
		else
		{
			RXBUF[RXCOUNT] = temp;   //依次存放到数组中
			RXCOUNT++;		           //字符长度变化
		}
	}
}

②usart.h文件

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"

//变量引用
extern u8 RXBUF[20];
extern u8 RXOVER;
extern u8 RXCOUNT;

void USART3_Init(u32 bound);
void USART3_SendString(u8 *str);
	
#endif

③main函数

#include "stm32f10x.h"
#include "stdio.h"
#include "USART.h"
#include "delay.h"
#include "sys.h"

//变量声明
u8 RXBUF[20];       //串口存储数组
u8 RXOVER=0;        //串口接收标志位
u8 RXCOUNT=0;       //串口计数变量  
u8 i;               //清空数组变量

//函数声明
void RCC_Configuration(void);
void LED_Configuration(void);
void USART_Deal(void);
//Main Body
int main(void)
{
	RCC_Configuration();
	LED_Configuration();
	USART3_Init(9600);	

	while(1)
	{
		USART_Deal();			
   }
}

//外设时钟使能函数
void RCC_Configuration(void)
{
	/* GPIOx enable */
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

	/* USART2 enable */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
}

//串口处理函数
void USART_Deal(void)
{
		if(RXOVER)
		{
			RXOVER = 0;    //清除接收标志位
			switch(RXBUF[0]-48) //串口接收数据之后进行ascii转化
			{                   //(接收数字 - 数字0的十进制(48)或者16进制(0x30))
				case   1:GPIO_SetBits(GPIOA,GPIO_Pin_10);   //点亮小灯
								 break;
				
				case   2:GPIO_ResetBits(GPIOA,GPIO_Pin_10); //熄灭小灯
								 break;	
				default: break;			
			}
			USART3_SendString(RXBUF);    //发送给pc机上面打印显示			
			for(i=0;i<20;i++)            //将已接收数据的数组清空:共20个字符长度
			{
				 RXBUF[i] = 0;          	 //重置数据缓存区
			}
			USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//始能串口接收 
		}
}
//LED管脚配置函数
void LED_Configuration(void)
{	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

--------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------
补充stm32使用hal库使用中断接收方式接收串口信息指令的操作。
stm32单片机与LD3320语音模块交互法二_第8张图片
stm32单片机与LD3320语音模块交互法二_第9张图片
首先main函数之前定义一个全局变量

uint8_t cmd = 0;

接下来在main函数中的while(1)之前,启动串口中断函数:

  HAL_UART_Receive_IT(&huart1, &cmd, 1);

自己重写串口回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	if(huart->Instance == USART1){
		if(cmd -48 == 1){ //串口接收数据之后进行ascii转化
      HAL_GPIO_WritePin(AD_LED_GPIO_Port,AD_LED_Pin,RESET);
			HAL_UART_Transmit_IT(&huart1, "ON LED!\r\n", sizeof("ON LED!\r\n"));
		}
		if(cmd -48 == 2){
      HAL_GPIO_WritePin(AD_LED_GPIO_Port,AD_LED_Pin,SET);
			HAL_UART_Transmit_IT(&huart1, "OFF LED!\r\n", sizeof("OFF LED!\r\n"));
		}
	}
    HAL_UART_Receive_IT(&huart1, &cmd, 1);
}

效果图演示
此次演示以点灯效果演示,可以根据自己的要求进行改变代码实现舵机,继电器等控制。
stm32单片机与LD3320语音模块交互法二_第10张图片
工程代码
链接:https://pan.baidu.com/s/1191TB0TjnUsKqab1KhVgpA
提取码:ar29

你可能感兴趣的:(实物制作,stm32,单片机,嵌入式)