开发板

K210开发板

基于K210开发板麦克风录音机测试_开发板

实验目的

本次测试主要学习 K210 如何打开麦克风录音,保存到 TF 卡中,再从 TF 卡读 取录音的内容,经过扬声器播放出来。

实验元件

麦克风、拨轮开关 keypad、RGB 灯、扬声器、TF 卡槽和 TF 卡

基于K210开发板麦克风录音机测试_数据_02

基于K210开发板麦克风录音机测试_开发板_03

实验原理

  1. 各个元器件的工作原理前面的基础课程已经讲过,现在来说说整个代码的设计思路,录音的过程是先通过 I2S通讯读取麦克风的缓存数据,每次读一部分数据就会直接写入到 TF 卡中,然后保存录音文件。播放录音则是从 TF 读取 wav音频文件,经过解析文件得到数据,再通过 I2S 发送给 DAC 功放电路转化信号并放大,最后扬声器播放声音。
  2. wav格式文件储存原理:wav格式文件是微软公司开发的一种声音文件格式,它符合 RIFF 文件规范,标准格式的 wav 文件与 CD格式一样采用 44.1K 采样率,音质与 CD 相近,所以被广泛应用,wav 文件分为两个部分,第一部分为 wav 头文件,记录 wav 文件的格式和信息等,第二部分是实际储存音频的 PCM(脉冲编码调制)数据。 wav 头文件内容请参考以下表格:

实验过程

  1. List item
static void hardware_init(void)
{
    /* TF卡 */
    //io26--miso--d1
    //io27--clk---sclk
    //io28--mosi--d0
    //io29--cs----cs
    fpioa_set_function(PIN_TF_MISO, FUNC_TF_SPI_MISO);
    fpioa_set_function(PIN_TF_CLK,  FUNC_TF_SPI_CLK);
    fpioa_set_function(PIN_TF_MOSI, FUNC_TF_SPI_MOSI);
    fpioa_set_function(PIN_TF_CS,   FUNC_TF_SPI_CS);

    /* 扬声器 */
    fpioa_set_function(PIN_I2S_WS,  FUNC_I2S2_WS);
    fpioa_set_function(PIN_I2S_DA,  FUNC_I2S2_OUT_D1);
    fpioa_set_function(PIN_I2S_BCK, FUNC_I2S2_SCLK);

    /* 麦克风 */
    fpioa_set_function(PIN_MIC0_WS,   FUNC_I2S0_WS);
    fpioa_set_function(PIN_MIC0_DATA, FUNC_I2S0_IN_D0);
    fpioa_set_function(PIN_MIC0_SCK,  FUNC_I2S0_SCLK);

    /* keypad */
    fpioa_set_function(PIN_KEYPAD_LEFT,   FUNC_KEYPAD_LEFT);
    fpioa_set_function(PIN_KEYPAD_MIDDLE, FUNC_KEYPAD_MIDDLE);
    fpioa_set_function(PIN_KEYPAD_RIGHT,  FUNC_KEYPAD_RIGHT);

    /* RGB灯 */
    fpioa_set_function(PIN_RGB_R, FUNC_RGB_R);
    fpioa_set_function(PIN_RGB_G, FUNC_RGB_G);
    fpioa_set_function(PIN_RGB_B, FUNC_RGB_B);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  1. 设置系统 PLL 时钟。
/* 系统时钟设置 */
    sysctl_pll_set_freq(SYSCTL_PLL0, 320000000UL);
    sysctl_pll_set_freq(SYSCTL_PLL1, 160000000UL);
    sysctl_pll_set_freq(SYSCTL_PLL2, 45158400UL);
  • 1.
  • 2.
  • 3.
  • 4.
  1. 初始化系统中断,使能系统全局中断,初始化 keypad 和 RGB 灯。
hardware_init();      // 硬件引脚初始化
dmac_init();          // dmac初始化
plic_init();          // 中断初始化
sysctl_enable_irq();  // 使能全局中断
keypad_init();        // keypad初始化
rgb_init(EN_RGB_ALL); // LED灯初始化
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. 要使用 TF 卡前必须初始化,并且判断 TF 卡的格式。
if(sdcard_test())
{
    printf("SD card err\r\n");
    return -1;
}
if(fs_test())
{
    printf("FAT32 err\r\n");
    return -1;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  1. 读取 keypad 的状态,如果是中间的键被按下,则开始录音。
case EN_KEY_MIDDLE_DOWN: //录音
	 printf("EN_KEY_MIDDLE_DOWN\r\n");
	  if(g_record_state != 1)
	  {
	      bsp_recorder_start(_T("0:REC.wav"));
	      g_record_state = 1;
	  }
	  
	  break;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  1. keypad 向左拨动保存录音文件。
key_value = key_out_fifo();
        switch(key_value)
        {
            case EN_KEY_LEFT_DOWN: //停止和保存录音
                printf("EN_KEY_LEFT_DOWN\r\n");
                if(g_record_state == 1)
                {
                    bsp_recorder_stopsave("0:REC.wav");
                    g_record_state = 2;
                }
                app_rgb_red_state(LIGHT_OFF); //关闭红灯
                break;

            case EN_KEY_MIDDLE_DOWN: //录音
                printf("EN_KEY_MIDDLE_DOWN\r\n");
                if(g_record_state != 1)
                {
                    bsp_recorder_start(_T("0:REC.wav"));
                    g_record_state = 1;
                }
                
                break;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  1. keypad 向右拨动播放录音。
case EN_KEY_RIGHT_DOWN: //播放录音(仅在非录音状态下有效)
                printf("EN_KEY_RIGHT_DOWN\r\n");
                app_rgb_blue_state(LIGHT_ON);
                if(g_record_state == 2)
                {
                    bsp_play_wav(_T("0:REC.wav"));
                    //g_record_state = 2;
                }
                break;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

8.编译调试,烧录运行进入自己项目 build目录,运行以下命令编译。

cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make
  • 1.
  • 2.

实验现象

烧录完成固件后,系统会弹出一个终端界面,如果没有弹出终端界面的可以打开串口助手显示调试内容。

基于K210开发板麦克风录音机测试_数据_04

如果出现以下图片的情况,请检查是否 TF 卡正确插入卡槽,再把 K210 开发板的电源断开后重新打开即可。

基于K210开发板麦克风录音机测试_开发板_05

当我们按一下 keypad 中间的按键时,RGB 红灯开始闪烁,此时已经开始录音,可以对着麦克风讲话;然后把 keypad 向左拨动一下,红灯熄灭,录音保存;最后把 keypad 向右拨动一下,播放刚刚录音的内容。

实验总结

  • 录音的文件是保存到 TF 卡中的.wav 文件,可以使用读卡器放到电脑上播放。
  • 有时候烧录完程序后,会出现 TF 卡读取失败的问题,重新拨动 K210 开发板的 电源开关,重新上电就可以。