完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
小弟之前发过一篇“用GPIO接受PDM麦克风输出”的帖,没人回复
个人觉得主要办法是用GPIO模拟SPI接受串行数据。 我的办法如下: (1)用tiM14在PF9输出1 MHz的CLK信号,模拟SPI的SCLK (2)在TIM14的Update中断里,用GPIO PA0读取麦克风输出数据,模拟MISO;通过移位操作在内存里存放串行1-bit数据流 (3)当1-bit数据达到一定量之后,取走数据进行滤波处理 主要代码如下: TIM14中断服务程序: [C] 纯文本查看 复制代码 void externTIM8_TRG_COM_TIM14_IRQHandler(void){int i = 5;PDM_Bits_Buffer = PDM_Bits_Buffer << 1;while (!--i);//等待数据稳定PDM_Bits_Buffer |= GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);PDM_Bits_Count++;if (PDM_Bits_Count == 16)//缓存区满{PDM_16b_Ready = 1;//允许取走数据PDM_Bits_Count = 0;}TIM_ClearITPendingBit(TIM14, TIM_FLAG_Update);} 主函数: [C] 纯文本查看 复制代码 int main(void){// 初始化while(1){if (PDM_16b_Ready)//允许读取数据{PDM_Buffer[PDM_16b_Count++] = HTONS(PDM_Bits_Buffer);// PDM_Buffer 是一个uint16_t数组,每次接收16位的数据;这个Buffer存满后把数据交付滤波器处理if (PDM_16b_Count >= PDM_BUFFER_SIZE)//数据量达到滤波器要求{NVIC_DisableIRQ(TIM8_TRG_COM_TIM14_IRQn);PDM_16b_Count = 0;PDM_Filter_64_LSB((uint8_t *)PDM_Buffer, (uint16_t *)PCM_Buffer, 10, (PDMFilter_InitStruct *)&Filter);//滤波// 串口发送运算结果NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);}PDM_16b_Ready = 0;}}} 这样弄出来的音频噪声很大,求问解决办法!! |
|
相关推荐
14个回答
|
|
为什么不用硬件SPI
|
|
|
|
ST提供的用得好好的软硬件示例为什么不用?
|
|
|
|
因为硬件SPI的数量不够啊,我需要做一个传感器阵列,但STM32F407ZG最多只能挂4个PDM麦克风吧
|
|
|
|
|
|
|
|
如果要SPI的话,F4的USART工作在同步模式时,有CLK输出,也可以当SPI用。
|
|
|
|
|
|
|
|
带硬件PDM接口,把采样的硅咪数据转成PCM,不再需要使用SPI或I2S去模拟,然后使用软件转换成PCM了。
|
|
|
|
|
|
|
|
楼主贴一下TIM14的初始化代码?
|
|
|
|
楼主把工程分享吧。我要学习
|
|
|
|
学习了
|
|
|
|
你好,我现在也在做数字麦这边的事情,碰到了和你类似的问题,请问下你这个问题解决了么,
|
|
|
|
你好 请问你用tim14产生1 M 的时钟是怎么产生的 ,又是怎么配置中断更新的
|
|
|
|
你那1M的时钟用的是PWM方式吗 还是怎么产生的
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 13:06 , Processed in 1.082095 second(s), Total 123, Slave 107 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号