一、前言
在上一章完成了屏幕和驱动的移植,接下来就开始完成音频驱动的移植。
二、硬件接口
使用的是PA4口DAC_OUT1,单声道播放。需要注意的是要将开发板的拨动开关拨到MCU DAC这一侧。
三、驱动移植
驱动移植分为两部分,一部分是DAC的移植,一部分是定时器的移植。
DAC: DAC选择的是PA4口,还有PA5口也可以选择,或者直接双声道。
定时器TIM6: 使用的是TIM6,因为此定时器没有太多功能,物尽其用。
DAC移植:
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);
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_Enable(DAC, DAC_CHN_1, true);
DAC_EnableChannelOutput(DAC, DAC_CHN_1, true);
DAC_PutData(DAC, DAC_CHN_1, 0u, DAC_Align_8b_Right);
}
TIM6移植:
void bsp_tim6_config(uint32_t psc,uint32_t arr)
{
TIM_Init_Type TIM_TimeBaseStructure;
RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_TIM6, true);
RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_TIM6);
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);
NVIC_EnableIRQ(TIM6_IRQn);
TIM_EnableInterrupts((TIM_Type *)TIM6, TIM_INT_UPDATE_PERIOD, true);
TIM_Stop((TIM_Type *)TIM6);
}
void TIM6_IRQHandler(void)
{
if ( 0u != (TIM_GetInterruptStatus((TIM_Type *)TIM6) & TIM_STATUS_UPDATE_PERIOD ) )
{
AUDIO_PlayIRQHandlerCallBack();
}
TIM_ClearInterruptStatus((TIM_Type *)TIM6, TIM_STATUS_UPDATE_PERIOD);
}
四、测试
配置好之后,我们就可以来播放一首音乐了。这里的音乐是自己用软件录的一小段,音质不是很好(8位数据,单声道,8000HZ),大家就听个响。
原作者:卢阿涛
|