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接口。
2.2. SD卡管理任务SD卡任务的代码如下所示,其主要的作用是:SD在插入时会触发中断,最终触发到当前任务,用于完成SD卡的挂载操作。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.3. shell任务shell任务的主要目的通过USART0(与Link2的虚拟串口链接),为用户提供一个可以控制播放器的操作接口,主要处理函数如下所示: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;}#endifPRINTF("[APP_SDCARD_Task] SD card drive mounted ");xSemaphoreGive(app->sdcardSem);}}}}
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,初始化代码如下所示。
3. 功能配置功能配置使用的NXP提供的MCUXpresso Config Tools,各个配置项如下所示。 3.1. 管脚配置主要是对用到的USART、I2C、SDIF等外设管脚进行初始化。 3.2. 时钟配置时钟配置如下所示,只配置了基本的时钟以及使用到的外设时钟。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;}
4. 功能展示4.1. 连线方式需要链接的是:- 使用Micro USB链接电脑和开发板的调试串口(主要进行程序下载以及SHELL交互)- 使用3.5MM的接口链接开发板和扬声器(右边的是音频输出)
5. 心得体会这是第一次使用NXP的MCU进行开发,工具做的很完善,例程支持也很完善。芯片的外设资源也很丰富。总之就是很强大,之后可以借助于这个芯片做很多有意思的东西。
总体而言,透过Funpack第十一期的活动收益良多。感谢硬禾提供这么好的活动!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
播放器
+关注
关注
5文章
414浏览量
38818 -
音频
+关注
关注
31文章
3225浏览量
86293
原文标题:基于LPC55S69-EVK的音频播放器 - Funpack11项目分享一
文章出处:【微信号:xiaojiaoyafpga,微信公众号:电子森林】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
德州仪器PCM1691音频DAC:高性能音频转换的理想之选
、192kHz采样、增强多级ΔΣ八通道音频DAC。今天,我们就来深入了解一下这款产品。 文件下载: PCM1691DCA.pdf 产品概述 PCM1691是一款针对消费音频应用的高性能多通道DAC,适用于蓝光光盘播放器、DVD
ES7243E+ES8311音频录制与播放电路资料
本电路为一款低成本音频录制与播放参考电路,含sch原理图和pcb板图。ES7243E接2路模拟麦克风实现音频采集,ES8311接1路功放实现
发表于 02-04 17:18
•4次下载
TLV320AIC28立体声音频编解码器:高性能音频解决方案解析
TLV320AIC28立体声音频编解码器:高性能音频解决方案解析 在当今的电子设备中,音频体验是至关重要的一环。无论是智能手机、MP3 播放器
如何用FPGA控制ADV7513实现HDMI画面显示和音频播放
HDMI接口显示使用DMT时序+TMDS编码来实现。当用FPGA控制HDMI的数据传输时,通常可以采用纯RTL实现TMDS算法或者使用专门的HDMI芯片(如ADV7513)这两种方案来完成。本文主要是介绍如何用FPGA控制ADV7513
速通音频处理:掌握TTS播放、文件播放与录音核心,实现完整功能
播放TTS、播放音频文件及录音是构建完整音频处理功能的三大核心模块。若想快速掌握并实现完整音频处理能力,无需深挖底层细节,只需聚焦“资源加载
新手速成:掌握TTS/文件播放/录音核心,构建完整音频处理功能
刚接触音频开发时,TTS播放、文件播放与录音功能看似复杂,实则是实现完整音频处理的基础。本文从新手视角出发,拆解这三大功能的核心逻辑——资源
花椒直播开源鸿蒙专属直播播放器 助力高效开发高性能直播应用
近日,花椒直播开源了专注于直播场景的播放器“HJPlayer”。它基于自研的通用多媒体框架“HJMedia”打造,与早前开源的推流器“HJPusher”共同构成了覆盖主播推流到观众播放的完整客户端
创通联达助力飞傲M27革新便携HiFi播放器体验
2025年8月15日,飞傲在第19届深圳国际音频展(SIAS)正式发布年度旗舰播放器FIIO M27。作为基于创通联达TurboX C6490 SOM打造的标杆产品,M27凭借该模块的卓越性能与飞傲自研声学技术形成协同突破,为用户带来全方位、全场景的优秀
【创龙TL3562-MiniEVM开发板试用体验】9、带音频波形显示的QT音乐播放器
IMX6U仓库/正点原子I.MX6U 嵌入式Qt开发指南例程源码
本文主要目标是在原播放器基础上增加可视化时域波形(音频振幅)功能。
以下是完整实现方法:
1. 核心思路
时域波形 :直接绘制
发表于 08-08 19:18
蜻蜓FM开源“SmartXPlayer”音频播放组件,打造鸿蒙多端音频播放新引擎
分布式能力和多线程架构,提供高性能、易集成的音频播放能力支持,助力开发者高效构建更顺滑、更智能、更便捷的音频播放体验。 当前,随着音频内容和
Made with KiCad(135):Echo - 开源的音乐播放器
“ Echo 是一个开源硬件平台,专为音乐播放器设计。该项目的目标是开发一款基于开源软件并采用开源设计的高品质音乐播放器。 ” Made with KiCad 系列将支持新的展示方式。直接将以
新品|Unit AudioPlayer,支持 MP3/WAV 播放的音频播放单元
UnitAudioPlayer是一款自带MP3解码功能的音频播放单元,内置高性能音频解码芯片N9301,自带microSD卡座。该产品采用UART通信接口,用户可通过配置指令实现
如何使用本期板卡实现音频播放器
评论