基于STM32的录⾳机设计(STM32F103+VS1053B)
⼀、环境介绍
MCU:  STM32F103C8T6
开发软件:  Keil5
⾳频模块:  VS1053B
录⾳⽂件存储设备:  SD卡,采⽤SPI协议驱动
显⽰屏:  SPI接⼝的0.96⼨OLED
代码风格:  采⽤寄存器编程,代码简洁、执⾏效率⾼、注释到位、移植⽅便。
⼆、功能介绍
这是基于STM32F103C8T6设计的录⾳机功能,⽀持的功能如下:
1.  按下按键1启动⾃动录⾳,默认为5秒录⾳⼀次,录⾳完毕⾃动保存在SD指定⽬录下。⽂件名称采⽤当前时间命名;⾳频⽂件格式采⽤WAV格式存储。
2.  按下按键2启动⼿动录⾳,按键按下之后开始录⾳,再次按下结束录⾳,录⾳完毕之后,⽂件也是⼀样的保存在SD卡⾥。
3. SD卡⽂件系统采⽤FAT32格式,STM32移植了FATFS开源⽂件系统对SD卡进⾏读写操作。
4. OLED显⽰屏⽤于显⽰当前录⾳机的状态:  空闲、录⾳、回放等状态。
5. 按下按键3,启动⾃动回放功能。⾃动扫描⽬录,按顺序播放录⾳⽂件。
技术介绍:
1.  SD卡采⽤SPI协议驱动,因为对速度没有很⾼要求,SPI协议已经完全满⾜;如果要更⾼的速度,可以采⽤SDIO协议。
2.  ⾳频模块采⽤VS1053B,这个芯⽚⽀持IIS和SPI协议。我这⾥采⽤的是SPI协议驱动,SPI⽐较简单,代码也好移植,可以很⽅便的移植到其他单⽚机上运⾏。VS1053功能⽐较强⼤,⽀持录⾳、解码播放。
3.  ⽂件系统采⽤的是FATFS⽂件系统,这个⽂件系统功能⽐较完善,使⽤免费,⽀持FAT16、FAT32等格式。底层也⽐较好适配移植。当前,除了FATFS以外,还有很多其他的嵌⼊式⽂件系统可以选择,移植都⼤同⼩异。
4. OLED显⽰屏是0.96⼨的。采⽤SPI协议驱动,主要是显⽰⼀些状态,SPI刷屏⽐较快,这款OLED也⽀持IIC接⼝。
5. VS1053模块上没有喇叭设备,可以适应⽿机或者⾳箱听回放的录⾳。
硬件与STM32的接线说明:
OLED显⽰屏:
D0----SCK-----PB14
D1----MOSI----PB13
RES—复位(低电平有效)—PB12
DC---数据和命令控制管脚—PB1
CS---⽚选引脚-----PA7
VS1053:
#define VS1053_DREQ    PAin(11)      //DREQ  数据请求
#define VS1053_RESET    PAout(12)  //RST  硬件复位--低电平有效
#define VS1053_XCS      PAout(13)      //XCS  ⽚选--低电平有效
#define VS1053_XDCS    PAout(14)      //XDCS  ⽤于数据⽚选、字节同步
#define VS1053_SCLK    PAout(15)
#define VS1053_OUTPUT  PBout(3)
#define VS1053_INPUT    PBin(4)
SD卡接⼝:
5V----5V
GND---GND
SPI1_MOSI---PA7
SPI1_MISO---PA6
SPI1_CS---PA4
SPI1_SCK--PA5
三、使⽤的相关硬件STM32F103C8T6系统板:
OLED显⽰屏:
VS1053:
SD卡卡槽:
四、操作说明
开发板有⼀个复位键和⼀个K0按键。
程序下载:
程序⽀持三种模式:
因为开发板只有⼀个K0按键,所以三种模式都是通过⼀个按键进⾏切换的。
⼀个按键是通过按下的计数⽅式进⾏切换的,切换的顺序是⾃动录⾳模式、⼿动录⾳模式、回放模式。
(1)⾃动录⾳模式:按下⼀次按键后,进⼊⾃动录⾳模式,⾃动录⾳模式下,录⾳5秒⾃动退出,退出后⾃动启动播放状态,就是播放刚才5秒录制的⾳频,播放过程中按下按键可以退出播放状态。
(2)⼿动录⾳模式:第⼆次按下K0按键后,进⼊⼿动录⾳模式,⼿动录⾳模式下,可以长时间录⾳,如果要结束录⾳,按下K0按键即可结束;结束后⾃动启动播放状态,就是播放刚才录制的⾳频,播放过程中按下按键可以退出播放状态。
(3)回放模式:第三次按下K0按键后,进⼊回放模式,⾃动扫描wav⽬录,进⾏顺序播放⾳频⽂件。
播放过程中可以按下K0按键退出回放模式。
每次录⾳后的⽂件是存放在SD卡根⽬录下的wav⽬录下。
每个状态都会在OLED显⽰屏上显⽰
也会同时通过串⼝打印到串⼝调试助⼿终端。
五、SD卡上存放的⽂件
SD卡上有两个⽬录:font⽬录和wav⽬录。
font⽬录下存放16x16字库⽂件。
wav⽬录下存放录⾳的⾳频⽂件。
六、部分源码
6.1 VS1053.c  这是VS1053的驱动代码#include "vs1053b.h"
/*
函数功能:移植接⼝--SPI时序读写⼀个字节
函数参数:data:要写⼊的数据
返回值:读到的数据
*/
u8 VS1053_SPI_ReadWriteByte(u8 tx_data)
{
u8 rx_data=0;
u8 i;
for(i=0;i<8;i++)
{
VS1053_SCLK=0;
if(tx_data&0x80){VS1053_OUTPUT=1;}
write的返回值
else {VS1053_OUTPUT=0;}
tx_data<<=1;
VS1053_SCLK=1;
rx_data<<=1;