STM32/STM8技术论坛
直播中

周炳胤

7年用户 189经验值
私信 关注
[问答]

STM32F407 PDM转PCM调用PDM_Filter_64_LSB函数时进入了HardFault_Handler

rt
我在调试数字麦克风时,接收到的是PDM格式的音频数据,需要转换成PCM。我在调用ST官网上下载的libPDMFilter_Keil.lib库中的PDM_Filter_64_LSB函数时,进入了HardFault_Handler,请问有哪个大神知道是什么原因吗?

回帖(7)

周炳胤

2018-8-24 15:50:17
代码如下:
#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);
        }
    }
}
举报

庞兴玉

2018-8-24 15:56:34
这个。。。着实没有做过。不过可以建议楼主直接问st的技术支持,他们态度还是不错滴
举报

李飞

2018-8-24 16:03:45
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

杨文英

2018-8-24 16:22:18
HardFault 直接判断还是有点困难的,要看 SCB 各寄存器的数据了。我的感觉是数组越界跑飞了。
举报

陈斌

2018-8-24 16:28:17
引用: wang222221 发表于 2018-8-24 20:38
HardFault 直接判断还是有点困难的,要看 SCB 各寄存器的数据了。我的感觉是数组越界跑飞了。

yes!你和我的想法一致.进入hardfault是个不错的结果,如果真实越界了,你可以给个固定数据试一试.
举报

李娟

2018-8-24 16:36:33
本帖最后由 wofei1314 于 2018-3-13 15:21 编辑

我怎么感觉应该是用SCk引脚和MISO引脚,数字麦克风作为输出,单片机作为输入,你的单片机引脚用的是MOSI,是给数字麦克风输入数据.....
第二个问题,在中断里对数据进行转换,这个方法恐怕不好,建议是中断设定标志,中断外进行数据转换~

近期可能我也打算用这个测试,到时候一起研究
举报

李飞

2018-8-24 16:49:14
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分