思澈科技软件开发工具包  2.20
PDM

PDM (Pulse Density Modulation)模块是用于将外部pdm麦克风输出的pdm信号进行滤波转化为PCM信号并提供给CPU进行后续的处理.

支持的配置

  • 单声道(左/右), 立体声
  • 采样率 8/12/16//24/32/48KHz
  • 24bit 采样深度
  • 左右声道 增益调节
  • 循环buffer/ 单次buffer

输出数据格式

  • 8bit + 单声道
  • 16bit + 单声道
  • 32bit + 单声道 : 高8位为0, 实际有效数据为低24bit
  • 16bit + 双声道 : 左右声道各占16bit组成一个32bit数据(支持左右声道对换)
  • 32bit + 双声道 : 仅支持左右声道分开2个buffer存储

示例

PDM1单声道16KHz , 16bit位深,用DMA读取1024字节数据

static PDM_HandleTypeDef PDM_Handle = {0};
static DMA_HandleTypeDef DMA_Handle = {0};
static uint32_t DMA_cplt_flag = 0;
void DMAC1_CH3_IRQHandler(void)
{
}
{
if(hpdm == &PDM_Handle)
DMA_cplt_flag = 1;
}
void pdm_recieve(void)
{
DMA_Handle.Instance = DMA1_Channel3;
DMA_Handle.Init.Request = DMA_REQUEST_18;
PDM_Handle.hdmarx = &DMA_Handle;
PDM_Handle.Instance = hwp_pdm1;
PDM_Handle.Init.Mode = PDM_MODE_LOOP; //Ring buffer mode
PDM_Handle.RxXferSize = 1024;
PDM_Handle.pRxBuffPtr = (uint8_t *) 0x2000c000;
HAL_PDM_Init(&PDM_Handle);
HAL_NVIC_EnableIRQ(DMAC1_CH3_IRQn);
HAL_PDM_Receive_DMA(&PDM_Handle, PDM_Handle.pRxBuffPtr, PDM_Handle.RxXferSize);
while(DMA_cplt_flag == 0);
HAL_NVIC_DisableIRQ(DMAC1_CH3_IRQn);
HAL_PDM_DMAStop(&PDM_Handle);
HAL_PDM_DeInit(&PDM_Handle);
}
...
PDM_InitTypeDef::ChannelDepth
uint32_t ChannelDepth
Definition: bf0_hal_pdm.h:161
HAL_PDM_DMAStop
HAL_StatusTypeDef HAL_PDM_DMAStop(PDM_HandleTypeDef *hpdm)
Stop the DMA Transfer.
PDM_HandleTypeDef::RxXferSize
uint16_t RxXferSize
Definition: bf0_hal_pdm.h:179
DMA_InitTypeDef::Request
uint32_t Request
Definition: bf0_hal_dma.h:85
PDM_HandleTypeDef
Definition: bf0_hal_pdm.h:172
PDM_HandleTypeDef::hdmarx
DMA_HandleTypeDef * hdmarx
Definition: bf0_hal_pdm.h:181
PDM_HandleTypeDef::pRxBuffPtr
uint8_t * pRxBuffPtr
Definition: bf0_hal_pdm.h:177
PDM_CHANNEL_DEPTH_16BIT
@ PDM_CHANNEL_DEPTH_16BIT
Definition: bf0_hal_pdm.h:136
__DMA_HandleTypeDef::Init
DMA_InitTypeDef Init
Definition: bf0_hal_dma.h:159
HAL_PDM_Init
HAL_StatusTypeDef HAL_PDM_Init(PDM_HandleTypeDef *hpdm)
Initialize the PDM according to the specified parameters in the PDM_InitTypeDef and initialize the as...
PDM_HandleTypeDef::Init
PDM_InitTypeDef Init
Definition: bf0_hal_pdm.h:175
PDM_CHANNEL_LEFT_ONLY
@ PDM_CHANNEL_LEFT_ONLY
Definition: bf0_hal_pdm.h:115
HAL_PDM_RxCpltCallback
void HAL_PDM_RxCpltCallback(PDM_HandleTypeDef *hpdm)
Rx Transfer completed callback.
HAL_PDM_Receive_DMA
HAL_StatusTypeDef HAL_PDM_Receive_DMA(PDM_HandleTypeDef *hpdm, uint8_t *pData, uint32_t Size)
Read PCM data from PDM module by DMA.
__DMA_HandleTypeDef
DMA handle Structure definition.
Definition: bf0_hal_dma.h:156
PDM_SAMPLE_16KHZ
@ PDM_SAMPLE_16KHZ
Definition: bf0_hal_pdm.h:126
__DMA_HandleTypeDef::Instance
DMA_Channel_TypeDef * Instance
Definition: bf0_hal_dma.h:157
PDM_InitTypeDef::Channels
uint32_t Channels
Definition: bf0_hal_pdm.h:155
HAL_DMA_IRQHandler
void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
Handle DMA interrupt request.
PDM_MODE_LOOP
@ PDM_MODE_LOOP
Definition: bf0_hal_pdm.h:109
HAL_NVIC_EnableIRQ
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
Enable a device specific interrupt in the NVIC interrupt controller.
PDM_InitTypeDef::SampleRate
uint32_t SampleRate
Definition: bf0_hal_pdm.h:158
HAL_NVIC_DisableIRQ
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
Disable a device specific interrupt in the NVIC interrupt controller.
PDM_InitTypeDef::Mode
uint32_t Mode
Definition: bf0_hal_pdm.h:152
HAL_PDM_DeInit
HAL_StatusTypeDef HAL_PDM_DeInit(PDM_HandleTypeDef *hpdm)
DeInitialize the PDM peripheral.