初级会员
- 积分
- 55
- 金钱
- 55
- 注册时间
- 2015-11-2
- 在线时间
- 17 小时
|
1金钱
小弟之前发过一篇“用GPIO接受PDM麦克风输出”的帖,没人回复
个人觉得主要办法是用GPIO模拟SPI接受串行数据。
我的办法如下:
(1)用TIM14在PF9输出1 MHz的CLK信号,模拟SPI的SCLK
(2)在TIM14的Update中断里,用GPIO PA0读取麦克风输出数据,模拟MISO;通过移位操作在内存里存放串行1-bit数据流
(3)当1-bit数据达到一定量之后,取走数据进行滤波处理
主要代码如下:
TIM14中断服务程序:
[mw_shl_code=c,true]void extern
TIM8_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);
}[/mw_shl_code]
主函数:
[mw_shl_code=c,true]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;
}
}
}[/mw_shl_code]
这样弄出来的音频噪声很大,求问解决办法!!
|
|