0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用本期板卡实现音频播放器

电子森林 来源:硬禾学堂 作者:硬禾学堂 2021-11-11 10:27 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Funpack11期于10月31日截止后,到现在已审核完毕,相信审核通过的小伙伴都已经收到祝贺邮件了,那就静等返款吧。

本期的任务也是很有用意思,四选一,难度中等。这款来自NXP的强大的LPC55S69-EVK在群友们和各种开源资料的帮助下被大家玩的非常深入,轻松完成这期的几个任务。

下面就来看看vic网友如何使用本期板卡实现音频播放器的吧。以下项目已开源在电子森林:https://www.eetree.cn/project/detail/626,大家感兴趣的可以来一起学习。


1. 实现功能说明本次使用LCP55S69-EVK开发板显示的功能是,任务一:读取SD卡中的音频文件,使用板卡上的3.5mm音频接口播放音乐。2. 功能代码展示2.1. 主函数在主函数中主要是对需要用到的外设进行初始化,例如:USART、I2C、I2S、Codec等,最后创两个任务分别用于完成SD卡管理以及通过USART0提供shell接口

	
int main(void){    int ret;
    /* set BOD VBAT level to 1.65V */    POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);    CLOCK_EnableClock(kCLOCK_InputMux);    CLOCK_EnableClock(kCLOCK_Iocon);    CLOCK_EnableClock(kCLOCK_Gpio0);    CLOCK_EnableClock(kCLOCK_Gpio1);
    /* USART0 clock */    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    /* I2C clock */    CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4);
    PMC->PDRUNCFGCLR0 |= PMC_PDRUNCFG0_PDEN_XTAL32M_MASK;   /*!< Ensure XTAL16M is on  */    PMC->PDRUNCFGCLR0 |= PMC_PDRUNCFG0_PDEN_LDOXO32M_MASK;  /*!< Ensure XTAL16M is on  */    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK; /*!< Ensure CLK_IN is on  */    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;
    /*!< Switch PLL0 clock source selector to XTAL16M */    CLOCK_AttachClk(kEXT_CLK_to_PLL0);
    const pll_setup_t pll0Setup = {        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(2U) | SYSCON_PLL0CTRL_SELP(31U),        .pllndec = SYSCON_PLL0NDEC_NDIV(125U),        .pllpdec = SYSCON_PLL0PDEC_PDIV(8U),        .pllsscg = {0x0U, (SYSCON_PLL0SSCG1_MDIV_EXT(3072U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},        .pllRate = 24576000U,        .flags   = PLL_SETUPFLAG_WAITLOCK};    /*!< Configure PLL to the desired values */    CLOCK_SetPLL0Freq(&pll0Setup);
    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 1U, false);
    /* I2S clocks */    CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM6);    CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM7);
    /* Attach PLL clock to MCLK for I2S, no divider */    CLOCK_AttachClk(kPLL0_to_MCLK);    SYSCON->MCLKDIV = SYSCON_MCLKDIV_DIV(0U);    SYSCON->MCLKIO  = 1U;
    /* reset FLEXCOMM for I2C */    RESET_PeripheralReset(kFC4_RST_SHIFT_RSTn);
    /* reset FLEXCOMM for DMA0 */    RESET_PeripheralReset(kDMA0_RST_SHIFT_RSTn);
    /* reset FLEXCOMM for I2S */    RESET_PeripheralReset(kFC6_RST_SHIFT_RSTn);    RESET_PeripheralReset(kFC7_RST_SHIFT_RSTn);
    /* reset NVIC for FLEXCOMM6 and FLEXCOMM7 */    NVIC_ClearPendingIRQ(FLEXCOMM6_IRQn);    NVIC_ClearPendingIRQ(FLEXCOMM7_IRQn);
    /* Enable interrupts for I2S */    EnableIRQ(FLEXCOMM6_IRQn);    EnableIRQ(FLEXCOMM7_IRQn);
    /* Initialize the rest */    BOARD_InitPins();    BOARD_BootClockPLL1_150M();    BOARD_InitDebugConsole();    BOARD_InitSysctrl();
    PRINTF("
");    PRINTF("**********************************
");    PRINTF("Maestro audio solutions demo start
");    PRINTF("**********************************
");    PRINTF("
");
    ret = BOARD_CODEC_Init();    if (ret)    {        PRINTF("CODEC_Init failed
");        return -1;    }
    if (xTaskCreate(APP_SDCARD_Task, "SDCard Task", SDCARD_TASK_STACK_SIZE, &app, configMAX_PRIORITIES - 4, NULL) !=        pdPASS)    {        PRINTF("
Failed to create application task
");        while (1)            ;    }
    /* Set shell command task priority = 1 */    if (xTaskCreate(APP_Shell_Task, "Shell Task", SHELL_TASK_STACK_SIZE, &app, configMAX_PRIORITIES - 5,                    &app.shell_task_handle) != pdPASS)    {        PRINTF("
Failed to create application task
");        while (1)            ;    }
    /* Run RTOS */    vTaskStartScheduler();
    /* Should not reach this statement */    return 0;}
2.2. SD卡管理任务SD卡任务的代码如下所示,其主要的作用是:SD在插入时会触发中断,最终触发到当前任务,用于完成SD卡的挂载操作。

	
void APP_SDCARD_Task(void *param){    const TCHAR driverNumberBuffer[3U] = {SDDISK + '0', ':', '/'};    FRESULT error;    app_handle_t *app = (app_handle_t *)param;
    app->sdcardSem = xSemaphoreCreateBinary();
    BOARD_SD_Config(&g_sd, APP_SDCARD_DetectCallBack, BOARD_SDMMC_SD_HOST_IRQ_PRIORITY, app);
    PRINTF("[APP_SDCARD_Task] start
");
    /* SD host init function */    if (SD_HostInit(&g_sd) != kStatus_Success)    {        PRINTF("[APP_SDCARD_Task] SD host init failed.
");        vTaskSuspend(NULL);    }
    /* Small delay for SD card detection logic to process */    vTaskDelay(100 / portTICK_PERIOD_MS);
    while (1)    {        /* Block waiting for SDcard detect interrupt */        xSemaphoreTake(app->sdcardSem, portMAX_DELAY);
        if (app->sdcardInserted != app->sdcardInsertedPrev)        {            app->sdcardInsertedPrev = app->sdcardInserted;
            SD_SetCardPower(&g_sd, false);
            if (app->sdcardInserted)            {                /* power on the card */                SD_SetCardPower(&g_sd, true);                if (f_mount(&app->fileSystem, driverNumberBuffer, 0U))                {                    PRINTF("[APP_SDCARD_Task] Mount volume failed.
");                    continue;                }
#if (FF_FS_RPATH >= 2U)                error = f_chdrive((char const *)&driverNumberBuffer[0U]);                if (error)                {                    PRINTF("[APP_SDCARD_Task] Change drive failed.
");                    continue;                }#endif
                PRINTF("[APP_SDCARD_Task] SD card drive mounted
");
                xSemaphoreGive(app->sdcardSem);            }        }    }}
2.3. shell任务shell任务的主要目的通过USART0(与Link2的虚拟串口链接),为用户提供一个可以控制播放器的操作接口,主要处理函数如下所示:
uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWait,                                      BaseType_t xClearCountOnExit,                                      TickType_t xTicksToWait )    {        uint32_t ulReturn;
        configASSERT( uxIndexToWait < configTASK_NOTIFICATION_ARRAY_ENTRIES );
        taskENTER_CRITICAL();        {            /* Only block if the notification count is not already non-zero. */            if( pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] == 0UL )            {                /* Mark this task as waiting for a notification. */                pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskWAITING_NOTIFICATION;
                if( xTicksToWait > ( TickType_t ) 0 )                {                    prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );                    traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait );
                    /* All ports are written to allow a yield in a critical                     * section (some will yield immediately, others wait until the                     * critical section exits) - but it is not something that                     * application code should ever do. */                    portYIELD_WITHIN_API();                }                else                {                    mtCOVERAGE_TEST_MARKER();                }            }            else            {                mtCOVERAGE_TEST_MARKER();            }        }        taskEXIT_CRITICAL();
        taskENTER_CRITICAL();        {            traceTASK_NOTIFY_TAKE( uxIndexToWait );            ulReturn = pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ];
            if( ulReturn != 0UL )            {                if( xClearCountOnExit != pdFALSE )                {                    pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] = 0UL;                }                else                {                    pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] = ulReturn - ( uint32_t ) 1;                }            }            else            {                mtCOVERAGE_TEST_MARKER();            }
            pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskNOT_WAITING_NOTIFICATION;        }        taskEXIT_CRITICAL();
        return ulReturn;    }

	
		2.4. codec初始化codec使用的是板载的wm8904,初始化代码如下所示。

	
int BOARD_CODEC_Init(void){    CODEC_Init(&codecHandle, &boardCodecConfig);
    /* Invert the DAC data in order to output signal with correct polarity - set DACL_DATINV and DACR_DATINV = 1 */    WM8904_WriteRegister((wm8904_handle_t *)codecHandle.codecDevHandle, WM8904_AUDIO_IF_0, 0x1850);
    /* Initial volume kept low for hearing safety. */    CODEC_SetVolume(&codecHandle, kCODEC_PlayChannelHeadphoneLeft | kCODEC_PlayChannelHeadphoneRight, 75);
    return 0;}
3. 功能配置功能配置使用的NXP提供的MCUXpresso Config Tools,各个配置项如下所示。 3.1. 管脚配置主要是对用到的USART、I2C、SDIF等外设管脚进行初始化。 3.2. 时钟配置时钟配置如下所示,只配置了基本的时钟以及使用到的外设时钟。3aebf62c-427c-11ec-b939-dac502259ad0.png  4. 功能展示4.1. 连线方式需要链接的是:- 使用Micro USB链接电脑和开发板的调试串口(主要进行程序下载以及SHELL交互)- 使用3.5MM的接口链接开发板和扬声器(右边的是音频输出) 5. 心得体会这是第一次使用NXP的MCU进行开发,工具做的很完善,例程支持也很完善。芯片的外设资源也很丰富。总之就是很强大,之后可以借助于这个芯片做很多有意思的东西。 总体而言,透过Funpack第十一期的活动收益良多。感谢硬禾提供这么好的活动!
责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 播放器
    +关注

    关注

    5

    文章

    413

    浏览量

    38530
  • 音频
    +关注

    关注

    31

    文章

    3135

    浏览量

    84939

原文标题:基于LPC55S69-EVK的音频播放器 - Funpack11项目分享一

文章出处:【微信号:xiaojiaoyafpga,微信公众号:电子森林】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    速通音频处理:掌握TTS播放、文件播放与录音核心,实现完整功能

    播放TTS、播放音频文件及录音是构建完整音频处理功能的三大核心模块。若想快速掌握并实现完整音频处理能力,无需深挖底层细节,只需聚焦“资源加载
    的头像 发表于 11-21 19:27 97次阅读
    速通<b class='flag-5'>音频</b>处理:掌握TTS<b class='flag-5'>播放</b>、文件<b class='flag-5'>播放</b>与录音核心,<b class='flag-5'>实现</b>完整功能

    花椒直播开源鸿蒙专属直播播放器 助力高效开发高性能直播应用

    近日,花椒直播开源了专注于直播场景的播放器“HJPlayer”。它基于自研的通用多媒体框架“HJMedia”打造,与早前开源的推流“HJPusher”共同构成了覆盖主播推流到观众播放的完整客户端
    的头像 发表于 10-22 11:20 205次阅读
    花椒直播开源鸿蒙专属直播<b class='flag-5'>播放器</b> 助力高效开发高性能直播应用

    创通联达助力飞傲M27革新便携HiFi播放器体验

    2025年8月15日,飞傲在第19届深圳国际音频展(SIAS)正式发布年度旗舰播放器FIIO M27。作为基于创通联达TurboX C6490 SOM打造的标杆产品,M27凭借该模块的卓越性能与飞傲自研声学技术形成协同突破,为用户带来全方位、全场景的优秀
    的头像 发表于 08-19 16:15 1597次阅读

    【创龙TL3562-MiniEVM开发板试用体验】9、带音频波形显示的QT音乐播放器

    IMX6U仓库/正点原子I.MX6U 嵌入式Qt开发指南例程源码 本文主要目标是在原播放器基础上增加可视化时域波形(音频振幅)功能。 以下是完整实现方法: 1. 核心思路 时域波形 :直接绘制
    发表于 08-08 19:18

    蜻蜓FM开源“SmartXPlayer”音频播放组件,打造鸿蒙多端音频播放新引擎

    分布式能力和多线程架构,提供高性能、易集成的音频播放能力支持,助力开发者高效构建更顺滑、更智能、更便捷的音频播放体验。 当前,随着音频内容和
    的头像 发表于 07-21 16:31 440次阅读
    蜻蜓FM开源“SmartXPlayer”<b class='flag-5'>音频</b><b class='flag-5'>播放</b>组件,打造鸿蒙多端<b class='flag-5'>音频</b><b class='flag-5'>播放</b>新引擎

    Made with KiCad(135):Echo - 开源的音乐播放器

    “  Echo 是一个开源硬件平台,专为音乐播放器设计。该项目的目标是开发一款基于开源软件并采用开源设计的高品质音乐播放器。 ”   Made with KiCad 系列将支持新的展示方式。直接将以
    的头像 发表于 07-16 11:17 2737次阅读
    Made with KiCad(135):Echo - 开源的音乐<b class='flag-5'>播放器</b>

    新品|Unit AudioPlayer,支持 MP3/WAV 播放音频播放单元

    UnitAudioPlayer是一款自带MP3解码功能的音频播放单元,内置高性能音频解码芯片N9301,自带microSD卡座。该产品采用UART通信接口,用户可通过配置指令实现
    的头像 发表于 06-20 15:59 711次阅读
    新品|Unit AudioPlayer,支持 MP3/WAV <b class='flag-5'>播放</b>的<b class='flag-5'>音频</b><b class='flag-5'>播放</b>单元

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包下载

    基于STM32的音乐播放器电路+PCB源文件+源码+论文等打包,推荐下载!
    发表于 05-29 21:37

    Made with KiCad:Tangara 便携式音乐播放器

    不同,Tangara 还配备了全彩显示屏、内置电池以及单手触控交互界面,为开发者提供更完整的硬件支持。 现代技术加持的高品质音频体验 Tangara 首先是一款音频播放器,其核心功能设计均围绕这一本质展开
    发表于 04-16 14:01

    圣邦微电子SGM56101Q 车规级110dB、192kHz、32 位、8 通道音频数模转换器

    圣邦微电子推出 SGM56101Q,一款车规级 110dB、192kHz、32 位、8 通道音频数模转换器。 该器件可应用于汽车音响系统、CD 播放器、耳机、网络音频播放器、RCA 接
    的头像 发表于 03-05 08:48 1562次阅读
    圣邦微电子SGM56101Q 车规级110dB、192kHz、32 位、8 通道<b class='flag-5'>音频数模转换器</b>

    海贝HiBy R1播放器体验

    之前分享过用接入便携耳放来提升音质,让手机端也能享受HiFi级的听感体验。这个方案对于没有数码播放器的初烧用户来说,确实是种非常高效的方法。 但缺点也是有的,比如歌曲存放需要占用手机存储空间,手机
    的头像 发表于 01-24 11:27 4688次阅读
    海贝HiBy R1<b class='flag-5'>播放器</b>体验

    蛇年焕新,数字标牌播放器点亮新春营销

    春节期间,商场成为人们欢聚、购物的热门场所。在商场入口处,大型数字标牌展示着精心制作的新春广告,高清画质将喜庆氛围完美呈现,流畅的切换效果瞬间将顾客带入热闹的春节气氛中。 借助数字标牌播放器
    的头像 发表于 01-24 11:26 625次阅读
    蛇年焕新,数字标牌<b class='flag-5'>播放器</b>点亮新春营销

    将基于PC的MP3播放器软件移植到ADSP-21262 SHARC处理

    电子发烧友网站提供《将基于PC的MP3播放器软件移植到ADSP-21262 SHARC处理上.pdf》资料免费下载
    发表于 01-03 14:54 0次下载
    将基于PC的MP3<b class='flag-5'>播放器</b>软件移植到ADSP-21262 SHARC处理<b class='flag-5'>器</b>上

    索尼发布空间现实显示播放器新版本

    索尼于2024年12月发布适用于空间现实显示屏ELF-SR1和ELF-SR2的空间现实显示播放器新版本。
    的头像 发表于 12-24 15:19 959次阅读

    毕业设计竞赛选题推荐 | 嵌入式Linux应用之音乐播放器项目实战(含文档及源码)

    01引言随着数字化娱乐日益普及,音乐播放器作为人们生活中不可或缺的一部分,扮演着重要的角色。无论是通勤途中、健身锻炼还是工作学习,一个好用的音乐播放器都能为用户提供愉悦的音频体验,丰富生活的同时也
    的头像 发表于 12-23 16:50 1359次阅读
    毕业设计竞赛选题推荐 | 嵌入式Linux应用之音乐<b class='flag-5'>播放器</b>项目实战(含文档及源码)