在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用本期板卡實(shí)現(xiàn)音頻播放器

電子森林 ? 來(lái)源:硬禾學(xué)堂 ? 作者:硬禾學(xué)堂 ? 2021-11-11 10:27 ? 次閱讀

Funpack11期于10月31日截止后,到現(xiàn)在已審核完畢,相信審核通過(guò)的小伙伴都已經(jīng)收到祝賀郵件了,那就靜等返款吧。

本期的任務(wù)也是很有用意思,四選一,難度中等。這款來(lái)自NXP的強(qiáng)大的LPC55S69-EVK在群友們和各種開(kāi)源資料的幫助下被大家玩的非常深入,輕松完成這期的幾個(gè)任務(wù)。

下面就來(lái)看看vic網(wǎng)友如何使用本期板卡實(shí)現(xiàn)音頻播放器的吧。以下項(xiàng)目已開(kāi)源在電子森林:https://www.eetree.cn/project/detail/626,大家感興趣的可以來(lái)一起學(xué)習(xí)。


1. 實(shí)現(xiàn)功能說(shuō)明本次使用LCP55S69-EVK開(kāi)發(fā)板顯示的功能是,任務(wù)一:讀取SD卡中的音頻文件,使用板卡上的3.5mm音頻接口播放音樂(lè)。2. 功能代碼展示2.1. 主函數(shù)在主函數(shù)中主要是對(duì)需要用到的外設(shè)進(jìn)行初始化,例如:USART、I2C、I2S、Codec等,最后創(chuàng)兩個(gè)任務(wù)分別用于完成SD卡管理以及通過(guò)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卡管理任務(wù)SD卡任務(wù)的代碼如下所示,其主要的作用是:SD在插入時(shí)會(huì)觸發(fā)中斷,最終觸發(fā)到當(dāng)前任務(wù),用于完成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任務(wù)shell任務(wù)的主要目的通過(guò)USART0(與Link2的虛擬串口鏈接),為用戶提供一個(gè)可以控制播放器的操作接口,主要處理函數(shù)如下所示:
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,各個(gè)配置項(xiàng)如下所示。 3.1. 管腳配置主要是對(duì)用到的USART、I2C、SDIF等外設(shè)管腳進(jìn)行初始化。 3.2. 時(shí)鐘配置時(shí)鐘配置如下所示,只配置了基本的時(shí)鐘以及使用到的外設(shè)時(shí)鐘。3aebf62c-427c-11ec-b939-dac502259ad0.png ?4. 功能展示4.1. 連線方式需要鏈接的是:- 使用Micro USB鏈接電腦和開(kāi)發(fā)板的調(diào)試串口(主要進(jìn)行程序下載以及SHELL交互)- 使用3.5MM的接口鏈接開(kāi)發(fā)板和揚(yáng)聲器(右邊的是音頻輸出) 5. 心得體會(huì)這是第一次使用NXP的MCU進(jìn)行開(kāi)發(fā),工具做的很完善,例程支持也很完善。芯片的外設(shè)資源也很豐富。總之就是很強(qiáng)大,之后可以借助于這個(gè)芯片做很多有意思的東西。 總體而言,透過(guò)Funpack第十一期的活動(dòng)收益良多。感謝硬禾提供這么好的活動(dòng)!
責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 播放器
    +關(guān)注

    關(guān)注

    5

    文章

    411

    瀏覽量

    37966
  • 音頻
    +關(guān)注

    關(guān)注

    29

    文章

    3029

    瀏覽量

    83150

原文標(biāo)題:基于LPC55S69-EVK的音頻播放器 - Funpack11項(xiàng)目分享一

文章出處:【微信號(hào):xiaojiaoyafpga,微信公眾號(hào):電子森林】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    新品|Unit AudioPlayer,支持 MP3/WAV 播放音頻播放單元

    UnitAudioPlayer是一款自帶MP3解碼功能的音頻播放單元,內(nèi)置高性能音頻解碼芯片N9301,自帶microSD卡座。該產(chǎn)品采用UART通信接口,用戶可通過(guò)配置指令實(shí)現(xiàn)
    的頭像 發(fā)表于 06-20 15:59 ?71次閱讀
    新品|Unit AudioPlayer,支持 MP3/WAV <b class='flag-5'>播放</b>的<b class='flag-5'>音頻</b><b class='flag-5'>播放</b>單元

    基于STM32的音樂(lè)播放器電路+PCB源文件+源碼+論文等打包下載

    基于STM32的音樂(lè)播放器電路+PCB源文件+源碼+論文等打包,推薦下載!
    發(fā)表于 05-29 21:37

    Made with KiCad:Tangara 便攜式音樂(lè)播放器

    不同,Tangara 還配備了全彩顯示屏、內(nèi)置電池以及單手觸控交互界面,為開(kāi)發(fā)者提供更完整的硬件支持。 現(xiàn)代技術(shù)加持的高品質(zhì)音頻體驗(yàn) Tangara 首先是一款音頻播放器,其核心功能設(shè)計(jì)均圍繞這一本質(zhì)展開(kāi)
    發(fā)表于 04-16 14:01

    圣邦微電子SGM56101Q 車規(guī)級(jí)110dB、192kHz、32 位、8 通道音頻數(shù)模轉(zhuǎn)換器

    圣邦微電子推出 SGM56101Q,一款車規(guī)級(jí) 110dB、192kHz、32 位、8 通道音頻數(shù)模轉(zhuǎn)換器。 該器件可應(yīng)用于汽車音響系統(tǒng)、CD 播放器、耳機(jī)、網(wǎng)絡(luò)音頻播放器、RCA 接
    的頭像 發(fā)表于 03-05 08:48 ?1075次閱讀
    圣邦微電子SGM56101Q 車規(guī)級(jí)110dB、192kHz、32 位、8 通道<b class='flag-5'>音頻數(shù)模轉(zhuǎn)換器</b>

    海貝HiBy R1播放器體驗(yàn)

    之前分享過(guò)用接入便攜耳放來(lái)提升音質(zhì),讓手機(jī)端也能享受HiFi級(jí)的聽(tīng)感體驗(yàn)。這個(gè)方案對(duì)于沒(méi)有數(shù)碼播放器的初燒用戶來(lái)說(shuō),確實(shí)是種非常高效的方法。 但缺點(diǎn)也是有的,比如歌曲存放需要占用手機(jī)存儲(chǔ)空間,手機(jī)
    的頭像 發(fā)表于 01-24 11:27 ?964次閱讀
    海貝HiBy R1<b class='flag-5'>播放器</b>體驗(yàn)

    索尼發(fā)布空間現(xiàn)實(shí)顯示播放器新版本

    索尼于2024年12月發(fā)布適用于空間現(xiàn)實(shí)顯示屏ELF-SR1和ELF-SR2的空間現(xiàn)實(shí)顯示播放器新版本。
    的頭像 發(fā)表于 12-24 15:19 ?574次閱讀

    畢業(yè)設(shè)計(jì)競(jìng)賽選題推薦 | 嵌入式Linux應(yīng)用之音樂(lè)播放器項(xiàng)目實(shí)戰(zhàn)(含文檔及源碼)

    01引言隨著數(shù)字化娛樂(lè)日益普及,音樂(lè)播放器作為人們生活中不可或缺的一部分,扮演著重要的角色。無(wú)論是通勤途中、健身鍛煉還是工作學(xué)習(xí),一個(gè)好用的音樂(lè)播放器都能為用戶提供愉悅的音頻體驗(yàn),豐富生活的同時(shí)也
    的頭像 發(fā)表于 12-23 16:50 ?829次閱讀
    畢業(yè)設(shè)計(jì)競(jìng)賽選題推薦 | 嵌入式Linux應(yīng)用之音樂(lè)<b class='flag-5'>播放器</b>項(xiàng)目實(shí)戰(zhàn)(含文檔及源碼)

    海貝R1便攜音樂(lè)播放器開(kāi)箱

    作為一個(gè)愛(ài)聽(tīng)音樂(lè)打發(fā)時(shí)間的玩家,我已經(jīng)習(xí)慣隨身攜帶一款小巧輕便的音樂(lè)播放器,從早期的CD播放器到現(xiàn)在的數(shù)碼播放器,它總能在不經(jīng)意間中給我?guī)?lái)簡(jiǎn)單的快樂(lè)。不管是逛街等人的時(shí)候,還是工作壓力大的時(shí)候
    的頭像 發(fā)表于 12-09 09:40 ?831次閱讀
    海貝R1便攜音樂(lè)<b class='flag-5'>播放器</b>開(kāi)箱

    如何在音頻播放時(shí)插播音頻

    ZDP14x0系列芯片是內(nèi)置開(kāi)源GUI引擎的圖像顯示專用驅(qū)動(dòng)芯片,內(nèi)部集成16MB/64MB顯示內(nèi)存、2D圖形加速、音視頻解碼等豐富多媒體功能。不僅支持音視頻播放,還支持在音視頻播放
    的頭像 發(fā)表于 11-25 15:40 ?1187次閱讀
    如何在<b class='flag-5'>音頻</b><b class='flag-5'>播放</b>時(shí)插播<b class='flag-5'>音頻</b>

    藍(lán)牙耳機(jī)項(xiàng)目用到功放TPA6112A2,打開(kāi)音頻播放器從點(diǎn)擊到音頻播出大概有3秒的延時(shí),為什么?

    藍(lán)牙耳機(jī)項(xiàng)目用到功放TPA6112A2,但是在使用中遇到問(wèn)題: 1.藍(lán)牙連接手機(jī),打開(kāi)音頻播放器,點(diǎn)擊開(kāi)始,但是從點(diǎn)擊到音頻播出大概有3秒的延時(shí)! 音頻輸出為CSR BC5 請(qǐng)問(wèn)
    發(fā)表于 10-24 06:20

    變速播放器1和2的區(qū)別

    的區(qū)別。 變速播放器通常允許用戶調(diào)整播放速度,以適應(yīng)不同的觀看或?qū)W習(xí)需求。這類播放器可能具備以下功能: 變速播放 :用戶可以根據(jù)需要加快或減慢播放
    的頭像 發(fā)表于 10-14 09:48 ?616次閱讀

    步步高AB915D DVD播放器維修圖紙

    步步高AB915D DVD播放器采用ZIVA-4.1芯片方案
    發(fā)表于 09-29 10:18 ?1次下載

    為什么好的播放器還要配解碼

    好的播放器之所以需要配備解碼,是因?yàn)?b class='flag-5'>音頻和視頻文件的編碼和解碼是一個(gè)復(fù)雜的過(guò)程,涉及到多種技術(shù)和標(biāo)準(zhǔn)。解碼的作用是將壓縮的音頻和視頻數(shù)據(jù)
    的頭像 發(fā)表于 09-23 18:02 ?2976次閱讀

    數(shù)字播放器和解碼

    數(shù)字播放器和解碼的組合能夠提供更優(yōu)質(zhì)的音頻體驗(yàn)。數(shù)字播放器負(fù)責(zé)處理和傳輸音頻數(shù)據(jù),而解碼則負(fù)
    的頭像 發(fā)表于 09-06 17:35 ?2045次閱讀
    數(shù)字<b class='flag-5'>播放器</b>和解碼<b class='flag-5'>器</b>

    【飛凌嵌入式OK527N-C開(kāi)發(fā)板體驗(yàn)】3.鼠標(biāo)+硬件編解碼+音頻播放器

    有偶而的報(bào)錯(cuò),且運(yùn)行一段時(shí)間 會(huì)有明顯卡頓,懷疑是加載一段,解碼一段。 測(cè)試音頻播放,啟動(dòng)后可以 顯示 出播放器畫(huà)面,但我沒(méi)鼠標(biāo)無(wú)法播放,但神奇的地方是我這個(gè)屏幕有觸摸,點(diǎn)按時(shí)會(huì)導(dǎo)致
    發(fā)表于 07-25 23:47
    主站蜘蛛池模板: 极品丰满翘臀后进啪啪 | 国产精品青草久久久久福利99 | 五月丁香六月综合缴清无码 | 黄色视屏在线免费播放 | 午夜在线网站 | 直接观看黄网站免费视频 | 色妇网| 都市激情亚洲 | 久久青草18免费观看网站 | 迅雷www天堂在线资源 | 加勒比综合网 | 五月婷婷综合在线 | 福利片午夜| 国产欧美亚洲精品 | freesexvideo性欧美tv | 网友自拍区一区二区三区 | 精品一级毛片 | 国产香蕉在线精彩视频 | 婷婷开心激情 | 国产人人艹 | 亚洲国产情侣偷自在线二页 | 久久婷婷是五月综合色狠狠 | 黄色片网站大全 | 一级毛片免费毛片一级毛片免费 | 国产免费人成在线看视频 | 久久综合欧美成人 | 国产精品丝袜在线观看 | 午夜黄色在线观看 | 深爱五月激情网 | 亚洲高清色图 | 在线观看视频你懂得 | 色综合久| 色综合亚洲天天综合网站 | 赛罗奥特曼银河帝国普通话免费版 | 久久视频精品线视频在线网站 | 色婷五月 | 天天插天天舔 | 丁香六月激情综合 | 色婷婷综合在线 | 97天天摸天天碰天天爽 | 2021最新国产成人精品视频 |