打印
[其他]

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

[复制链接]
1066|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
本文介绍 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 | 只看该作者
兼容版型

使用特权

评论回复
5
更多更合适ii|  楼主 | 2022-7-28 23:57 | 只看该作者
板级基础模块
硬件
LED & Key 模块
LED / Key 电路原理图如下所示

使用特权

评论回复
6
更多更合适ii|  楼主 | 2022-7-28 23:58 | 只看该作者

使用特权

评论回复
7
更多更合适ii|  楼主 | 2022-7-28 23:59 | 只看该作者
LED 引脚表格

使用特权

评论回复
8
更多更合适ii|  楼主 | 2022-7-29 23:30 | 只看该作者
* 本文使用的复用功能引脚,不代表该脚的全部复用功能,下同。

使用特权

评论回复
9
更多更合适ii|  楼主 | 2022-7-29 23:31 | 只看该作者
Key 引脚表格

使用特权

评论回复
10
更多更合适ii|  楼主 | 2022-7-29 23:32 | 只看该作者
Beep 模块

使用特权

评论回复
11
更多更合适ii|  楼主 | 2022-7-29 23:33 | 只看该作者
RV模块

使用特权

评论回复
12
更多更合适ii|  楼主 | 2022-7-29 23:34 | 只看该作者
RV 引脚表格

使用特权

评论回复
13
更多更合适ii|  楼主 | 2022-7-29 23:37 | 只看该作者
软件
LED/Key 初始化代码

使用特权

评论回复
14
更多更合适ii|  楼主 | 2022-7-29 23:39 | 只看该作者

void BSP_LED_Configure(void);
void BSP_KEY_Configure(void);


void led2on()
{
    TIM_SelectOCxM  (TIM2, TIM_Channel_2, TIM_OCMode_PWM1);
    TIM_CCxCmd      (TIM2, TIM_Channel_2, TIM_CCx_Enable);
}
void led2off()
{
    TIM_SelectOCxM  (TIM2, TIM_Channel_2, TIM_OCMode_Inactive);
    TIM_CCxCmd      (TIM2, TIM_Channel_2, TIM_CCx_Enable);
}
void led3on()
{
    TIM_SelectOCxM  (TIM3, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd      (TIM3, TIM_Channel_1, TIM_CCx_Enable);
}
void led3off()
{
    TIM_SelectOCxM  (TIM3, TIM_Channel_1, TIM_OCMode_Inactive);
    TIM_CCxCmd      (TIM3, TIM_Channel_1, TIM_CCx_Enable);
}
void led4on()
{
    TIM_SelectOCxM  (TIM3, TIM_Channel_2, TIM_OCMode_PWM1);
    TIM_CCxCmd      (TIM3, TIM_Channel_2, TIM_CCx_Enable);
}
void led4off()
{
    TIM_SelectOCxM  (TIM3, TIM_Channel_2, TIM_OCMode_Inactive);
    TIM_CCxCmd      (TIM3, TIM_Channel_2, TIM_CCx_Enable);
}


void closeLED()
{
    LD6_off();
    led2off();
    led3off();
    led4off();
}


void initLEDPWM(u16 psc, u16 arr)
{
    GPIO_InitTypeDef        GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef       TIM_OCInitStructInit;
   
    COMMON_EnableIpClock(emCLOCK_GPIOB);
    COMMON_EnableIpClock(emCLOCK_TIM2);
    COMMON_EnableIpClock(emCLOCK_TIM3);
   
    GPIO_Mode_AF_PP_20MHz_Init(GPIOB, GPIO_Pin_3, EXTI_MAPR_TIM2_PARTIAL1, GPIO_AF_2);
    GPIO_Mode_AF_PP_20MHz_Init(GPIOB, GPIO_Pin_4, EXTI_MAPR_TIM3_PARTIAL, GPIO_AF_1);
    GPIO_Mode_AF_PP_20MHz_Init(GPIOB, GPIO_Pin_5, EXTI_MAPR_TIM3_PARTIAL, GPIO_AF_1);
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler = psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
   
    TIM_OCStructInit(&TIM_OCInitStructInit);
    TIM_OCInitStructInit.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructInit.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructInit.TIM_Pulse = arr >> 1;
    TIM_OCInitStructInit.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OC2Init(TIM2, &TIM_OCInitStructInit);
    TIM_OC1Init(TIM3, &TIM_OCInitStructInit);
    TIM_OC2Init(TIM3, &TIM_OCInitStructInit);
   
    TIM_Cmd(TIM2, ENABLE);
    TIM_Cmd(TIM3, ENABLE);
}

使用特权

评论回复
15
更多更合适ii|  楼主 | 2022-7-29 23:41 | 只看该作者

使用特权

评论回复
16
更多更合适ii|  楼主 | 2022-7-29 23:42 | 只看该作者
Beep 初始化代码

void initBuzzer(u16 prescaler)
{
    GPIO_InitTypeDef        GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef       TIM_OCInitStructInit;
   
    COMMON_EnableIpClock(emCLOCK_GPIOA);
    COMMON_EnableIpClock(emCLOCK_TIM1);
   
    GPIO_Mode_AF_PP_20MHz_Init(GPIOA, GPIO_Pin_8, NO_REMAP, GPIO_AF_2);
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    TIM_TimeBaseStructure.TIM_Period = 999;
    TIM_TimeBaseStructure.TIM_Prescaler = prescaler;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
   
    TIM_OCStructInit(&TIM_OCInitStructInit);
    TIM_OCInitStructInit.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructInit.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructInit.TIM_Pulse = 0;
    TIM_OCInitStructInit.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OC1Init(TIM1, &TIM_OCInitStructInit);
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
   
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

使用特权

评论回复
17
更多更合适ii|  楼主 | 2022-7-29 23:43 | 只看该作者
实例化代码:
RCC_ClocksTypeDef rcc_clocks;


void main()
{
        RCC_GetClocksFreq(&rcc_clocks);
        initBuzzer(rcc_clocks.SYSCLK_Frequency / 2000000 - 1);       
        //...........
}

使用特权

评论回复
18
更多更合适ii|  楼主 | 2022-7-29 23:43 | 只看该作者
RV 初始化代码

void initGPIO_ADC()
{
    GPIO_InitTypeDef GPIO_InitStructure;
   
    COMMON_EnableIpClock(emCLOCK_GPIOA);
   
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}


void initADC()
{
    ADC_InitTypeDef ADC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;
   
    COMMON_EnableIpClock(emCLOCK_ADC1);
    COMMON_EnableIpClock(emCLOCK_DMA1);
   
    initGPIO_ADC();
   
    DMA_DeInit(DMA1_ch1);
    DMA_InitStructure.PeripheralBaseAddr = (u32)&(ADC1->DR);
    DMA_InitStructure.MemoryBaseAddr = (u32)&ADCtemp[0];
    DMA_InitStructure.DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.BufferSize = 3;
    DMA_InitStructure.PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.MemoryDataSize = DMA_MemoryDataSize_Word;
    DMA_InitStructure.Mode = DMA_Mode_Circular;
    DMA_InitStructure.Priority = DMA_Priority_High;
    DMA_InitStructure.M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_ch1, &DMA_InitStructure);
    DMA_Cmd(DMA1_ch1, ENABLE);
   
    ADC_InitStructure.ADC_Mode = ADC_CR_CONTINUE;
    ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC1_ExternalTrigConv_T1_CC1;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_Init(ADC1, &ADC_InitStructure);
   
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1,  1, ADC_Samctl_1_5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_4,  2, ADC_Samctl_1_5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_5,  3, ADC_Samctl_1_5);
   
    ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE);
    ADC_Cmd(ADC1, ENABLE);
    ADC_DMACmd(ADC1, ENABLE);
    ADC1->CFGR |= 0x04;
   
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

使用特权

评论回复
19
更多更合适ii|  楼主 | 2022-7-29 23:46 | 只看该作者
蜂鸣器播放音频
单音频率计算

使用特权

评论回复
20
更多更合适ii|  楼主 | 2022-7-29 23:48 | 只看该作者
本文根据上图的单音频率配置频谱表,如下所示:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

180

帖子

0

粉丝