单片机实验二(GPIO口输入+定时器实验)

一、实验设备

PC机一台、实验箱一台。

二、实验内容

实现电子琴功能,控制不同的开关,可以实现不同频率的音频输出,完成歌曲《一闪一闪亮晶晶》的演奏,曲谱如图1所示,各个音符对应的频率如表1所示。

表1 音符及频率对应关系

   音符频率(Hz)
    DO  262
    RE    294
MI330
FA349
SOL392
LA440
(高)DO1523

图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输出模式对应的输出管脚是不一样的,一种输出模式可能对应着多个输出管脚,要观察配置中的输出端口,以防硬件连接出错。

  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值