> 文档中心 > 【MM32F5270开发板试用】二、使用DAC播放音频

【MM32F5270开发板试用】二、使用DAC播放音频


本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:卢阿涛

一、前言

在上一章完成了屏幕和驱动的移植,接下来就开始完成音频驱动的移植。

二、硬件接口

使用的是PA4口DAC_OUT1,单声道播放。需要注意的是要将开发板的拨动开关拨到MCU DAC这一侧。

三、驱动移植

驱动移植分为两部分,一部分是DAC的移植,一部分是定时器的移植。
**DAC:**DAC选择的是PA4口,还有PA5口也可以选择,或者直接双声道。
**定时器TIM6:**使用的是TIM6,因为此定时器没有太多功能,物尽其用。

DAC移植:

/* dac1 gpio config */void bsp_dac1_gpio_config(void){    GPIO_Init_Type GPIO_InitStructure;    DAC_Init_Type    DAC_InitStructure;    RCC_EnableAHB1Periphs(BSP_DAC1_RCC, true); //使能时钟    RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_DAC, true);//使能DAC时钟    GPIO_InitStructure.Pins     =     BSP_DAC1_PIN;    GPIO_InitStructure.PinMode     =     GPIO_PinMode_In_Analog;  //模拟输入    GPIO_InitStructure.Speed    =     GPIO_Speed_50MHz;    GPIO_Init(BSP_DAC1_PORT, &GPIO_InitStructure);     //初始化    DAC_InitStructure.EnableTrigger = false;  // 软件触发    DAC_InitStructure.EnableOutBuf = false; // 输出缓存关闭    DAC_Init(DAC, DAC_CHN_1, &DAC_InitStructure); //初始化 DAC 通道 1     DAC_Enable(DAC, DAC_CHN_1, true);    DAC_EnableChannelOutput(DAC, DAC_CHN_1, true); // 触发使能     /* Clear input register. */    DAC_PutData(DAC, DAC_CHN_1, 0u, DAC_Align_8b_Right); // 8位数据右对齐}

TIM6移植:

void bsp_tim6_config(uint32_t psc,uint32_t arr){     TIM_Init_Type  TIM_TimeBaseStructure; // 定时器结构体 // 开启定时器时钟,即内部时钟CK_INT=120M    RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_TIM6, true);    RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_TIM6);    // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断      TIM_TimeBaseStructure.ClockFreqHz = CLOCK_SYS_FREQ;    TIM_TimeBaseStructure.StepFreqHz = psc;    TIM_TimeBaseStructure.Period = arr - 1u;    TIM_TimeBaseStructure.EnablePreloadPeriod = false;    TIM_TimeBaseStructure.PeriodMode = TIM_PeriodMode_Continuous;    TIM_TimeBaseStructure.CountMode = TIM_CountMode_Increasing;    TIM_Init((TIM_Type *)TIM6, &TIM_TimeBaseStructure);      /* Enable interrupt. */    NVIC_EnableIRQ(TIM6_IRQn);    TIM_EnableInterrupts((TIM_Type *)TIM6, TIM_INT_UPDATE_PERIOD, true);  // 更新中断    /* Start the counter. */    //  TIM_Start((TIM_Type *)TIM6);    TIM_Stop((TIM_Type *)TIM6); // 关闭定时器}/* 定时器6中断服务程序 */void  TIM6_IRQHandler(void){    if ( 0u != (TIM_GetInterruptStatus((TIM_Type *)TIM6) & TIM_STATUS_UPDATE_PERIOD ) ) /* Check update status. */    {    /* 执行对应功能 */   AUDIO_PlayIRQHandlerCallBack();     }    TIM_ClearInterruptStatus((TIM_Type *)TIM6, TIM_STATUS_UPDATE_PERIOD);  }

四、测试

配置好之后,我们就可以来播放一首音乐了。这里的音乐是自己用软件录的一小段,音质不是很好(8位数据,单声道,8000HZ),大家就听个响。
优酷视频