色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    399

    瀏覽量

    37433
  • 音頻
    +關注

    關注

    29

    文章

    2882

    瀏覽量

    81631

原文標題:基于LPC55S69-EVK的音頻播放器 - Funpack11項目分享一

文章出處:【微信號:xiaojiaoyafpga,微信公眾號:電子森林】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    畢業設計競賽選題推薦 | 嵌入式Linux應用之音樂播放器項目實戰(含文檔及源碼)

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

    海貝R1便攜音樂播放器開箱

    作為一個愛聽音樂打發時間的玩家,我已經習慣隨身攜帶一款小巧輕便的音樂播放器,從早期的CD播放器到現在的數碼播放器,它總能在不經意間中給我帶來簡單的快樂。不管是逛街等人的時候,還是工作壓力大的時候
    的頭像 發表于 12-09 09:40 ?180次閱讀
    海貝R1便攜音樂<b class='flag-5'>播放器</b>開箱

    藍牙耳機項目用到功放TPA6112A2,打開音頻播放器從點擊到音頻播出大概有3秒的延時,為什么?

    藍牙耳機項目用到功放TPA6112A2,但是在使用中遇到問題: 1.藍牙連接手機,打開音頻播放器,點擊開始,但是從點擊到音頻播出大概有3秒的延時! 音頻輸出為CSR BC5 請問
    發表于 10-24 06:20

    變速播放器1和2的區別

    的區別。 變速播放器通常允許用戶調整播放速度,以適應不同的觀看或學習需求。這類播放器可能具備以下功能: 變速播放 :用戶可以根據需要加快或減慢播放
    的頭像 發表于 10-14 09:48 ?225次閱讀

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

    好的播放器之所以需要配備解碼,是因為音頻和視頻文件的編碼和解碼是一個復雜的過程,涉及到多種技術和標準。解碼的作用是將壓縮的音頻和視頻數據
    的頭像 發表于 09-23 18:02 ?1314次閱讀

    數字播放器和解碼

    數字播放器和解碼的組合能夠提供更優質的音頻體驗。數字播放器負責處理和傳輸音頻數據,而解碼則負
    的頭像 發表于 09-06 17:35 ?1104次閱讀
    數字<b class='flag-5'>播放器</b>和解碼<b class='flag-5'>器</b>

    HarmonyOS實戰開發-如何實現音頻低時延錄制和播放,AudioVivid音樂播放的相關功能

    錄制 點擊暫停按鈕,暫停錄制,錄音時間也停止計時 點擊繼續按鈕,繼續錄制,錄音時間繼續計時 停止錄制后,會生成錄制結果,界面上有一個低時延播放開關和錄制成功的音頻播放器,點擊低時延播放
    發表于 05-11 20:26

    HarmonyOS開發案例:【視頻播放器

    使用ArkTS語言實現視頻播放器,主要包括主頁面和視頻播放頁面
    的頭像 發表于 04-24 14:52 ?917次閱讀
    HarmonyOS開發案例:【視頻<b class='flag-5'>播放器</b>】

    HarmonyOS開發案例:【視頻播放器

    使用ArkTS語言實現視頻播放器,主要包括主界面和視頻播放界面,
    的頭像 發表于 04-23 17:25 ?725次閱讀
    HarmonyOS開發案例:【視頻<b class='flag-5'>播放器</b>】

    HarmonyOS開發案例:【音樂播放器

    使用ArkTS語言實現了一個簡易的音樂播放器應用
    的頭像 發表于 04-23 15:44 ?1062次閱讀
    HarmonyOS開發案例:【音樂<b class='flag-5'>播放器</b>】

    HarmonyOS開發案例:【視頻播放器

    基于video、swiper和slider組件,實現簡單的視頻播放器,可支持海報輪播、視頻播放等功能。
    的頭像 發表于 04-22 21:06 ?481次閱讀
    HarmonyOS開發案例:【視頻<b class='flag-5'>播放器</b>】

    用STM32F105的USB做了一個讀U盤MP3的播放器,為什么聽到的音樂播放速度很快?

    最近用STM32F105的USB做了一個讀U盤MP3的播放器,使用I2S2_DMA輸出音頻數據,再使用TAS5711數字功放進行輸出聲音。讀出文件的采樣為44.1khz, I2S也設置為此采樣率。不知為何,聽到的音樂播放速度很快
    發表于 04-02 06:52

    鴻蒙開發-視頻播放器方案

    使用on(\'stateChange\')方法監聽狀態變化。如果應用在視頻播放器處于錯誤狀態時執行操作,系統可能會拋出異常或生成其他未定義的行為。 圖1 播放狀態變化示意圖 當播放處于prepared
    發表于 02-19 17:20

    便攜式音頻播放器/迷你小音響實現Hi-Fi高保真音質

    便攜式音頻播放器/迷你小音響實現Hi-Fi高保真音質
    的頭像 發表于 02-04 09:53 ?1117次閱讀

    音頻播放功能的愛普生IC支持12種言語

    音頻播放
    Piezoman壓電俠
    發布于 :2024年01月12日 09:55:57
    主站蜘蛛池模板: 亚洲免费精品| 高清撒尿hdtube撒尿| 第一次破女初国产美女| 桃花在线观看播放| 黑兽在线观看高清在线播放樱花| 在线播放免费人成视频| 欧美性狂猛bbbbbbxxxx| 国产精品久久久久久搜索| 在线视频网站www色| 亚洲一区二区免费看| 欧美精品一区二区三区四区| 国产在线观看免费观看| 20岁αsrian男同志免费| 日日夜夜噜噜| 久久亚洲人成国产精品| 抽插内射高潮呻吟V杜V| 啊灬啊灬啊灬快灬深高潮啦| 一边摸一边桶一边脱免费| 日本片bbbxxx| 精子网久久国产精品| 别插我B嗯啊视频免费| 伊人色啪啪天天综合婷婷| 少妇高潮久久久久7777| 男人有噶坏| 健身房被教练啪到腿软H| 高hnp肉文| 国产东北男同志videos网站| bbwxxxx交女警| 在线播放午夜理论片| 最新国产在线视频| 亚洲日韩国产精品乱-久| 哇嘎在线精品视频在线观看| 牛牛在线视频| 欧美重口绿帽video| 色欲色香天天天综合| 小SAO货水真多把你CAO烂| 秋霞电影网午夜鲁丝片无码| 久久视频在线视频观看天天看视频| 绝色娇嫩美人妻老师| 久草在线草a免费线看| 看全色黄大色大片免费久黄久|