你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407 PDM转PCM问题

[复制链接]
bill刘 提问时间:2017-11-22 17:10 /
rt
我在调试数字麦克风时,接收到的是PDM格式的音频数据,需要转换成PCM。我在调用ST官网上下载的libPDMFilter_Keil.lib库中的PDM_Filter_64_LSB函数时,进入了HardFault_Handler,请问有哪个大神知道是什么原因吗?
收藏 1 评论8 发布时间:2017-11-22 17:10

举报

8个回答
bill刘 回答时间:2017-11-22 17:14:37
代码如下:
#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-3-13 09:14:13
这个。。。着实没有做过。不过可以建议楼主直接问st的技术支持,他们态度还是不错滴
feixiang20 回答时间:2018-3-13 09:20:16
确实,需要询问官方专业指导。如果是因为数组越界 或者堆栈溢出,程序指针指飞。在中断HardFault_Handler中的while()处打上断点,让程序执行到此处停止,看看可否检查。据说,函数内部变量占用空间较大时,定义为全局变量或者静态变量,减少堆栈的占用。多使用指针解决数据的复制,同时减少内存的占用。

点评

很难理解啊  发表于 2018-3-13 13:23
maxtch 回答时间:2018-3-13 14:10:28
HardFault 直接判断还是有点困难的,要看 SCB 各寄存器的数据了。我的感觉是数组越界跑飞了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

butterflyspring 回答时间:2018-3-13 14:40:48
maxtch 发表于 2018-3-13 14:10
HardFault 直接判断还是有点困难的,要看 SCB 各寄存器的数据了。我的感觉是数组越界跑飞了。 ...

yes!你和我的想法一致.进入hardfault是个不错的结果,如果真实越界了,你可以给个固定数据试一试.
wofei1314 回答时间:2018-3-13 15:19:28
本帖最后由 wofei1314 于 2018-3-13 15:21 编辑

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

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

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

feixiang20 回答时间:2018-3-13 21:38:19
本帖最后由 feixiang20 于 2018-3-13 21:39 编辑

看来我想多了
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版