[MM32软件] 【MM32 eMiniBoard测评报告】2、开发板按键及蜂鸣器评测

[复制链接]
 楼主| 海洋无限 发表于 2020-5-23 15:55 | 显示全部楼层 |阅读模式
上午写了开发板的环境搭建和开箱评测,中午调试了下板卡上的Key和Buzzer,想着先把板卡上的资源都测试下,下面看这部分:
1、Key部分先看了例程,例程这部分按键程序很简单,自己测试了下例程的按键,到也没发现误按的情况,比我想象中好用些,不过Key部分我也自己的处理方式
  1. typedef struct
  2. {
  3.         unsigned char KeyEnable;
  4.         unsigned char KeyValue;
  5.         unsigned char EnableContinue;
  6.         unsigned char ValidFlag;
  7.         unsigned char Counter1;
  8. }s_Key;
  9. extern s_Key sKey[KEY_TOTALNUM];
上面这个结构体是我经常使用的,很多项目上也用过,好用,这次也不例外,将这部分代码移植上去,在sKey[KEY_TOTALNUM]中就可以查看Key的状态
2、板载有蜂鸣器,这部分准备用蜂鸣器实现一首很简单的歌曲,网上红尘情歌的谱比较多,这里也选择这首歌,省的自己再进行谱子的转化
  1. u8 music[]={    5,5,6,8,7,6,5,6,13,13,
  2.                 5,5,6,8,7,6,5,3,13,13,
  3.                 2,2,3,5,3,5,6,3,2,1,
  4.                 6,6,5,6,5,3,6,5,13,13,

  5.                 5,5,6,8,7,6,5,6,13,13,
  6.                 5,5,6,8,7,6,5,3,13,13,
  7.                 2,2,3,5,3,5,6,3,2,1,
  8.                 6,6,5,6,5,3,6,1,       

  9.                 13,8,9,10,10,9,8,10,9,8,6,
  10.                 13,6,8,9,9,8,6,9,8,6,5,
  11.                 13,2,3,5,5,3,5,5,6,8,7,6,
  12.                 6,10,9,9,8,6,5,6,8};
  13.   
  14. u8 time[] = {   2,4,2,2,2,2,2,8,4,4,
  15.                 2,4,2,2,2,2,2,8,4,4,
  16.                 2,4,2,4,2,2,4,2,2,8,
  17.                 2,4,2,2,2,2,2,8,4,4,

  18.                 2,4,2,2,2,2,2,8,4,4,
  19.                 2,4,2,2,2,2,2,8,4,4,
  20.                 2,4,2,4,2,2,4,2,2,8,
  21.                 2,4,2,2,2,2,2,8,

  22.                 4,2,2,2,4,2,2,2,2,2,8,
  23.                 4,2,2,2,4,2,2,2,2,2,8,
  24.                 4,2,2,2,4,2,2,5,2,6,2,4,
  25.                 2,2,2,4,2,4,2,2,12};
  1. const uint16_t tone[]     = {247,262,294,330,349,392,440,494,523,587,659,698,784,1000};
  2. const uint16_t tonetime[] = {8097,7633,6802,6060,5076,5102,4545,4048,3824,3407,3034,2865,2550,2000};   //0.5us

tone中为对应的频率,为了简单我将频率转变为tonetime中的时间,单位0.5us


3、由于蜂鸣器连接了A8 pin  为TIM1的复用输出pin,所以这里配置TIM1
  1.     GPIO_InitTypeDef GPIO_InitStructure;
  2.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  3.    
  4.     GPIO_PinAFConfig(GPIOA, GPIO_Pin_8, GPIO_AF_2);
  5.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;   //PA8
  6.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  7.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  8.     GPIO_Init(GPIOA, &GPIO_InitStructure);
上面RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);这个刚开始忘了,结果  哈哈。。。
定时器部分直接贴code,和STM32差不多,没啥好说的
  1. TIM_TimeBaseInitTypeDef         TIM_TimeBaseStructure;
  2.     TIM_OCInitTypeDef                                 TIM_OCInitStructInit;

  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  4.   
  5.     TIM_TimeBaseStructure.TIM_Period = Period;
  6.     TIM_TimeBaseStructure.TIM_Prescaler =Prescaler;
  7.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  8.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  9.     TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  10.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  11.     TIM_ClearFlag(TIM1, TIM_FLAG_Update);

  12.     TIM_OCStructInit(&TIM_OCInitStructInit);
  13. //    TIM_OCInitStructInit.TIM_OCMode = TIM_OCMode_Toggle;
  14.     TIM_OCInitStructInit.TIM_OCMode = TIM_OCMode_PWM2;
  15.     TIM_OCInitStructInit.TIM_OutputState = TIM_OutputState_Enable;
  16.     TIM_OCInitStructInit.TIM_Pulse = 0;
  17. //    TIM_OCInitStructInit.TIM_OCPolarity = TIM_OCPolarity_High;
  18.     TIM_OCInitStructInit.TIM_OCPolarity = TIM_OCPolarity_Low;
  19.     TIM_OC1Init(TIM1, &TIM_OCInitStructInit);
  20.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
下面实现调频率
  1. void Buzzer_Set_Freq(u16 Period)
  2. {
  3.          TIM_SetAutoreload(TIM1,Period);       
  4.    TIM_SetCompare1(TIM1,Period/2);      
  5. }
下面开启关闭定时器,实现蜂鸣器发声
  1. void Buzzer_Set_En(FunctionalState NewState)
  2. {
  3.     TIM_Cmd(TIM1, NewState);
  4. }
准备工作结束,下面就是播放控制,先看下控制结构体
  1. typedef struct
  2. {
  3.   unsigned char PlayFlag;
  4.   unsigned char CurrentPlayFlag;
  5.   unsigned char PlayStep;
  6.   unsigned char MusicNum;
  7.   unsigned char ToneCount;
  8.   unsigned char ToneNumCount;
  9. }_sPlayMusic;
蜂鸣在函数PlayMusic函数中实现,次函数由定时调度器调用,我这里是100ms调用一次,code如下
  1. void PlayMusic(void)
  2. {
  3.    unsigned int tonetemp;

  4.   switch(sPlayMusic.PlayStep)
  5.     {
  6.       case PLAYSTEP1:
  7.         if(TRUE == sPlayMusic.PlayFlag)
  8.         {
  9.           //Buzzer_Set_Freq(tone[14-music[sPlayMusic.ToneNumCount]]);
  10.           Buzzer_Set_Freq(tonetime[music[sPlayMusic.ToneNumCount]]);
  11.           Buzzer_Set_En(ENABLE);
  12.           sPlayMusic.PlayStep = PLAYSTEP2;         
  13.         }
  14.         break;
  15.         
  16.       case PLAYSTEP2:
  17.         if(sPlayMusic.ToneNumCount < sizeof(music)/sizeof(u8))
  18.         {
  19.           sPlayMusic.ToneCount++;
  20.           if(sPlayMusic.ToneCount >= time[sPlayMusic.ToneNumCount])
  21.           {
  22.             sPlayMusic.ToneCount =0;
  23.             sPlayMusic.ToneNumCount++;
  24.             //Buzzer_Set_Freq(tone[14-music[sPlayMusic.ToneNumCount]]);
  25.             tonetemp = tonetime[music[sPlayMusic.ToneNumCount]];
  26.             if(tonetemp <= 2000) Buzzer_Set_En(DISABLE);
  27.             else {
  28.               Buzzer_Set_Freq(tonetemp);
  29.               Buzzer_Set_En(ENABLE);
  30.             }
  31.           }
  32.         }
  33.         else{
  34.           sPlayMusic.PlayStep = PLAYSTEP3;
  35.           Buzzer_Set_En(DISABLE);
  36.         }
  37.         break;

  38.       case PLAYSTEP3:         
  39.           sPlayMusic.PlayFlag = FALSE;
  40.           sPlayMusic.CurrentPlayFlag = FALSE;
  41.           sPlayMusic.MusicNum = 0;
  42.           sPlayMusic.ToneCount = 0;
  43.           sPlayMusic.ToneNumCount = 0;
  44.           sPlayMusic.PlayStep = PLAYSTEP1;
  45.         break;
  46.     }
  47. }
然后在主函数中,当检测到Key2按下时,设置sPlayMusic.PlayFlag = TRUE; 即可,蜂鸣器开始演奏,目前程序没有实现演奏过程中停止演奏,演奏结束后,重新按键可以二次演奏。
截止目前,LED和蜂鸣器部分测试基本结束。附件有烧写的Hex文件,按Key2即可演奏红尘情歌,频率没有认真调试,也不是正式产品,效果还行,该有的功能基本都实现了。




MM32L073PF_Buzzer.zip

4.29 KB, 下载次数: 15

Buzzer

zhu^zhu 发表于 2020-5-23 19:01 | 显示全部楼层
好代码!
 楼主| 海洋无限 发表于 2020-5-25 12:29 | 显示全部楼层

感谢表扬
linlh11 发表于 2023-9-18 13:13 | 显示全部楼层
楼主能把源代码打包发出来吗?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远忠于年轻时的梦想!

39

主题

540

帖子

1

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