赞
踩
后附工程代码
stm32单片机与LD3320语音模块串口通信的方式通信
一、硬件部分
1.stm32单片机系列: stm32f103RCT6最小系统
硬件接线:
- 更正:stm32的TXD(PB10)、RXD(PB11)
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。