目录:
*wind11踩过的坑
*硬件连接
*蜂鸣器频率
*代码逻辑
*效果展示
1. wind11踩过的坑
拿到板子后可谓波折多多,下载的demo编译后居然跑不起来,尝试运行调试,发现不断F5会有跑起来的那么一刻,之后重新断电上电又跑不起来,着实悲剧

最终jlink卸载重新安装、MDK卸载重新安装,电脑重启仍不能解决问题,最终无意发现切换为Version5编译工具编译后烧写可以正常运行,猜测是Wind11系统上一些编译工具兼容性差,最好搞开发还是尽量避免用Wind11

2. 硬件连接
查看文档说明,芯片PA11连接Mos管驱动蜂鸣器,通过输出高低电平可以使蜂鸣器鸣响,PA11可使用TIM1的ch2输出PWM驱动
四个LED灯分别使用IO口PA5、PA6、PA10、PA15控制
串口USART1 TX1脚跟LED2重复,只能换个引脚接打印

引脚复用功能图:

3. 蜂鸣器频率
一般说来,蜂鸣器演奏音乐只能是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此蜂鸣器奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。十二平均律就规定了每一个音符的标准频率。
十二平均律,是一种音乐定律方法,将一个纯八度平均分成十二等份,每等分称为半音,是最主要的调音法。十二平均律中各音的频率:C: 262 Hz、#C: 277 Hz、D: 294 Hz、#D: 311 Hz、E: 330 Hz、F: 349 Hz、#F: 370 Hz、G: 392 Hz、#G: 415 Hz、A: 440 Hz、#A: 466 Hz、B: 494 Hz

音高由三位数字组成:
个位是表示1~7 这七个音符
十位是表示音符所在的音区:1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音:0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n): |0 |1 |2 |3 | 4 | 5 | 6
|几分音符: |1 |2|4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
百位是符点位: 0-无符点,1-有符点
从网上搜索到 “挥着翅膀的女孩” 音乐的乐谱,开始编写程序
4. 代码逻辑
LED灯引脚配置,将LED1、2、3、4都使能打开

串口使用UART1的TX引脚用PA12引脚,不占用LED2资源

接下来配置PWM输出, 时钟分频下来最好是大于20KHz,声音频率从20Hz-20KHz之间,确保我们需要用到的此区间可以再分频得到

通过查手册,TIMx_ARR寄存器可以自动预装,可通过改此寄存器值得到我们需要的某个频率的pwm输出

而TIMx_CR1寄存器则可以配置出我们需要的占空比,因为占空比大小会影响声音的大小

如下是网上找的 “挥着翅膀的女孩” 乐谱
// C: 262 Hz、#C:277 Hz、D: 294 Hz、#D: 311 Hz、E: 330 Hz、F: 349 Hz、#F:370 Hz、G: 392 Hz、#G: 415 Hz、
// A: 440 Hz、#A:466 Hz、B: 494 Hz
音乐乐谱表:
{
0x17, 0x02, 0x17, 0x03, 0x18, 0x03, 0x19, 0x02, 0x15, 0x03,
0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x18, 0x03,
0x19, 0x02, 0x16, 0x03, 0x17, 0x03, 0x18, 0x02, 0x18, 0x03,
0x17, 0x03, 0x15, 0x02, 0x18, 0x03, 0x17, 0x03, 0x18, 0x02,
0x10, 0x03, 0x15, 0x03, 0x16, 0x02, 0x15, 0x03, 0x16, 0x03,
0x17, 0x02, 0x17, 0x03, 0x18, 0x03, 0x19, 0x02, 0x1A, 0x03,
0x1B, 0x03, 0x1F, 0x03, 0x1F, 0x03, 0x17, 0x03, 0x18, 0x03,
0x19, 0x02, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x17, 0x03,
0x18, 0x03, 0x1F, 0x03, 0x1F, 0x02, 0x16, 0x03, 0x17, 0x03,
0x18, 0x03, 0x17, 0x03, 0x18, 0x03, 0x20, 0x03, 0x20, 0x02,
0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x20,0x03, 0x21, 0x03,
0x20, 0x03, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x1F, 0x03,
0x1B, 0x03, 0x19, 0x03, 0x19, 0x03, 0x15, 0x03, 0x1A, 0x66,
0x1A, 0x03, 0x19, 0x03, 0x15, 0x03, 0x15, 0x03, 0x17, 0x03,
0x16, 0x66, 0x17, 0x04, 0x18, 0x04, 0x18, 0x03, 0x19, 0x03,
0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x20, 0x03, 0x21, 0x03,
0x20, 0x03, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x1F, 0x03,
0x1B, 0x03, 0x19, 0x03, 0x19, 0x03, 0x15, 0x03, 0x1A, 0x66,
0x1A, 0x03, 0x19, 0x03, 0x19, 0x03, 0x1F, 0x03, 0x1B, 0x03,
0x1F, 0x00, 0x1A, 0x03, 0x1A, 0x03, 0x1A, 0x03, 0x1B, 0x03,
0x1B, 0x03, 0x1A, 0x03, 0x19, 0x03, 0x19, 0x02, 0x17, 0x03,
0x15, 0x17, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03,
0x17, 0x04, 0x18, 0x0E, 0x18, 0x03, 0x17, 0x04, 0x18, 0x0E,
0x18, 0x66, 0x17, 0x03, 0x18, 0x03, 0x17, 0x03, 0x18, 0x03,
0x20, 0x03, 0x20, 0x02, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66,
0x20, 0x03, 0x21, 0x03, 0x20, 0x03, 0x1F, 0x03, 0x1B, 0x03,
0x1F, 0x66, 0x1F, 0x04, 0x1B, 0x0E, 0x1B, 0x03, 0x19, 0x03,
0x19, 0x03, 0x15, 0x03, 0x1A, 0x66, 0x1A, 0x03, 0x19, 0x03,
0x15, 0x03, 0x15, 0x03, 0x17, 0x03, 0x16, 0x66, 0x17, 0x04,
0x18, 0x04, 0x18, 0x03, 0x19, 0x03, 0x1F, 0x03, 0x1B, 0x03,
0x1F, 0x66, 0x20, 0x03, 0x21, 0x03, 0x20, 0x03, 0x1F, 0x03,
0x1B, 0x03, 0x1F, 0x66, 0x1F, 0x03, 0x1B,0x03, 0x19, 0x03,
0x19, 0x03, 0x15, 0x03, 0x1A, 0x66, 0x1A, 0x03, 0x19, 0x03,
0x19, 0x03, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x00, 0x18, 0x02,
0x18, 0x03, 0x1A, 0x03, 0x19, 0x0D, 0x15, 0x03, 0x15, 0x02,
0x18, 0x66, 0x16, 0x02, 0x17, 0x02, 0x15, 0x00, 0x00, 0x00
}
主程序中逻辑很简单,简单的获取音乐信息,拆解计算为各频率的大小,控制蜂鸣器输出发生和停留事件,不断循环,直到音乐播放结束跳出循环

预留出PWM输出设置频率和占空比的接口用于主程序中调用
voidTIM1_PWM_Output_Freq_Duty(uint32_t freq, uint32_t duty)
{
/* Compute the value to be set inARR regiter to generate signal frequency at 100 Khz */
uint32_t TimerPeriod =(RCC_GetPCLK1Freq() * freq / 100000 ) - 1;
uint32_t Channel2Pulse = ((uint32_t)duty* (TimerPeriod - 1)) / 1000;
TIM_SetAutoreload(TIM1,TimerPeriod);
TIM_SetCompare2(TIM1,Channel2Pulse);
}
解码部分,根据乐谱计算出低音高音

JLink上有集成一个串口,但跟板子上预留口不一致,只能跳下线抓打印方便调试代码

5. 效果展示
视频连接:
