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

聚豐項(xiàng)目 > DEMO板AB32VG1測(cè)試播放SD卡播放WAV音樂

DEMO板AB32VG1測(cè)試播放SD卡播放WAV音樂

用中科藍(lán)訊DEMO板AB32VG1 測(cè)試RT-thread 制作 SD卡播放WAV音樂和點(diǎn)燈

zsf6853 zsf6853

分享
0 喜歡這個(gè)項(xiàng)目
團(tuán)隊(duì)介紹

zsf6853 zsf6853

團(tuán)隊(duì)成員

李朝暉 嵌入式研發(fā)經(jīng)理

分享
項(xiàng)目簡(jiǎn)介
用中科藍(lán)訊DEMO板AB32VG1 測(cè)試RT-thread 制作 SD卡播放WAV音樂和點(diǎn)燈
硬件說明

DEMO板AB32VG1一塊,一張32G  SD卡  ,小型USB供電立體聲音箱

image.png

軟件說明

首先下載RT-Thread Studio 安裝成功

新建項(xiàng)目  test_SD_WAV 基于AB32VG1開發(fā)板,RT-Thread系統(tǒng)

編譯一下沒有問題,只能打印“hello world"

增加點(diǎn)燈程序,下面兩個(gè)文件 

”RGB.c"

/*

 * Copyright (c) 2006-2021, RT-Thread Development Team

 *

 * SPDX-License-Identifier: Apache-2.0

 *

 * Change Logs:

 * Date           Author       Notes

 * 2021-11-20     zsf       the first version

 */

#include

#include "board.h"

#include "rgb.h"

struct Led_s Led;


void RGB_Init(void)

{

 // 獲得 led

 Led.LED_R = rt_pin_get("PE.1");

 Led.LED_G = rt_pin_get("PE.4");

 Led.LED_B = rt_pin_get("PA.2");

 // 設(shè)置引腳為輸出方式

 rt_pin_mode(Led.LED_R, PIN_MODE_OUTPUT);

 rt_pin_mode(Led.LED_G, PIN_MODE_OUTPUT);

 rt_pin_mode(Led.LED_B, PIN_MODE_OUTPUT);

}

//編寫 rgb 不同顏色點(diǎn)燈驅(qū)動(dòng),通過 rt_pin_write 來控制 gpio 口電平高低,點(diǎn)亮紅燈即

//拉低紅燈引腳,拉高其他兩個(gè)顏色燈的引腳

//傳入?yún)?shù) on=1:對(duì)應(yīng)亮,on=0:對(duì)應(yīng)滅

//紅燈驅(qū)動(dòng)

void RGB_Red(rt_bool_t on)

{

     rt_pin_write(Led.LED_G, PIN_HIGH);

     rt_pin_write(Led.LED_B, PIN_HIGH);

     if (on)

     {

         rt_pin_write(Led.LED_R, PIN_LOW);

     }

     else

     {

         rt_pin_write(Led.LED_R, PIN_HIGH);

     }

}

//藍(lán)燈驅(qū)動(dòng)

void RGB_Blue(rt_bool_t on)

{

     rt_pin_write(Led.LED_G, PIN_HIGH);

     rt_pin_write(Led.LED_R, PIN_HIGH);

     if (on)

     {

         rt_pin_write(Led.LED_B, PIN_LOW);

     }

     else

     {

         rt_pin_write(Led.LED_B, PIN_HIGH);

     }

}

//綠燈驅(qū)動(dòng)

void RGB_Green(rt_bool_t on)

{

     rt_pin_write(Led.LED_R, PIN_HIGH);

     rt_pin_write(Led.LED_B, PIN_HIGH);

     if (on)

     {

         rt_pin_write(Led.LED_G, PIN_LOW);

     }

     else

     {

         rt_pin_write(Led.LED_G, PIN_HIGH);

     }

}

"rgb.h"

/*

 * Copyright (c) 2006-2021, RT-Thread Development Team

 *

 * SPDX-License-Identifier: Apache-2.0

 *

 * Change Logs:

 * Date           Author       Notes

 * 2021-11-20     zsf       the first version

 */

#ifndef APPLICATIONS_RGB_H_

#define APPLICATIONS_RGB_H_


struct Led_s

{

 uint8_t LED_R;

 uint8_t LED_B;

 uint8_t LED_G;

}; // 定義一個(gè) RGB 結(jié)構(gòu)體


void RGB_Init(void);

void RGB_Blue(rt_bool_t on);

void RGB_Green(rt_bool_t on);

void RGB_Red(rt_bool_t on);


#endif /* APPLICATIONS_RGB_H_ */

修改main.c

/*

 * Copyright (c) 2020-2021, Bluetrum Development Team

 *

 * SPDX-License-Identifier: Apache-2.0

 *

 * Change Logs:

 * Date           Author       Notes

 * 2020/12/10     greedyhao    The first version

 */


/**

 * Notice!

 * All functions or data that are called during an interrupt need to be in RAM.

 * You can do it the way exception_isr() does.

 */


#include

#include "board.h"

#include "rgb.h"


static void rgb_thread_entry(void* p)

{

     RGB_Init();

     while(1)

     {

         rt_thread_mdelay(1000);

         rt_kprintf("Blue\r\n");

         RGB_Blue(1);

         rt_thread_mdelay(1000);

         rt_kprintf("Green\r\n");

         RGB_Green(1);

         rt_thread_mdelay(1000);

         rt_kprintf("Red\r\n");

         RGB_Red(1);

     }

}

static int Thread_RGB(void)

{

     rt_thread_t thread = RT_NULL;

     thread = rt_thread_create("rgb", rgb_thread_entry, RT_NULL, 512, 10, 10);

     if(thread == RT_NULL)

     {

         rt_kprintf("Thread_GRB Init ERROR");

         return RT_ERROR;

     }

     rt_thread_startup(thread);

}


INIT_APP_EXPORT(Thread_RGB);


int main(void)

{

    uint8_t pin = rt_pin_get("PE.1");


    rt_pin_mode(pin, PIN_MODE_OUTPUT);

    rt_kprintf("Hello, world\n");

  

    while (1)

    {

       // rt_pin_write(pin, PIN_LOW);

        rt_thread_mdelay(500);

       // rt_pin_write(pin, PIN_HIGH);

        rt_thread_mdelay(500);

    }

}

編譯下載可以看到燈閃亮變色,第一步成功?。?!

要播放SD卡中的wav文件 ,讓我們領(lǐng)略一下RT-Thread Studio友好和方便

第一步配置SD卡硬件驅(qū)動(dòng)  test_SD_WAV項(xiàng)目管理器下第一行“RT-Thread Settings"->"組件”->"設(shè)備驅(qū)動(dòng)程序“如下圖

image.png

勾選 ”使用SD/MMC 設(shè)備驅(qū)動(dòng)程序“和”使用AUDIO 設(shè)備驅(qū)動(dòng)程序”

再到“RT-Thread Settings"->"軟件包”->"multimedia packages“勾選 “WavPlayer..." 如下圖

image.png

再到“RT-Thread Settings"->"軟件包”->"miscellaneous packages“  勾選 ”MultiButton:...."

image.png

增加一個(gè)wavplay.c 文件 

/*

 * Copyright (c) 2006-2021, RT-Thread Development Team

 *

 * SPDX-License-Identifier: Apache-2.0

 *

 * Change Logs:

 * Date           Author       Notes

 * 2021-12-08     zsf       the first version

 */

#include


#ifdef BSP_USING_SDIO


#include

#include

#include

#include "drv_gpio.h"

#include "multi_button.h"

// #define DRV_DEBUG

#define DBG_TAG "app.card"

#include



#define BUTTON_PIN_0 rt_pin_get("PF.0")

#define BUTTON_PIN_1 rt_pin_get("PF.1")


static struct button btn_0;

static struct button btn_1;


uint32_t cnt_channels = 1;

uint32_t cnt_volume = 1;


uint32_t cnt_music = 0;


uint32_t  start_flag = 1;

#define NUM_OF_SONGS 2

char *table[NUM_OF_SONGS] =

{

    "/Try.wav",

    "/Bad.wav",

};


static uint8_t button_read_pin_0(void)

{

    return rt_pin_read(BUTTON_PIN_0);

}


static uint8_t button_read_pin_1(void)

{

    return rt_pin_read(BUTTON_PIN_1);

}


static void button_0_callback(void *btn)

{

    uint32_t btn_event_val;


    btn_event_val = get_button_event((struct button *)btn);

    rt_kprintf("button0clik\n");

    switch(btn_event_val)

    {

    case SINGLE_CLICK:

        if (cnt_volume < 11 )

        {

            if(start_flag)

            {

                start_flag = 0;

                cnt_volume = (int)saia_volume_get()/10;

               // pulse_pulse = 9000;

            }

            else

            {

                saia_volume_set(cnt_volume * 10);

                //pulse_pulse = cnt_volume*9000;

            }

        }

        else

        {

            saia_volume_set(10);

            cnt_volume = 1;

            rt_kprintf("The volume has been adjusted to maximum\n");

        }

        cnt_volume ++;

        rt_kprintf("vol=%d\n", saia_volume_get());

        rt_kprintf("button 0 single click\n");

    break;


    case DOUBLE_CLICK:

        if (cnt_channels < 3)

        {

            saia_channels_set(cnt_channels);

        }

        else

        {

            saia_channels_set(cnt_channels);

            cnt_channels = 1;

        }

        cnt_channels++;

        rt_kprintf("button 0 double click\n");

    break;


    case LONG_PRESS_START:

        rt_kprintf("button 0 long press start\n");

    break;


    case LONG_PRESS_HOLD:

        rt_kprintf("button 0 long press hold\n");

    break;

    }

}


static void button_1_callback(void *btn)

{

    uint32_t btn_event_val;


    btn_event_val = get_button_event((struct button *)btn);

    rt_kprintf("button1clik\n");

    switch(btn_event_val)

    {

    case SINGLE_CLICK:

        wavplayer_play(table[(cnt_music++) % NUM_OF_SONGS]);

        rt_kprintf("button 1 single click\n");

    break;


    case DOUBLE_CLICK:

        rt_kprintf("button 1 double click\n");

    break;


    case LONG_PRESS_START:

        rt_kprintf("button 1 long press start\n");

    break;


    case LONG_PRESS_HOLD:

        rt_kprintf("button 1 long press hold\n");

    break;

    }

}


static void btn_thread_entry(void* p)

{

    while(1)

    {

        /* 5ms */

        rt_thread_delay(RT_TICK_PER_SECOND/200);


        button_ticks();

    }

}


static int multi_button_wavplayer(void)

{

    rt_thread_t thread = RT_NULL;


    /* Create background ticks thread */

    thread = rt_thread_create("btn", btn_thread_entry, RT_NULL, 512, 10, 10);

    if(thread == RT_NULL)

    {

        return RT_ERROR;

    }

    rt_thread_startup(thread);


    /* low level drive */

    rt_pin_mode  (BUTTON_PIN_0, PIN_MODE_INPUT_PULLUP);

    button_init  (&btn_0, button_read_pin_0, PIN_LOW);

    button_attach(&btn_0, SINGLE_CLICK,     button_0_callback);

    button_attach(&btn_0, DOUBLE_CLICK,     button_0_callback);

    button_attach(&btn_0, LONG_PRESS_START, button_0_callback);

    button_attach(&btn_0, LONG_PRESS_HOLD,  button_0_callback);

    button_start (&btn_0);


    rt_pin_mode  (BUTTON_PIN_1, PIN_MODE_INPUT_PULLUP);

    button_init  (&btn_1, button_read_pin_1, PIN_LOW);

    button_attach(&btn_1, SINGLE_CLICK,     button_1_callback);

    button_attach(&btn_1, DOUBLE_CLICK,     button_1_callback);

    button_attach(&btn_1, LONG_PRESS_START, button_1_callback);

    button_attach(&btn_1, LONG_PRESS_HOLD,  button_1_callback);

    button_start (&btn_1);


    return RT_EOK;

}

INIT_APP_EXPORT(multi_button_wavplayer);

MSH_CMD_EXPORT(multi_button_wavplayer, button wavplayer)

#endif

這時(shí)項(xiàng)目文件情況如下

image.png

編譯下載,準(zhǔn)備好兩首歌曲WAV模式,改名為Try.wav和Bad.wav,拷貝到SD卡根目錄

上電后,按供電的USB旁邊的鍵可以切換歌曲,相鄰的鍵可以調(diào)節(jié)音量大小!







演示效果

初學(xué)習(xí)覺得RT-Thread Studio 還是比較容易上手,比較友好!

評(píng)論區(qū)(0 )
主站蜘蛛池模板: 性色a | 有码视频在线观看 | 国产福利在线观看一区二区 | 午夜影院7cdy | 一级特色黄色片 | 一级色视频 | 久久影视一区 | 精品视频日本 | 末发育女一区二区三区 | 男女交性永久免费视频播放 | 99久久精品99999久久 | av手机在线播放 | 国产 高清 在线 | www四虎影视| 37pao强力打造免费高速高清 | 9久久精品| 亚州一级毛片在线 | 伊人久久综合成人网小说 | 极品吹潮视频大喷潮tv | 亚洲性一区 | 日日干夜夜欢 | 天天插视频| 中文字幕日韩三级 | 日韩一级在线播放免费观看 | 欧美成人免费夜夜黄啪啪 | 爱爱免费网站 | 美女视频网站免费播放视 | 成人三级影院 | 在线亚洲精品 | 黄视频网站观看 | 一区二区三区四区视频 | 亚洲网站在线观看 | 丁香六月啪啪 | 色婷五月| 欧美潘金莲一级风流片a级 欧美片欧美日韩国产综合片 | 午夜丁香婷婷 | 中文字幕亚洲一区 | 最新eeuss影院第256页 | 欧美午夜精品久久久久久黑人 | 97综合视频 | 国产午夜毛片v一区二区三区 |