搜索
bottom↓
回复: 57

我自己做的会唱歌的STM32实验板【恢复】

[复制链接]

出0入0汤圆

发表于 2008-10-9 09:21:22 | 显示全部楼层 |阅读模式
以下文字由站长阿莫加入:



4,6,11楼能分别下载到电路图,说明书,测试代码。








这是我做的STM32实验板



 (原文件名:IMG_5805.JPG) 



通过改变PWM的频率可以发出不同的音调,从而唱出简单的歌曲



下面是主要的程序,唱的是SuperStar





#include "Include.h"



//音调表

//C 262 

//D 294 

//E 330 

//F 349 

//G 392 

//A 440 

//B 494 

//C 523 

//D 587 

//E 659 

//F 698 

//G 784 

//A 880 

//B 988 

//C 1047 

//D 1175 

//E 1319 

//F 1397 

//G 1568 

//A 1760 

//B 1976 



//低音1~7

const unsigned int MusicDataD[7] = {61069,54422,48485,45845,40816,36364,32389};

//中音1~7

const unsigned int MusicData[7] = {30592,27257,24297,22922,20408,18182,16194};

//高音1~7

const unsigned int MusicDataG[7] = {15282,13617,12130,11453,10204,9091,8097};



//音乐数据格式:

//0x11~0x17 表示低音1~7

//0x21~0x27 表示中音1~7

//0x31~0x37 表示高音1~7

//0         表示静音

//每个音后面数据表示该音为多少个时间单位:1个16分音符定为1个时间单位



const unsigned char SuperStarData[] = //SuperStar S.H.E.

{

        0x22,4,0x22,2,0x23,2,0x21,4,0x15,2,0x15,2,

        0x22,2,0x21,2,0x22,2,0x23,2,0x21,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x21,1,0x22,1,0x22,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x21,2,0x21,2,0x22,1,0x21,1,0x17,4,

        0x22,2,0x22,2,0x22,2,0x23,2,0x21,4,0x15,2,0x15,2,

        0x22,2,0x21,2,0x22,2,0x23,2,0x21,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x21,1,0x22,1,0x22,4,0,2,0x23,2,

        0x24,2,0x23,2,0x24,2,0x25,2,0x25,4,0x15,2,0x16,2,

        

        0x21,4,0x22,2,0x23,2,0x25,4,0x23,2,0x25,2,

        0x26,2,0x27,2,0x26,2,0x25,2,0x23,4,0x22,2,0x23,2,

        0x25,2,0x23,2,0,2,0x23,2,0x22,2,0x23,2,0x22,2,0x21,2,

        0x15,8,0,4,0x15,2,0x16,2,

        0x21,4,0x22,2,0x23,2,0x25,4,0x23,2,0x25,2,

        0x26,2,0x27,2,0x26,2,0x25,2,0x23,4,0x22,2,0x23,2,

        0x25,2,0x23,2,0,2,0x23,2,0x22,2,0x23,2,0x22,2,0x21,2,

        //1

        0x15,16,

        0,32,

        

        0x22,4,0x22,2,0x23,2,0x21,4,0x15,2,0x15,2,

        0x22,2,0x21,2,0x22,2,0x23,2,0x21,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x21,1,0x22,1,0x22,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x21,2,0x21,2,0x22,1,0x21,1,0x17,4,

        0x22,2,0x22,2,0x22,2,0x23,2,0x21,4,0x15,2,0x15,2,

        0x22,2,0x21,2,0x22,2,0x23,2,0x21,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x21,1,0x22,1,0x22,4,0,2,0x23,2,

        0x24,2,0x23,2,0x24,2,0x25,2,0x25,4,0x15,2,0x16,2,

        0x21,4,0x22,2,0x23,2,0x25,4,0x23,2,0x25,2,

        0x26,2,0x27,2,0x26,2,0x25,2,0x23,4,0x22,2,0x23,2,

        0x25,2,0x23,2,0,2,0x23,2,0x22,2,0x23,2,0x22,2,0x21,2,

        0x15,8,0,4,0x15,2,0x16,2,

        0x21,4,0x22,2,0x23,2,0x25,4,0x23,2,0x25,2,

        0x26,2,0x27,2,0x26,2,0x25,2,0x23,4,0x22,2,0x23,2,

        0x25,2,0x23,2,0,2,0x23,2,0x22,2,0x23,2,0x22,2,0x21,2,



        //2

        0x15,16,

        0,4,0x26,2,0x25,6,0x22,2,0x23,10,0,8,

        0,4,0x26,2,0x25,6,0x22,2,0x23,4,0x24,2,0x23,1,0x22,1,0x21,1,0x21,9,

        0,4,0x26,2,0x25,6,0x27,2,0x27,6,0,2,0x27,2,0x31,4,0x27,2,0x26,2,

        0x26,4,0x22,2,0x23,2,0x21,4,0x15,2,0x15,2,

        0x22,2,0x21,2,0x22,2,0x23,2,0x21,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x22,2,0x22,4,0,2,0x23,2,



        0x24,2,0x23,2,0x21,2,0x21,2,0x21,2,0x22,1,0x21,1,0x17,4,

        0x22,2,0x22,2,0x22,2,0x23,2,0x21,4,0x15,2,0x15,2,

        0x22,2,0x21,2,0x22,2,0x23,2,0x21,4,0,2,0x23,2,

        0x24,2,0x23,2,0x21,2,0x22,2,0x22,4,0,2,0x23,2,

        0x24,2,0x23,2,0x24,2,0x25,2,0x25,20,0x15,2,0x16,2,



        0x21,4,0x22,2,0x23,2,0x25,4,0x23,2,0x25,2,

        0x26,2,0x27,2,0x26,2,0x25,2,0x23,4,0x22,2,0x23,2,

        0x25,2,0x23,2,0,2,0x23,2,0x22,2,0x23,2,0x22,2,0x21,2,

        0x15,8,0,4,0x15,2,0x16,2,

        0x21,4,0x22,2,0x23,2,0x25,4,0x23,2,0x25,2,

        0x26,2,0x27,2,0x26,2,0x25,2,0x23,4,0x22,2,0x23,2,

        0x25,2,0x23,2,0,2,0x23,2,0x22,2,0x23,2,0x22,2,0x21,2,

        0x15,12,0,4,

};



void SetBellF(unsigned int SetV)

{

        TIM_OCInitTypeDef TIM_OCInitStructure;

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;



        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

        

        TIM_TimeBaseInitStructure.TIM_Period = SetV;

        TIM_TimeBaseInitStructure.TIM_Prescaler = 0;

        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);



        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

        TIM_OCInitStructure.TIM_Pulse = (SetV/2);

        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

        TIM_OC2Init(TIM2, &TIM_OCInitStructure);

}





void Timer2Init(void)

{

        TIM_OCInitTypeDef TIM_OCInitStructure;

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;



        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

        

        TIM_TimeBaseInitStructure.TIM_Period = 10000;

        TIM_TimeBaseInitStructure.TIM_Prescaler = 0;

        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);



        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

        TIM_OCInitStructure.TIM_Pulse = 5000;

        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

        TIM_OC2Init(TIM2, &TIM_OCInitStructure);

}



void Timer2OutEnable(void)

{

        GPIO_InitTypeDef GPIO_InitStructure;



        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);



        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

}



void Timer2OutDisable(void)

{

        GPIO_InitTypeDef GPIO_InitStructure;



        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);



        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

}



void Timer2Start(void)

{

        TIM_Cmd(TIM2, ENABLE);

}



void Timer2Stop(void)

{

        TIM_Cmd(TIM2, DISABLE);

}



//播放歌曲

void PlayMusicFile(unsigned int DataNumber,unsigned char* p,unsigned char UnitTime)

{

        unsigned int i = 0;

        unsigned int PlayWord;



        for(i=0;i<DataNumber;i++)

        {

                switch (*p)

                {

                        case 0x11:

                                PlayWord = MusicDataD[0];

                                break;

                        case 0x12:

                                PlayWord = MusicDataD[1];

                                break;

                        case 0x13:

                                PlayWord = MusicDataD[2];

                                break;

                        case 0x14:

                                PlayWord = MusicDataD[3];

                                break;

                        case 0x15:

                                PlayWord = MusicDataD[4];

                                break;

                        case 0x16:

                                PlayWord = MusicDataD[5];

                                break;

                        case 0x17:

                                PlayWord = MusicDataD[6];

                                break;

                        case 0x21:

                                PlayWord = MusicData[0];

                                break;

                        case 0x22:

                                PlayWord = MusicData[1];

                                break;

                        case 0x23:

                                PlayWord = MusicData[2];

                                break;

                        case 0x24:

                                PlayWord = MusicData[3];

                                break;

                        case 0x25:

                                PlayWord = MusicData[4];

                                break;

                        case 0x26:

                                PlayWord = MusicData[5];

                                break;

                        case 0x27:

                                PlayWord = MusicData[6];

                                break;

                        case 0x31:

                                PlayWord = MusicDataG[0];

                                break;

                        case 0x32:

                                PlayWord = MusicDataG[1];

                                break;

                        case 0x33:

                                PlayWord = MusicDataG[2];

                                break;

                        case 0x34:

                                PlayWord = MusicDataG[3];

                                break;

                        case 0x35:

                                PlayWord = MusicDataG[4];

                                break;

                        case 0x36:

                                PlayWord = MusicDataG[5];

                                break;

                        case 0x37:

                                PlayWord = MusicDataG[6];

                                break;

                        default:

                                PlayWord = 0;//表示无声音

                                break;

                }

                p++;

                i++;

                if(PlayWord != 0)

                {

                        Timer2OutEnable();

                        SetBellF(PlayWord);

                }

                else

                {

                        Timer2OutDisable();

                }

                DelayNmS(UnitTime*(*p));

                p++;



        }

}



void Timer2Test(void)

{

        unsigned char i = 0;



        Timer2Start();



        while(1)

        {

                while(NO_KEY == GetKey());

                PlayMusicFile(sizeof(SuperStarData),(unsigned char*)SuperStarData,100);

                Timer2OutDisable();

        }



        //一句简单的歌曲

        while(0)

        {

                Timer2OutEnable();

                SetBellF(MusicData[0]);

                DelayNmS(400);

                SetBellF(MusicData[0]);

                DelayNmS(400);

                SetBellF(MusicData[4]);

                DelayNmS(400);

                SetBellF(MusicData[4]);

                DelayNmS(400);

                SetBellF(MusicData[5]);

                DelayNmS(400);

                SetBellF(MusicData[5]);

                DelayNmS(400);

                SetBellF(MusicData[4]);

                DelayNmS(400);

                DelayNmS(400);

                SetBellF(MusicData[3]);

                DelayNmS(400);

                SetBellF(MusicData[3]);

                DelayNmS(400);

                SetBellF(MusicData[2]);

                DelayNmS(400);

                SetBellF(MusicData[2]);

                DelayNmS(400);

                SetBellF(MusicData[1]);

                DelayNmS(400);

                SetBellF(MusicData[1]);

                DelayNmS(400);

                SetBellF(MusicData[0]);

                DelayNmS(400);

                DelayNmS(400);

                Timer2OutDisable();

                DelayNmS(1000);

        }



        //从C播放到B

        while(1)

        {

                SetBellF(MusicData);

                Timer2OutEnable();

                DelayNmS(200);

                i++;

                if(i>=7)

                {

                        i = 0;

                        Timer2OutDisable();

                        DelayNmS(2000);

                }

        }

}



void TestPlay(void)

{

        Timer2Start();

        PlayMusicFile(sizeof(SuperStarData),(unsigned char*)SuperStarData,100);

}

出0入0汤圆

发表于 2008-10-9 09:26:25 | 显示全部楼层
赞一个~

出0入0汤圆

发表于 2008-10-9 10:36:59 | 显示全部楼层
记号。

出0入0汤圆

发表于 2008-10-9 11:23:20 | 显示全部楼层
楼主上原理图、pcb图。



好像没有外扩的I/O!不解.................



想是楼主把STM32当51了!

出0入0汤圆

 楼主| 发表于 2008-10-9 12:37:24 | 显示全部楼层
为什么一定要外扩IO呢?

我选用的是STM32F103C6T6,就48脚,没打算外扩。



附上原理图:

点击此处下载 ourdev_445070.pdf(文件大小:21K) (原文件名:EasySTM32V1.1.pdf) 

出0入0汤圆

 楼主| 发表于 2008-10-10 18:01:15 | 显示全部楼层
我把板子放淘宝上了,大家有兴趣可以去看看哦

http://auction1.taobao.com/auction/item_detail-0db1-b8d83af207f1916f6d6bfc886bd9f586.jhtml

出0入0汤圆

 楼主| 发表于 2008-10-10 21:13:13 | 显示全部楼层
说明书也上传过来请大家都看看

点击此处下载 ourdev_446790.pdf(文件大小:460K) (原文件名:EasySTM32说明书.pdf) 

出0入0汤圆

发表于 2008-10-10 22:13:51 | 显示全部楼层
不错的广告!
头像被屏蔽

出0入0汤圆

发表于 2008-10-11 09:57:51 | 显示全部楼层
好的。将这个帖子置COOL , 这样楼主的广告就被允许。



另:楼主能否将你的测试代码都打包上传上来? 谢谢。

出0入0汤圆

 楼主| 发表于 2008-10-11 10:46:06 | 显示全部楼层
没问题

点击此处下载 ourdev_447491.zip(文件大小:4.15M) (原文件名:实验程序.zip) 

出0入0汤圆

发表于 2008-10-13 09:54:18 | 显示全部楼层
恩不错的,楼主的程序值得学习

出0入0汤圆

 楼主| 发表于 2008-10-13 17:09:20 | 显示全部楼层
谢谢,大家多交流

我想以后能做一个直接软件解码mp3播放的STM32,可是这mp3怎么解码呢?我还一点不知道。

出0入8汤圆

发表于 2008-10-13 22:30:13 | 显示全部楼层
网上有支持ARM7的MP3软件码库,记得NXP的LPC2xxx系列有一个应用笔记讲的是这个,有兴趣可以去NXP的网站找找。



STM32103xx是可以满足MP3软解的,只是支持的码率不清楚。听说ST计划在STM32上提供一个MP3的软解码库,至于何时公开就不清楚了。等不及得可以参照LPC2xxx的代码自己先移值。 



最近忙其它的事情也就没去关心这事。做的板子选了RC,就因I2S接口。

出0入0汤圆

 楼主| 发表于 2008-10-13 22:49:16 | 显示全部楼层
楼上的看来经验十足啊

多谢!

有空我去学习下。

出0入0汤圆

发表于 2008-10-16 13:32:57 | 显示全部楼层
不错,谢谢啊!



我们准备做语音采集和播放,正好用上!谢谢了

出210入8汤圆

发表于 2008-11-5 12:37:18 | 显示全部楼层
好东东, mark。

出0入0汤圆

发表于 2008-11-5 18:45:46 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2008-11-5 20:34:08 | 显示全部楼层
不错,有没有谁把这音乐录下来的给大家听一下。

出0入0汤圆

发表于 2008-11-5 21:28:37 | 显示全部楼层
还以为可以解码mp3

出0入0汤圆

发表于 2008-11-9 23:19:09 | 显示全部楼层
都在等软解码出来

出0入0汤圆

发表于 2008-11-12 17:50:13 | 显示全部楼层
音效怎么样?想听听

出0入0汤圆

发表于 2008-11-12 19:21:35 | 显示全部楼层
看看

出0入0汤圆

发表于 2008-11-15 02:05:19 | 显示全部楼层
不错 超级51 什么时候有软解码  期待

出0入0汤圆

 楼主| 发表于 2008-11-19 16:33:39 | 显示全部楼层
上次看见有人找我的联系方式:

这是我的邮箱:



 (原文件名:未命名.JPG) 





本贴被 masbbx 编辑过,最后修改时间:2008-11-19,16:34:08.

出0入0汤圆

发表于 2009-3-1 15:56:19 | 显示全部楼层
这个贴我要挖挖,因为我也要用stm32做mp3的软解码

出0入0汤圆

发表于 2009-3-3 10:32:33 | 显示全部楼层
哈哈 我也顶一下

出0入0汤圆

发表于 2009-3-12 13:46:33 | 显示全部楼层
顶一下楼主

出0入0汤圆

发表于 2009-3-17 18:41:52 | 显示全部楼层
顶就一个字

出0入0汤圆

发表于 2009-4-5 01:40:01 | 显示全部楼层
stm32做mp3的软解码,关注中。

出0入0汤圆

发表于 2009-5-10 02:00:31 | 显示全部楼层
不错!外接喇叭能用吗?

出0入0汤圆

发表于 2009-5-14 16:17:07 | 显示全部楼层

出0入0汤圆

发表于 2009-5-20 08:09:37 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2009-12-17 13:52:07 | 显示全部楼层
各位帮帮忙啊!我下载正在做一个检测设备,上面用的是电磁式无源蜂鸣器,我想让电磁式无源蜂鸣器发出一个检测成功的那种声音,我上面用的单片机是PIC的,现在做的音乐太难听了(听着就想警报音),各位怎么实现啊!具体点了!谢谢了!

出0入0汤圆

发表于 2010-3-7 14:06:53 | 显示全部楼层
MARK!      我的实验班 也有蜂鸣器 接了PWM  有空试试看

出0入0汤圆

发表于 2010-3-7 17:11:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-2 07:36:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-9 22:31:04 | 显示全部楼层
【29楼】 sztxm
积分:15
派别:
等级:------
来自:
不错!外接喇叭能用吗?  
--------------------------
直接驱动估计不行,加一级功率放大(1-5w)应该就足够了

出0入0汤圆

发表于 2010-6-8 18:29:51 | 显示全部楼层
谢谢,楼主分享的资料~~
好人

出0入0汤圆

发表于 2010-10-27 09:51:31 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-27 10:11:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 10:56:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 12:12:51 | 显示全部楼层
mark,但是感觉好像不适合拿来当做学习板呢

出0入0汤圆

发表于 2010-10-27 12:33:51 | 显示全部楼层
楼主绝对好人,资料非常适合我这个初学者,谢谢分享!

出0入0汤圆

发表于 2010-10-27 21:20:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-23 12:13:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-23 12:21:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-23 23:46:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-4 15:48:37 | 显示全部楼层
mark

出50入0汤圆

发表于 2011-6-4 15:54:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-16 21:01:01 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-6-17 23:29:46 | 显示全部楼层
cool   记号!!!

出0入0汤圆

发表于 2011-7-8 09:51:17 | 显示全部楼层
回复【楼主位】masbbx
-----------------------------------------------------------------------
dddddddd

出0入0汤圆

发表于 2011-7-8 20:44:39 | 显示全部楼层
可以玩MP3了!

出0入0汤圆

发表于 2011-7-8 22:46:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-12 16:59:35 | 显示全部楼层
好资料,收下了了,以后也买块板学习!

出0入0汤圆

发表于 2012-3-30 22:15:38 | 显示全部楼层
不错。支持分享。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 07:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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