基于STM32的FM电台 下载本文

内容发布更新时间 : 2024/5/10 16:19:35星期一 下面是文章的全部内容请认真阅读。

数字FM电台设计开发

频文件的总长度。

最后我们介绍一下VOL这个寄存器,该寄存器用于控制VS1053的输出音量,该寄存器可以分别控制左右声道的音量,每个声道的控制范围为0~254,每个增量代表0.5db的衰减,所以该值越小,代表音量越大。比如设置为0X0000则音量最大,而设置为0XFEFE则音量最小。注意:如果设置VOL的值为0XFFFF,将使芯片进入掉电模式!

22

数字FM电台设计开发

第3章 软件设计

电台软件设计流程图

23

3.1 FM

数字FM电台设计开发

3.2 软件设计结构框图

3.3 主函数介绍

3.3.1 系统初始化

该模块实现对系统各模块的初始化工作,以便后面程序使用这些模块时正常工作。以下是所有初始化函数:

delay_init(); 优先级

uart_init(9600); //串口初始化为9600 LCD_Init(); //显示屏初始化 KEY_Init(); //按键初始化 font_init(); //初始化字库 Audiosel_Init(); //初始化音源选择 usmart_dev.init(72); //usmart初始化 mem_init(SRAMIN); //初始化内部内存池 VS_Init();

//延时函数初始化

NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应

//初始化VS1053

24

数字FM电台设计开发

exfuns_init(); //为fatfs相关变量申请内存

f_mount(0,fs[0]); //挂载SD卡 f_mount(1,fs[1]); //挂载FLASH. usmart_dev.init(72); //初始化USMART RDA5820_Init(); //初始化FM收发

3.3.2 FM信号发射设置

该模块实现对RDA5820配置,根据需要这里将模式设置为发射,频率配置为93.6,发射功率设置为最大。以下是所有相关配置函数的调用:

RDA5820_Band_Set(0); //设置频段为87~108Mhz RDA5820_Space_Set(0); RDA5820_TxPGA_Set(3); RDA5820_TX_Mode(); freqset=9360;

//设置步进为100Khz //信号增益设置为3

//发送模式

RDA5820_TxPAG_Set(63); //发射功率为最大.

//默认为93.6Mhz

RDA5820_Freq_Set(freqset); //设置频率

3.3.3 TFTLCD显示基本信息

该模块部分主要在TFTLCD上显示必要的信息,提示用户如何操作。以下是程序内容:

POINT_COLOR=RED; //设置字体为红色 Show_Str(60,10,200,16,\电台实验\ Show_Str(60,30,200,16,\调频92.2Mhz\

Show_Str(60,50,200,16,\

LCD_ShowString(60,70,200,16,16,\Show_Str(60,90,200,16,\:M+ KEY2:M-\Show_Str(60,110,200,16,\Set\

3.3.4 音频源的选择

该模块部分选择FM发射的音源,通过按键KEY_UP来切换音源(SD卡MP3和MIC麦克风之间的切换),默认为SD卡MP3音源。以下是两个音源控制的函数调用:

mp3_play(); //SD卡MP3音源 recoder_play(); //麦克风音源

3.4 IIC驱动RDA5820 FM收发芯片

该模块部分实现了用IIC驱动RDA5820,从而实现了RDA5820的各种设置。\\

25

数字FM电台设计开发

以下是IIC控制RDA5820寄存器读写的具体函数:

void RDA5820_WR_Reg(u8 addr,u16 val) //写RDA5820寄存器 {

IIC_Start();

IIC_Send_Byte(RDA5820_WRITE); //发送写命令 IIC_Wait_Ack();

//发送地址

//发送高字节

IIC_Wait_Ack();

IIC_Send_Byte(addr);

IIC_Send_Byte(val>>8); IIC_Wait_Ack();

IIC_Send_Byte(val&0XFF); //发送低字节

IIC_Wait_Ack(); IIC_Stop(); }

u16 RDA5820_RD_Reg(u8 addr) //读RDA5820寄存器 { u16 res;

IIC_Start();

IIC_Send_Byte(RDA5820_WRITE); //发送写命令

IIC_Wait_Ack();

//发送地址

IIC_Wait_Ack();

IIC_Send_Byte(addr); IIC_Start();

//产生一个停止条件

IIC_Send_Byte(RDA5820_READ); //发送读命令 IIC_Wait_Ack();

res=IIC_Read_Byte(1); res<<=8;

res|=IIC_Read_Byte(0);

//读低字节,发送NACK //产生一个停止条件 //返回读到的数据

//读高字节,发送ACK

IIC_Stop(); }

return res;

26