【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),大家就听个响。
优酷视频