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文章
413瀏覽量
38732 -
音頻
+關注
關注
31文章
3188瀏覽量
85571
原文標題:基于LPC55S69-EVK的音頻播放器 - Funpack11項目分享一
文章出處:【微信號:xiaojiaoyafpga,微信公眾號:電子森林】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
ES7243E+ES8311音頻錄制與播放電路資料
本電路為一款低成本音頻錄制與播放參考電路,含sch原理圖和pcb板圖。ES7243E接2路模擬麥克風實現音頻采集,ES8311接1路功放實現
發表于 02-04 17:18
?1次下載
速通音頻處理:掌握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通信接口,用戶可通過配置指令實現
【開源分享】用ESP32復刻一個iPod :便攜式音樂播放器Tangara
Tangara是一款便攜式開源音樂播放器,硬件電路使用KiCad設計,而且它的外殼和固件也是100%開源,點擊閱讀原文或下載鏈接可跳轉下載。它通過3.5毫米耳機插孔或藍牙輸出高品質聲音,電池續航
Made with KiCad:Tangara 便攜式音樂播放器
不同,Tangara 還配備了全彩顯示屏、內置電池以及單手觸控交互界面,為開發者提供更完整的硬件支持。
現代技術加持的高品質音頻體驗
Tangara 首先是一款音頻播放器,其核心功能設計均圍繞這一本質展開
發表于 04-16 14:01
一款新的播放器:Xibo for ChromeOS介紹
我們非常高興地宣布與 ChromeOS 合作推出一款新的播放器。為您帶來 Xibo for ChromeOS!這一最新的可靠、高度安全且易于管理的數字標牌解決方案使客戶能夠充分利用 Xibo CMS
如何使用本期板卡實現音頻播放器
評論