后附工程代码
stm32单片机与LD3320语音模块串口通信的方式通信
一、硬件部分
1.stm32单片机系列: stm32f103RCT6最小系统
LD3320的+3V接口可以不管
二、软件部分
1- LD3320官方列程main函数修改部分
2- 编译之后
3- 用stc-isp烧入软件
至此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库使用中断接收方式接收串口信息指令的操作。
首先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);
}
效果图演示
此次演示以点灯效果演示,可以根据自己的要求进行改变代码实现舵机,继电器等控制。
工程代码
链接:https://pan.baidu.com/s/1191TB0TjnUsKqab1KhVgpA
提取码:ar29