完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
rt
我在调试数字麦克风时,接收到的是PDM格式的音频数据,需要转换成PCM。我在调用ST官网上下载的libPDMFilter_Keil.lib库中的PDM_Filter_64_LSB函数时,进入了HardFault_Handler,请问有哪个大神知道是什么原因吗? |
|
相关推荐
1 条评论
7个回答
|
|
代码如下:
#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); } } } |
|
|
|
这个。。。着实没有做过。不过可以建议楼主直接问st的技术支持,他们态度还是不错滴
|
|
|
|
|
|
|
|
HardFault 直接判断还是有点困难的,要看 SCB 各寄存器的数据了。我的感觉是数组越界跑飞了。
|
|
|
|
yes!你和我的想法一致.进入hardfault是个不错的结果,如果真实越界了,你可以给个固定数据试一试. |
|
|
|
本帖最后由 wofei1314 于 2018-3-13 15:21 编辑
我怎么感觉应该是用SCk引脚和MISO引脚,数字麦克风作为输出,单片机作为输入,你的单片机引脚用的是MOSI,是给数字麦克风输入数据..... 第二个问题,在中断里对数据进行转换,这个方法恐怕不好,建议是中断设定标志,中断外进行数据转换~ 近期可能我也打算用这个测试,到时候一起研究 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1441 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1373 浏览 3 评论
3018 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1519 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1949 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 01:28 , Processed in 0.658070 second(s), Total 59, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号