《课程设计(论文)基于stm32FM电台设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于stm32FM电台设计.doc(15页珍藏版)》请在三一办公上搜索。
1、 成绩课程设计报告题 目:基于STM32的FM电台课程名称: ARM嵌入式系统 学生姓名: 学生学号: 1214040227 系 别: 电子工程学院 专 业: 电子信息科学与技术 届 别: 2012 指导教师: 电子工程学院制2015年4月基于STM32的FM电台学生:王超指导教师:吴琰电子工程学院 电子信息科学与技术1 FM部件介绍1. 主要芯片介绍1.1RDA5820介绍 RDA5820是北京锐迪科推出的一款集成度非常高的立体声FM收发芯片。RDA5820的模式设置通过40H(寄存器地址0X40)寄存器的CHIP_FUNC3:0位来设置,RDA5820可以工作在RX模式、TX模式、PA模式
2、和DAC模式等,本章我们只介绍RX模式和TX模。通过设置CHIP_FUNC3:0=0即可定义当前工作模式为FM接收模式。在该模式下,我们即可实现FM收音机功能。通过设置CHIP_FUNC3:0=1即可定义当前工作模式为FM发送模式。在该模式下,我们即可实现FM电台的功能。1.2 1053简介VS1053是继VS1003后荷兰VLSI公司出品的又一款高性能解码芯片。该芯片可以实现对MP3/OGG/WMA/FLAC/WAV/AAC/MIDI等音频格式的解码,同时还可以支持ADPCM/OGG等格式的编码,性能相对以往的VS1003提升不少。VS1053拥有一个高性能的DSP处理器核VS_DSP,16
3、K的指令RAM,0.5K的数据RAM,通过SPI控制,具有8个可用的通用IO口和一个串口,芯片内部还带了一个可变采样率的立体声ADC(支持咪头/咪头+线路/2线路)、一个高性能立体声DAC及音频耳机放大器。VS1053通过SPI接口来接受输入的音频数据流,它可以是一个系统的从机,也可以作为独立的主机。这里我们只把它当成从机使用。我们通过SPI口向VS1053不停的输入音频数据,它就会自动帮我们解码了,然后从输出通道输出音乐,这时我们接上耳机就能听到所播放的歌曲了,如图1所示。图1 VS1053封装图1.3 74HC4052 简介74HC4052是一款高速CMOS器件,74HC4052引脚兼容H
4、EF4052B。74HC4052遵循JEDEC标准no.7A。 E为低时,4个开关的其中之一将被S0和S1选中(低阻态)。E为高时,所有开关都进入高阻态,直接无视S0和S1。VCC和GND是数字控制端(S0和S1,E)的供电引脚,74HC4052的VCC至GND范围为2.0 V10.0 V。74HC4052的模拟输入/输出端(nY0至nY3,nZ)在上限VCC和下限VEE之间摆动,VCC-VEE应当不超过10.0 V。作为一个数字多路选择器/多路分配器,VEE将被连接到GND上(一般是接地)宽模拟输入电压范围:-5 V+5 V。1.4 TFTLCD简介TFT-LCD即薄膜晶体管液晶显示器。其英
5、文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。2 硬件设计及模块功能实现2.1硬件设计实验设计为FM发射模式,设计发射频率为92.2Mhz,开机显示发射频率,KEY_UP键选择音源输入等信息。按一下KEY_UP键即进入SD卡音源输入模式,这时KEY0:M+(下一曲) KEY2:M-(上一曲)起
6、效,再按第二下进入MIC音源模式,这时KEY_DOWN键起效,可以用它来选择直接播放或者录音储存后播放模式。同时用DS0提示程序正在运行。所要用到的部分硬件资源如下:1) 指示灯DS0, 2) KEY0、KEY1、KEY2和WK_UP等四个按键, 3) TFTLCD模块 ,4) SD卡 ,5) RDA5820 ,6) 74HC4052, 7) VS1053B。 2.1.1 RDA5820与STM32的连接电路这里RDA5820用IIC总线,接在STM32的PB10和PB11两个脚上,下图中OUTL和OUTR接在RDA5820的LIN和RIN,OUTR和OUTL是来自音频选择器(74HC4052
7、)的输出端,作为FM发送时的音源输入。如图2所示。图2 RDA5820与STM32的连接图2.1.2 VS1053解码芯片电路原理VS1053通过7根线同STM32连接,他们是:VS_MISO、VS_MOSI、VS_SCK、VS_XCS、VS_XDCS、VS_DREQ和VS_RST。其中VS_RST是VS1053的复位信号线,低电平有效。VS_DREQ是一个数据请求信号,用来通知主机,VS1053可以接收数据与否。VS_MISO、VS_MOSI和VS_SCK则是VS1053的SPI接口他们在VS_XCS和VS_XDCS下面来执行不同的操作。从上表可以看出,VS1053的SPI是接在STM32的
8、SPI1上面的。 1) 复位VS1053 这里包括了硬复位和软复位,是为了让VS1053的状态回到原始状态,准备解码下一首歌曲。2) 配置VS1053的相关寄存器这里我们配置的寄存器包括VS1053的模式寄存器(MODE)、时钟寄存器(CLOCKF)、音调寄存器(BASS)、音量寄存器(VOL)等。如图3所示。图3 VS1053B音频解码模块原理图2.1.3 SD卡接口和STM32的连接 我们用跳线帽将P10的SD_DT3、SD_CMD、SD_SCK、SD_DT0分别同P12的SD_CS、SPI2_MOSI、SPI2_SCK、SPI2_MISO连接起来,即实现SD卡的SPI模式连接。硬件连接示
9、意图如图4所示:图4 SD卡SPI方式硬件连接示意图 将图中所示的4处,用跳线帽短接,接口实现SD卡与STM32的SPI连接。最后,你还得自备一个SD卡,将其插入板子下面的SD卡接口。2.1.4 TFTLCD显示模块,模块原理图如图5所示:图 5 ALIENTEK 2.8寸TFTLCD模块原理图TFTLCD模块采用2*17的2.54公排针与外部连接,接口定义如图6所示:图6 ALIENTEK 2.8寸TFTLCD模块接口图从图6可以看出,ALIENTEK TFTLCD模块采用16位的并方式与外部连接,之所以不采用8位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用8位数据线,就会
10、比16位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择16位的接口。关于触摸屏本章我们不多介绍,后面的章节会有详细的介绍。该模块的80并口有如下一些信号线:CS:TFTLCD片选信号。WR:向TFTLCD写入数据。RD:从TFTLCD读取数据。D15:0:16位双向数据线。RST:硬复位TFTLCD。RS:命令/数据标志(0,读写命令;1,读写数据)。2.2 模块功能实现22.1 TFTLCD模块控制我们仅以ILI9320控制器为例进行介绍,其他的控制基本都类似。位模式(26万色)下的显存量。模块的16位数据线与显寸的对应关系为565方式,如图7所示:图7 16位数据与显存对应关系图最
11、低5位代表蓝色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。接下来,我们介绍一下ILI9320的几个重要命令,因为ILI9320的命令很多,我们这里不可能一一介绍,有兴趣的大家可以找到ILI9320的datasheet看看。里面对这些命令有详细的介绍。R0,这个命令,有两个功能,如果对它写,则最低位为OSC,用于开启或关闭振荡器。而如果对它读操作,则返回的是控制器的型号。这个命令最大的功能就是通过读它可以得到控制器的型号,而我们代码在知道了控制器的型号之后,可以针对不同型号的控制器,进行不同的初始化。因为93xx系列的初始化,其实都比较类似,我们完全可以用一个代码兼容好几个控制器
12、。I/D1:0:当更新了一个数据之后,根据这两个位的设置来控制地址计数器自动增加/减少1,其关系如图8所示:图8 GRAM显示方向设置图通过这几个位的设置,我们就可以控制屏幕的显示方向了,这种方法虽然简单,但是不是很通用,比如不同的液晶,可能这里差别就比较大,有的甚至无法通用!比如9341和9320就完全不通用。3 软件设计3.1 主函数介绍3.1.1 系统初始化该模块实现对系统各模块的初始化工作,以便后面程序使用这些模块时正常工作。以下是所有初始化函数:delay_init(); /延时函数初始化NVIC_Configuration(); /设置NVIC中断分组2:2位抢占优先级,2位响应优
13、先级uart_init(9600); /串口初始化为9600LCD_Init(); /显示屏初始化KEY_Init(); /按键初始化font_init(); /初始化字库Audiosel_Init(); /初始化音源选择usmart_dev.init(72); /usmart初始化mem_init(SRAMIN); /初始化内部内存池VS_Init(); /初始化VS1053 exfuns_init();/为fatfs相关变量申请内存 f_mount(0,fs0); /挂载SD卡 f_mount(1,fs1); /挂载FLASH.usmart_dev.init(72); /初始化USMART
14、RDA5820_Init(); /初始化FM收发3.1.2 FM信号发射设置该模块实现对RDA5820配置,根据需要这里将模式设置为发射,频率配置为93.6,发射功率设置为最大。以下是所有相关配置函数的调用:RDA5820_Band_Set(0); /设置频段为87108MhzRDA5820_Space_Set(0); /设置步进为100KhzRDA5820_TxPGA_Set(3); /信号增益设置为3RDA5820_TxPAG_Set(63); /发射功率为最大.RDA5820_TX_Mode();/发送模式freqset=9360; /默认为93.6MhzRDA5820_Freq_Set
15、(freqset);/设置频率3.1.3 TFTLCD显示基本信息该模块部分主要在TFTLCD上显示必要的信息,提示用户如何操作。以下是程序内容:POINT_COLOR=RED; /设置字体为红色 Show_Str(60,10,200,16,电台实验,16,0); Show_Str(60,30,200,16,调频92.2Mhz,16,0);Show_Str(60,50,200,16,*,16,0);LCD_ShowString(60,70,200,16,16,2013/11/13); Show_Str(60,90,200,16,KEY0:M+ KEY2:M-,16,0);Show_Str(60
16、,110,200,16,KEY_UP:ModeSet,16,0);3.2 IIC驱动RDA5820 FM收发芯片 该模块部分实现了用IIC驱动RDA5820,从而实现了RDA5820的各种设置。以下是IIC控制RDA5820寄存器读写的具体函数:void RDA5820_WR_Reg(u8 addr,u16 val) /写RDA5820寄存器 IIC_Start(); IIC_Send_Byte(RDA5820_WRITE);/发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(addr); /发送地址IIC_Wait_Ack(); IIC_Send_Byte(val8);
17、 /发送高字节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_Send_Byte(addr); /发送地址IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(RDA5820_READ); /发送读命令IIC_Wai
18、t_Ack(); res=IIC_Read_Byte(1); /读高字节,发送ACKres=8;res|=IIC_Read_Byte(0); /读低字节,发送NACKIIC_Stop();/产生一个停止条件 return res;/返回读到的数据以下是利用以上两个函数实现RDA5820具体配置的函数:u8 RDA5820_Init(void); /初始化函数void RDA5820_RX_Mode(void); /设置RDA5820为RX模式void RDA5820_TX_Mode(void); /设置RDA5820为TX模式void RDA5820_TxPAG_Set(u8 gain); /
19、设置TX发送功率void RDA5820_TxPGA_Set(u8 gain); /设置TX 输入信号增益void RDA5820_Band_Set(u8 band); /设置RDA5820的工作频段void RDA5820_Space_Set(u8 spc); /设置RDA5820的步进频率3.3 SD卡读写驱动该模块利用SPI实现对SD卡的数据读写。 以下是SD卡控制的主要函数:void SD_SPI_Init(void); /SPI硬件层初始化void SD_DisSelect(void); /取消选择,释放SPI总线u8 SD_Select(void); /选择sd卡,并且等待卡准备O
20、Ku8 SD_WaitReady(void); /等待卡准备好u8 SD_GetResponse(u8 Response); /等待SD卡回应u8 SD_RecvData(u8*buf,u16 len); /从sd卡读取一个数据包的内容u8 SD_SendBlock(u8*buf,u8 cmd); /向sd卡写入一个数据包的内容 512字节u8 SD_Initialize(void); /初始化SD卡u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt);/读SD卡u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt);/写SD卡3.4 T
21、FT-LCD显示驱动该模块实现TFT-LCD屏幕的显示驱动,这里只简单列举以下基本函数,不作具体展开:void LCD_Init(void);/初始化void LCD_DisplayOn(void);/开显示void LCD_DisplayOff(void);/关显示void LCD_Clear(u16 Color);/清屏void LCD_SetCursor(u16 Xpos, u16 Ypos); /设置光标void LCD_DrawPoint(u16 x,u16 y); /画点void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color); /快速画点u16
22、 LCD_ReadPoint(u16 x,u16 y); /读点 void Draw_Circle(u16 x0,u16 y0,u8 r);/画圆void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);/画线void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);/画矩形void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);/填充单色void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *colo
23、r);/填充指定颜色void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);/显示一个字符void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size); /显示一个数字void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);/显示 数字void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);/显示一个字符串,12/16字体void LCD_WriteRe
24、g(u8 LCD_Reg, u16 LCD_RegValue);u16 LCD_ReadReg(u8 LCD_Reg);void LCD_WriteRAM_Prepare(void);void LCD_WriteRAM(u16 RGB_Code);void LCD_Scan_Dir(u8 dir);/设置屏扫描方向void LCD_Display_Dir(u8 dir);/设置屏幕显示方向4 下载调试4.1下载验证下载程序后开发板上显示“电台实验”、测试频率、设计者姓名学号、调试日期、以及各按键功能。开机默认为音源选择页如图4.1所示:图4.1 开机界面按下KEY_UP键后进入SD卡音源模式,如图4.2所示:图4.2 SD卡音源界面参考文献1 张洋,刘军,严汉宇 著 .原子教你玩STM32(库函数版).北京航空航天大学出版社。2 微雪电子 3 宁杨,周毓林 著 .嵌入式系统基础及应用.清华大学出版社。4 侯殿有 著 .嵌入式系统开发基础基于ARM9微处理器. C语言程序设计(第二版. 清华大学出版社。5 孙耀贤、张宇平 著 .利用MC12149实现多通道锁相调频发射机. 河北省科学院学报。6 刘守义 著 .高频电子技术. 北京电子工业出版社。