一、前言
在上一章完成了屏幕和驱动的移植,接下来就开始完成音频驱动的移植。
二、硬件接口
使用的是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),大家就听个响。
https://www.youku.com/video/X...