打印
[STM32]

STM32F407 PDM转PCM问题

[复制链接]
2998|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
情乐涵|  楼主 | 2017-11-22 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
rt
我在调试数字麦克风时,接收到的是PDM格式的音频数据,需要转换成PCM。我在调用ST官网上下载的libPDMFilter_Keil.lib库中的PDM_Filter_64_LSB函数时,进入了HardFault_Handler,请问有哪个大神知道是什么原因吗?
代码如下:
#include "sph0644.h"
#include "pdm_filter.h"

#define INTERNEL_BUFF_SIZE      64
#define PCM_OUT_SIZE            16

PDMFilter_InitStruct Filter;

u16 PDM_Output_Buffer[PCM_OUT_SIZE];
u16 *pAudioRecBuf;
u16 InternalBuffer[INTERNEL_BUFF_SIZE];
u16 InternalBufferSize = 0;

static void Sph0644_Config(void)
{   
    GPIO_InitTypeDef  GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_AHB1PeriphClockCmd(SPI_SCK_GPIO_CLK|SPI_MOSI_GPIO_CLK, ENABLE);//ʹÄÜÍâÉèGPIOB,GPIOCʱÖÓ

    GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍì
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
    GPIO_Init(SPI_SCK_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯

    GPIO_InitStructure.GPIO_Pin =SPI_MOSI_PIN;
    GPIO_Init(SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);//³õʼ»¯

    GPIO_PinAFConfig(SPI_SCK_GPIO_PORT,SPI_SCK_SOURCE,SPI_SCK_AF);        //PB13,AF5  I2S_SCLK
    GPIO_PinAFConfig(SPI_MOSI_GPIO_PORT,SPI_MOSI_SOURCE,SPI_MOSI_AF);        //PC3 ,AF5  I2S_DACDATA

    I2S2_Init(I2S_Standard_LSB,I2S_Mode_MasterRx,I2S_CPOL_High,I2S_DataFormat_16b);
    I2S2_SampleRate_Set(32000);   //ÉèÖòÉÑùÂÊ

    // Configure the SPI interrupt priority
    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
}

void Sph0644_Init(void)
{
    //Enable CRC module/*
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);

    //ÅäÖÃI2S2£¬CLKƵÂÊ1024MHz
        Sph0644_Config();

    //16KHz,ÔÚ´Ë֮ǰ£¬±ØÐ뿪ÆôCRCʱÖÓ£¬·ñÔò½øÈëËÀÑ­»·
        Filter.LP_HZ = 8000;
        Filter.HP_HZ = 10;
        Filter.Fs = 16000;
        Filter.Out_MicChannels = 1;
        Filter.In_MicChannels = 1;

        PDM_Filter_Init(&Filter);
}

void Sph0644_Start(void)
{
    pAudioRecBuf = PDM_Output_Buffer;
    I2S_Cmd(SPI2,ENABLE);
}

void Sph0644_Stop(void)
{
    I2S_Cmd(SPI2,DISABLE);
}

void SPI2_IRQHandler(void)
{
    u16 app;
    u16 volume;
   
    if(SPI_GetITStatus(SPI2,SPI_I2S_IT_RXNE) == SET)
    {
        app = SPI_I2S_ReceiveData(SPI2);
        InternalBuffer[InternalBufferSize++] = HTONS(app);
        
        if(InternalBufferSize >= INTERNEL_BUFF_SIZE)
        {
            InternalBufferSize = 0;
            volume = 50;
            
            PDM_Filter_64_LSB((u8*)InternalBuffer,pAudioRecBuf,volume,&Filter);
        }
    }
}

相关帖子

沙发
ningling_21| | 2017-11-22 17:54 | 只看该作者
是不是内存溢出

使用特权

评论回复
板凳
情乐涵|  楼主 | 2017-11-27 11:10 | 只看该作者
已经找到原因了,是其他地方占用内存比较多,调用库的时候导致内存溢出。

使用特权

评论回复
地板
HugeD| | 2021-3-23 17:35 | 只看该作者
你好,看到您有处理过PDM转PCM数据,你那还有这个代码备份吗?能分享一下经验不,我现在使用的st的mems数字麦克风,得到了PDM数据,但是转换成PCM计算声压级dBs数据,出来老是80左右的分贝值,而环境实际只有40-50左右的分贝大小。

使用特权

评论回复
评论
HugeD 2021-3-23 17:36 回复TA
我的邮箱:dengfei_cq@163.com 谢谢 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

2

粉丝