[其他] eMiniBoard之PWM驱动无源蜂鸣器+ADC调整LED亮度

[复制链接]
 楼主| 更多更合适ii 发表于 2022-7-28 23:48 | 显示全部楼层 |阅读模式
前言
本文介绍 MM32 Insight-Series 开发板 eMiniBoard 第二批出厂程序(基于 MM32-FDS 底层库开发)

主要功能
按键 * 4:控制对应 4 首内置歌曲的播放与暂停;
LED * 4:显示当前的播放状态(处于播放状态时对应的 LED 慢闪);
RV * 3:调节相应 LED * 3 (LED2、LED3、LED4)的亮度,调节过程显示其余两路 LED 状态。

 楼主| 更多更合适ii 发表于 2022-7-28 23:50 | 显示全部楼层

————————————————

版权声明:本文为CSDN博主「Chen Do」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/chendu103/article/details/106563736
 楼主| 更多更合适ii 发表于 2022-7-28 23:52 | 显示全部楼层
准备工作
注:本文所有程序均基于 IAR EWARM 开发

1.官网下载 MM32-FDS 开发套件,支持 MM32 全系列版本,与Cortex-M微控制器软件接口标准(CMSIS)兼容。

2.官网下载相应 IAR_PACK 文件,支持 MM32 全系列芯片在 IAR v7.6 及以上版本的手动安装。
 楼主| 更多更合适ii 发表于 2022-7-28 23:54 | 显示全部楼层
兼容版型
4697362e2b11c97292.png
 楼主| 更多更合适ii 发表于 2022-7-28 23:57 | 显示全部楼层
板级基础模块
硬件
LED & Key 模块
LED / Key 电路原理图如下所示
 楼主| 更多更合适ii 发表于 2022-7-28 23:58 | 显示全部楼层
 楼主| 更多更合适ii 发表于 2022-7-28 23:59 | 显示全部楼层
LED 引脚表格
5385962e2b25fe8f45.png
 楼主| 更多更合适ii 发表于 2022-7-29 23:30 | 显示全部楼层
* 本文使用的复用功能引脚,不代表该脚的全部复用功能,下同。

 楼主| 更多更合适ii 发表于 2022-7-29 23:31 | 显示全部楼层
Key 引脚表格
9204262e3fd2ae8f9f.png
 楼主| 更多更合适ii 发表于 2022-7-29 23:32 | 显示全部楼层
Beep 模块
8933462e3fd5c3167d.png
 楼主| 更多更合适ii 发表于 2022-7-29 23:33 | 显示全部楼层
RV模块 5329462e3fda91e3e0.png
 楼主| 更多更合适ii 发表于 2022-7-29 23:34 | 显示全部楼层
RV 引脚表格
1520862e3fdecb01e5.png
 楼主| 更多更合适ii 发表于 2022-7-29 23:37 | 显示全部楼层
软件
LED/Key 初始化代码
 楼主| 更多更合适ii 发表于 2022-7-29 23:39 | 显示全部楼层

  1. void BSP_LED_Configure(void);
  2. void BSP_KEY_Configure(void);


  3. void led2on()
  4. {
  5.     TIM_SelectOCxM  (TIM2, TIM_Channel_2, TIM_OCMode_PWM1);
  6.     TIM_CCxCmd      (TIM2, TIM_Channel_2, TIM_CCx_Enable);
  7. }
  8. void led2off()
  9. {
  10.     TIM_SelectOCxM  (TIM2, TIM_Channel_2, TIM_OCMode_Inactive);
  11.     TIM_CCxCmd      (TIM2, TIM_Channel_2, TIM_CCx_Enable);
  12. }
  13. void led3on()
  14. {
  15.     TIM_SelectOCxM  (TIM3, TIM_Channel_1, TIM_OCMode_PWM1);
  16.     TIM_CCxCmd      (TIM3, TIM_Channel_1, TIM_CCx_Enable);
  17. }
  18. void led3off()
  19. {
  20.     TIM_SelectOCxM  (TIM3, TIM_Channel_1, TIM_OCMode_Inactive);
  21.     TIM_CCxCmd      (TIM3, TIM_Channel_1, TIM_CCx_Enable);
  22. }
  23. void led4on()
  24. {
  25.     TIM_SelectOCxM  (TIM3, TIM_Channel_2, TIM_OCMode_PWM1);
  26.     TIM_CCxCmd      (TIM3, TIM_Channel_2, TIM_CCx_Enable);
  27. }
  28. void led4off()
  29. {
  30.     TIM_SelectOCxM  (TIM3, TIM_Channel_2, TIM_OCMode_Inactive);
  31.     TIM_CCxCmd      (TIM3, TIM_Channel_2, TIM_CCx_Enable);
  32. }


  33. void closeLED()
  34. {
  35.     LD6_off();
  36.     led2off();
  37.     led3off();
  38.     led4off();
  39. }


  40. void initLEDPWM(u16 psc, u16 arr)
  41. {
  42.     GPIO_InitTypeDef        GPIO_InitStructure;
  43.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  44.     TIM_OCInitTypeDef       TIM_OCInitStructInit;
  45.    
  46.     COMMON_EnableIpClock(emCLOCK_GPIOB);
  47.     COMMON_EnableIpClock(emCLOCK_TIM2);
  48.     COMMON_EnableIpClock(emCLOCK_TIM3);
  49.    
  50.     GPIO_Mode_AF_PP_20MHz_Init(GPIOB, GPIO_Pin_3, EXTI_MAPR_TIM2_PARTIAL1, GPIO_AF_2);
  51.     GPIO_Mode_AF_PP_20MHz_Init(GPIOB, GPIO_Pin_4, EXTI_MAPR_TIM3_PARTIAL, GPIO_AF_1);
  52.     GPIO_Mode_AF_PP_20MHz_Init(GPIOB, GPIO_Pin_5, EXTI_MAPR_TIM3_PARTIAL, GPIO_AF_1);
  53.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  54.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  55.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  56.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  57.    
  58.     TIM_TimeBaseStructure.TIM_Period = arr;
  59.     TIM_TimeBaseStructure.TIM_Prescaler = psc;
  60.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  61.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  62.     TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  63.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  64.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  65.    
  66.     TIM_OCStructInit(&TIM_OCInitStructInit);
  67.     TIM_OCInitStructInit.TIM_OCMode = TIM_OCMode_PWM1;
  68.     TIM_OCInitStructInit.TIM_OutputState = TIM_OutputState_Enable;
  69.     TIM_OCInitStructInit.TIM_Pulse = arr >> 1;
  70.     TIM_OCInitStructInit.TIM_OCPolarity = TIM_OCPolarity_Low;
  71.     TIM_OC2Init(TIM2, &TIM_OCInitStructInit);
  72.     TIM_OC1Init(TIM3, &TIM_OCInitStructInit);
  73.     TIM_OC2Init(TIM3, &TIM_OCInitStructInit);
  74.    
  75.     TIM_Cmd(TIM2, ENABLE);
  76.     TIM_Cmd(TIM3, ENABLE);
  77. }
 楼主| 更多更合适ii 发表于 2022-7-29 23:41 | 显示全部楼层
 楼主| 更多更合适ii 发表于 2022-7-29 23:42 | 显示全部楼层
Beep 初始化代码

  1. void initBuzzer(u16 prescaler)
  2. {
  3.     GPIO_InitTypeDef        GPIO_InitStructure;
  4.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5.     TIM_OCInitTypeDef       TIM_OCInitStructInit;
  6.    
  7.     COMMON_EnableIpClock(emCLOCK_GPIOA);
  8.     COMMON_EnableIpClock(emCLOCK_TIM1);
  9.    
  10.     GPIO_Mode_AF_PP_20MHz_Init(GPIOA, GPIO_Pin_8, NO_REMAP, GPIO_AF_2);
  11.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.    
  16.     TIM_TimeBaseStructure.TIM_Period = 999;
  17.     TIM_TimeBaseStructure.TIM_Prescaler = prescaler;
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  19.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  20.     TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  21.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  22.    
  23.     TIM_OCStructInit(&TIM_OCInitStructInit);
  24.     TIM_OCInitStructInit.TIM_OCMode = TIM_OCMode_PWM2;
  25.     TIM_OCInitStructInit.TIM_OutputState = TIM_OutputState_Enable;
  26.     TIM_OCInitStructInit.TIM_Pulse = 0;
  27.     TIM_OCInitStructInit.TIM_OCPolarity = TIM_OCPolarity_Low;
  28.     TIM_OC1Init(TIM1, &TIM_OCInitStructInit);
  29.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  30.    
  31.     TIM_CtrlPWMOutputs(TIM1, ENABLE);
  32. }
 楼主| 更多更合适ii 发表于 2022-7-29 23:43 | 显示全部楼层
实例化代码:
  1. RCC_ClocksTypeDef rcc_clocks;


  2. void main()
  3. {
  4.         RCC_GetClocksFreq(&rcc_clocks);
  5.         initBuzzer(rcc_clocks.SYSCLK_Frequency / 2000000 - 1);       
  6.         //...........
  7. }
 楼主| 更多更合适ii 发表于 2022-7-29 23:43 | 显示全部楼层
RV 初始化代码

  1. void initGPIO_ADC()
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.    
  5.     COMMON_EnableIpClock(emCLOCK_GPIOA);
  6.    
  7.     GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
  8.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  10.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  11. }


  12. void initADC()
  13. {
  14.     ADC_InitTypeDef ADC_InitStructure;
  15.     DMA_InitTypeDef DMA_InitStructure;
  16.    
  17.     COMMON_EnableIpClock(emCLOCK_ADC1);
  18.     COMMON_EnableIpClock(emCLOCK_DMA1);
  19.    
  20.     initGPIO_ADC();
  21.    
  22.     DMA_DeInit(DMA1_ch1);
  23.     DMA_InitStructure.PeripheralBaseAddr = (u32)&(ADC1->DR);
  24.     DMA_InitStructure.MemoryBaseAddr = (u32)&ADCtemp[0];
  25.     DMA_InitStructure.DIR = DMA_DIR_PeripheralSRC;
  26.     DMA_InitStructure.BufferSize = 3;
  27.     DMA_InitStructure.PeripheralInc = DMA_PeripheralInc_Disable;
  28.     DMA_InitStructure.MemoryInc = DMA_MemoryInc_Enable;
  29.     DMA_InitStructure.PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  30.     DMA_InitStructure.MemoryDataSize = DMA_MemoryDataSize_Word;
  31.     DMA_InitStructure.Mode = DMA_Mode_Circular;
  32.     DMA_InitStructure.Priority = DMA_Priority_High;
  33.     DMA_InitStructure.M2M = DMA_M2M_Disable;
  34.     DMA_Init(DMA1_ch1, &DMA_InitStructure);
  35.     DMA_Cmd(DMA1_ch1, ENABLE);
  36.    
  37.     ADC_InitStructure.ADC_Mode = ADC_CR_CONTINUE;
  38.     ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;
  39.     ADC_InitStructure.ADC_ExternalTrigConv = ADC1_ExternalTrigConv_T1_CC1;
  40.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  41.     ADC_Init(ADC1, &ADC_InitStructure);
  42.    
  43.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1,  1, ADC_Samctl_1_5);
  44.     ADC_RegularChannelConfig(ADC1, ADC_Channel_4,  2, ADC_Samctl_1_5);
  45.     ADC_RegularChannelConfig(ADC1, ADC_Channel_5,  3, ADC_Samctl_1_5);
  46.    
  47.     ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE);
  48.     ADC_Cmd(ADC1, ENABLE);
  49.     ADC_DMACmd(ADC1, ENABLE);
  50.     ADC1->CFGR |= 0x04;
  51.    
  52.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  53. }
 楼主| 更多更合适ii 发表于 2022-7-29 23:46 | 显示全部楼层
蜂鸣器播放音频
单音频率计算
1570062e400d9a2ee3.png
 楼主| 更多更合适ii 发表于 2022-7-29 23:48 | 显示全部楼层
本文根据上图的单音频率配置频谱表,如下所示:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

284

帖子

1

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