卢阿涛 · 2022年08月22日 · 广东

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

一、前言

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

二、硬件接口

使用的是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...

推荐阅读
关注数
6108
内容数
272
灵动MM32 MCU相关技术知识,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息