Integration of PDM microphone with thingy53

I want to integrate the PDM microphone with thingy53, I found no particular sample code for it

Would be needing help from scratch

  • I have executed some code till now

    #include <zephyr/zephyr.h>
    #include <stdio.h>
    #include <zephyr/drivers/uart.h>
    #include <string.h>
    // #include <misc/printk.h>
    #include <nrfx_pdm.h>
    #include <hal/nrf_gpio.h>
    #include "nrf5340_application.h"
    // #include <nrf9160.h>
    // #include <nrf53.h>
    #define PDM_BUF_SIZE 3072  //length of buffer in 16 bit words
    int16_t pdm_buf[PDM_BUF_SIZE];
    void bsd_recoverable_error_handler(uint32_t err)
    	printk("bsdlib recoverable error: %u\n", err);
    void nrfx_pdm_event_handler(nrfx_pdm_evt_t const *const p_evt)
    	if (p_evt->buffer_requested) {
                    printk("Entered into 1st if condition \n");
    		nrfx_pdm_buffer_set(pdm_buf, PDM_BUF_SIZE);
    	if (p_evt->buffer_released != 0) {
    		// printk("Out: %4x @ 0x%x\r\n %4x @ 0x%x\r\n",
    		//        (uint16_t)pdm_buf[0], &pdm_buf[0],
    		//        (uint16_t)pdm_buf[1], &pdm_buf[1]);
                    printk("Entered into 2nd if condition \n");
                    for (int i = 0; i < 8; i++) {
                            printk("%4x \n", (uint16_t)pdm_buf[i]);
    static void pdm_init(void)
    	nrfx_pdm_config_t pdm_config = NRFX_PDM_DEFAULT_CONFIG(NULL, NULL);
    	nrfx_pdm_init(&pdm_config, nrfx_pdm_event_handler);
    /*ISR workaround given by Nordic*/
    	ISR_DIRECT_PM(); /* PM done after servicing interrupt for best latency
    	return 1; /* We should check if scheduling decision should be made */
    void main(void)
    	printk("The AT host sample started\n");
    	IRQ_DIRECT_CONNECT(PDM0_IRQn, 0, pdm_isr_handler, 0);  //workaround line 
    	printk("Starting PDM program!\n");
    	printk("PDM Buffer size: %d in 16 bit words\n", PDM_BUF_SIZE);
    	bool enabled = nrfx_pdm_enable_check();
    	printk(enabled ? "true/n" : "false\n");
    	printk("%4x is the starting address\n", &pdm_buf);
    	// printk("%4x is current value at %x\n", pdm_buf[0], &pdm_buf);
    	printk("The PDM will start reading NOW...\n");
          /*  for (int i = 0; i < 500; i++) {
              int k = 5;
              for (volatile int j = 0; j < 50; j++) {
                    k = !k;
    	for (int i = 0; i < 100; i++) {
                    int k = 5;
                    for (volatile int j = 0; j < 100; j++) {
                            k = !k;
            printk("%4x is current value at %x\n", (uint16_t)pdm_buf[0], &pdm_buf);

  • But the output is repeating and I don't think so the microphone is able to identify any sound as the output should have been changing

  • I check the device tree file and in that I noticed that pdm clk and data in pin is not assigned and when I tried to add assignment there was no option for &pdm

  • Hi Rakshita

    Have you tested the DMIC sample in the SDK?

    It is not officially supported on the Thingy53, but it does support the nRF5340DK. If you copy and rename the nrf5340dk_nrf5340_cpuapp.overlay file to thingy53_nrf5340_cpuapp.overlay, and change the pins as necessary, I would expect the example to work on the thingy as well. 

    Not sure what you mean about repeating output? If I understand you correctly the clock output from the nRF53 is fine, but the data from the microphone seems wrong? Would you be able to attach a trace/scope capture? 

    Best regards

  • Actually I checked the clk and data pin on dso but there was no clk
    Also right now I have changed the build configuration to thigny53_nrf5340_cpuapp_ns and by that the clk and data pins got assigned on device tree but I am not able to observe thingy53 on serial terminal