赞
踩
PC机一台、实验箱一台。
实现电子琴功能,控制不同的开关,可以实现不同频率的音频输出,完成歌曲《一闪一闪亮晶晶》的演奏,曲谱如图1所示,各个音符对应的频率如表1所示。
表1 音符及频率对应关系
音符 | 频率(Hz) |
DO | 262 |
RE | 294 |
MI | 330 |
FA | 349 |
SOL | 392 |
LA | 440 |
(高)DO1 | 523 |
图1 《一闪一闪亮晶晶》曲谱
①先在CUBE软件中进行硬件的图形化配置,选择STM32F407ZE芯片后,先进行常规的RCC和SYS设置,并配置时钟树使得HCLK为168MHz(如图2所示),在项目管理中进行项目的命名、存放地址、IDE等配置。
图2 时钟树的配置
②分析实验得,需要用到定时器的PWN输出,打开定时器并开启PWN输出功能,配置使得定时器Prescaler为83,Counter Period和pulse进行不报错的配置即可(如图3所示),在KEIL中会使用函数再进行配置。
图3 定时器的配置
③分析实验得,需要打开八个按键来完成音调的输出,打开八个GPIO开启输入模式(如图4所示)。
图4 GPIO的配置
④生成配置代码,进入到KEIL中完成相关功能代码,先进行KEIL的常规配置,设置晶振频率为8MHz,并设置硬件调试模式为J-LINK/J-TRACE Cortex。
⑤在gpio中定义一个按键扫描函数来扫描对应按键的按下,并在main函数中调用按键扫描函数,输入PWN波输出函数,并根据对应按键的按下来调用定时器的函数改变PWN波输出的频率(音调)和占空比(音量),编译下载后,进行硬件连线从而实现实验功能。
- //按键扫描函数
- uint8_t KEY_Scan()
- {
- if(KEY1 == 0||KEY2 == 0||KEY3 == 0||KEY4 == 0||KEY5 == 0||KEY6 == 0||KEY7 == 0||KEY8 == 0)
- {
- HAL_Delay(20);
- if(KEY1 == 0) return 1;
- else if(KEY2 == 0) return 2;
- else if(KEY3 == 0) return 3;
- else if(KEY4 == 0) return 4;
- else if(KEY5 == 0) return 5;
- else if(KEY6 == 0) return 6;
- else if(KEY7 == 0) return 7;
- else if(KEY8 == 0) return 8;
- }
- return 0;
- }
- //音调输出函数
- {
- key = KEY_Scan();
- switch(key)
- {
- case 0:
- {
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
- break;
- }
- case 1:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/262);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/262*0.9);
- break;
- }
- case 2:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/294);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/294*0.9);
- break;
- }
- case 3:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/330);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/330*0.9);
- break;
- }
- case 4:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/349);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/349*0.9);
- break;
- }
- case 5:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/392);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/392*0.9);
- break;
- }
- case 6:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/440);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/440*0.9);
- break;
- }
- case 7:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/492);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/492*0.9);
- break;
- }
- case 8:
- {
- __HAL_TIM_SetAutoreload(&htim1,1000000/523);
- __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/523*0.9);
- break;
- }
- }
①学会了PWN输出频率的计算公式:PWN波频率=定时器的输入时钟频率/[(PRESCALE+1)*(Counter Period+1)]
②学会了PWN输出高低电平的机制,计数值<PULSE值,PWN波输出有效电平,而在计数值>PULSE时,PWN波输出无效电平,PULSE值小于Counter Period
③学会了PWN波占空比的计算公式:占空比=高电平时间/周期=PULSE/Counter Period(有效电平为高电平)= PULSE/Counter Period(有效电平为低电平)。
④学会了对GPIO输入的读取,以及常用的按键扫描函数代码及按键消抖功能。
⑤学会了在CUBE中对GPIO输入和定时器PWN波输出的配置和在KEIL软件中的调用,并学会了在KEIL软件中改变定时器频率和占空比的函数调用。
⑥学会了在.h文件中对GPIO读取函数进行宏定义来增加代码可读性并减小编程工作量的方法。
⑦每一个PWN输出模式对应的输出管脚是不一样的,一种输出模式可能对应着多个输出管脚,要观察配置中的输出端口,以防硬件连接出错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。