OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9423|回复: 3

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第五十六章 USB声卡实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-4-24 21:56:03 | 显示全部楼层 |阅读模式
 

第五十六章 USB声卡实验

     上一章我们向大家介绍了如何利用STM32USB来做一个USB读卡器,本章我们将利用STM32USB来做一个声卡。本章分为如下几个部分:

56.1 USB读卡器简介

56.2 硬件设计

56.3 软件设计

56.4 下载验证


56.1 USB声卡简介

ALIENTEK战舰STM32板载了一个PWM DAC电路,可以用来做DAC输出,通过和STM32USB和定时器配合,我们就可以实现一个USB声卡。

本章我们还是通过移植官方的USB Mass_Storage例程来实现,该例程在MDK的安装目录下可以找到(..\MDK\ARM\Examples\ST\STM32F10xUSBLib\Demos\Audio_Speaker)。

ST提供的例程实现了一个22Khz采样率、8位的单声道USB声卡,通过STM32PWM输出,经过RC滤波得到音频信号(对STM3210B-EVAL平台)。我们在该例程基础上,只需要修改定时器和其输出通道,使之满足战舰STM32开发板的硬件即可。

战舰STM32PWM DAC部分,我们在第二十五章(PWM DAC实验)已经有过详细介绍,并且知道我们的PWM DAC部分截止频率为33.8Khz,而本例程的音频采样率为22Khz,所以使用该PWM DAC电路来做音频输出是合适的。

本章,我们采用TIM4的通道1PB6)输出PWM,因为我们的音频信号是8位的,所以设置ARR寄存器值为0XFF,这样,我们可以得到TIM4_CH1的输出频率(不分频)为72Mhz/256=281.250Khz,然后我们通过定时器7的中断来更新TIM4_CH1的输出,TIM7的中频率就是我们音频信号的采样率:22Khz。这样,我们就可以使PWM DAC输出22Khz8位音频信号了。

56.2 硬件设计

本节实验功能简介:开机的时候先显示一些提示信息,之后开始USB配置,在配置成功之后就可以在电脑上发现多出一个USB声卡。我们用DS1来指示USB是否连接成功,并在液晶上显示USB连接状况,如果成功连接,我们可以将耳机插入开发板的PHONE端口,听到来自电脑的音频信号。同样我们还是用DS0来指示程序正在运行。

所要用到的硬件资源如下:

1)  指示灯DS0 DS1

2)  串口

3)  TFTLCD模块

4)  USB接口

5)  PWM DAC

6)  74HC4052

7)  TDA1308

这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。这里再次提醒大家,P13的连接,要通过跳线帽连接PA11D-以及PA12D+,另外,由于本章用到PWM DAC,还需要通过跳线帽将多功能端口P3AINPDC连接,如图56.2.1所示:


56.2.1 PWM DAC硬件连接示意图

56.3 软件设计

本章,我们在第二十五章实验 (实验20 )的基础上修改,先打开实验20 的工程,在HARDWARE文件夹所在文件夹下新建一个USB的文件夹,然后在USB文件夹下面新建LIBCONFIG文件夹,分别用来存放与USB核相关的代码以及配置部分代码。这两部分代码我们也不细说(详见光盘本例程源码),其中USB文件夹里面的代码同上一章的一模一样,而CONFIG文件夹里面的源码则来自MDK自带的Audio_Speaker例程: X:\Keil3.80A\ARM\

Examples\ST\STM32F10xUSBLib\Demos\Audio_Speaker下的sourceinclude文件夹(X为你安装MDK的磁盘)。

然后,我们在工程文件里面新建USBUSBCFG组,分别加入USB\LIB下面的代码和USB\CONFIG下面的代码。然后把LIBCONFIG文件夹加入头文件包含路径。

本章,我们还需要通过音频选择电路和耳机驱动电路来推动耳机输出,所以还需要加入音频选择部分的驱动,我们将第四十章实验(实验35)的AUDIOSEL文件夹拷贝到本工程的HARDWARE文件夹下,将audiosel.c加入HARDWARE组下,并将AUDIOSEL文件夹加入头文件包含路径。

最后在test.c里面,我们修改main函数如下:

//设置USB 连接/断线

//enable:0,断开

//       1,允许连接      

void usb_port_set(u8 enable)

{

       RCC->APB2ENR|=1<<2;    //使能PORTA时钟           

       if(enable)_SetCNTR(_GetCNTR()&(~(1<<1)));//退出断电模式

       else

       {      

              _SetCNTR(_GetCNTR()|(1<<1));  // 断电模式

              GPIOA->CRH&=0XFFF00FFF;

              GPIOA->CRH|=0X00033000;

              PAout(12)=0;                      

       }

}                                              

int main(void)

{           

     Stm32_Clock_Init(9);    //系统时钟设置

       delay_init(72);                     //延时初始化

       uart_init(72,9600);       //串口1初始化      

       LCD_Init();                  //初始化液晶

       LED_Init();           //LED初始化

       KEY_Init();                  //按键初始化 

       usmart_dev.init(72);      //usmart初始化    

       Audiosel_Init();            //初始化声道选择        

      POINT_COLOR=RED;//设置字体为蓝色     

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"USB Sound Card TEST");

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/25");       

      LCD_ShowString(60,130,200,16,16,"USB Connecting...");//提示SD卡已经准备了     

      delay_ms(1800);

      usb_port_set(0);//USB先断开一下

       delay_ms(300);

     usb_port_set(1);//USB再次连接   

       //USB配置

      USB_Interrupts_Config();   

      Set_USBClock();  

      USB_Init();   

       Speaker_Config();  

      Audiosel_Set(2);    //设置到PWM音频通道                      

      LCD_ShowString(60,130,200,16,16,"USB Connecting...");//提示SD卡已经准备了     

       while(1)

       {

              if(bDeviceState==CONFIGURED)//USB连接上了?

              {

                     LED1=0;                                          

                     LCD_ShowString(60,130,200,16,16,"USB Connected    ");//SD卡已经准备了

              }else

              {

                    LED1=1;                                          

                     LCD_ShowString(60,130,200,16,16,"USB DisConnected ");//SD卡连接失败

              }        

              LED0=!LED0;

              delay_ms(200);            

       };                                                                                               

}

该部分代码同样有usb_port_set函数,这里我们就不介绍该函数了。在main函数里面,我们通过调用Speaker_Config函数,配置TIM4_CH1281.25Khz PWM输出,配置TIM722Khz的定时中断,其他部分我们就不详细介绍了。

软件设计部分就为大家介绍到这里。

56.4 下载验证

在代码编译成功之后,我们通过下载代码到战舰STM32开发板上,在USB配置成功后(注意:USB数据线,要插在USB端口!不是USB_232端口!),LCD显示效果如图56.4.1所示:


56.4.1 USB连接成功

此时,电脑提示发现新硬件如图56.4.2所示:


56.4.2 USB读卡器被电脑找到

    USB配置成功后,DS1常亮,DS0闪烁,并且在设备管理器à声音、视频和游戏控制器里面看到多了USB Audio Device,如图56.4.3所示:


56.4.3 USB Audio Device

       此时,电脑的所有音频输出都被切换到USB声卡输出,将耳机插入战舰STM32开发板的PHONE端口,即可听到来自电脑的声音。

 

 

《STM32开发指南》第五十六章 USB声卡实验.rar

589.14 KB, 下载次数: 964

实验51 USB声卡实验.rar

165.1 KB, 下载次数: 939

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2012-10-27
在线时间
65 小时
发表于 2013-4-25 00:12:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2011-7-30
在线时间
6 小时
发表于 2015-5-17 16:51:02 | 显示全部楼层
同样的道理,如果去掉USB这一部分。那么将SD卡中的WAV文件解析后,通过PWM+低通滤波,也是可以实现音乐播放的。对吧?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2015-5-17 23:09:50 | 显示全部楼层
回复【3楼】wso75839840:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 20:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表