cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H7~PDM2PCM lib, hard fault occurs.

CFran.1
Associate II
 
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "pdm2pcm.h"
 
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
 
/* USER CODE END Includes */
 
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
 
/* USER CODE END PTD */
 
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
 
#define HSEM_ID_0 (0U) /* HW semaphore 0*/
/* USER CODE END PD */
 
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
 
/* USER CODE END PM */
 
/* Private variables ---------------------------------------------------------*/
 
CRC_HandleTypeDef hcrc;
 
SAI_HandleTypeDef hsai_BlockA1;
 
/* USER CODE BEGIN PV */
 
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SAI1_Init(void);
static void MX_CRC_Init(void);
/* USER CODE BEGIN PFP */
 
/* USER CODE END PFP */
 
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */
 
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
  /* USER CODE BEGIN Boot_Mode_Sequence_0 */
    int32_t timeout; 
  /* USER CODE END Boot_Mode_Sequence_0 */
 
/* USER CODE BEGIN Boot_Mode_Sequence_1 */
  /* Wait until CPU2 boots and enters in stop mode or timeout*/
  timeout = 0xFFFF;
  while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) != RESET) && (timeout-- > 0));
  if ( timeout < 0 )
  {
  Error_Handler();
  }
/* USER CODE END Boot_Mode_Sequence_1 */
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
/* USER CODE BEGIN Boot_Mode_Sequence_2 */
/* When system initialization is finished, Cortex-M7 will release Cortex-M4 by means of
HSEM notification */
/*HW semaphore Clock enable*/
__HAL_RCC_HSEM_CLK_ENABLE();
/*Take HSEM */
HAL_HSEM_FastTake(HSEM_ID_0);
/*Release HSEM in order to notify the CPU2(CM4)*/
HAL_HSEM_Release(HSEM_ID_0,0);
/* wait until CPU2 wakes up from stop mode */
timeout = 0xFFFF;
while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) == RESET) && (timeout-- > 0));
if ( timeout < 0 )
{
Error_Handler();
}
/* USER CODE END Boot_Mode_Sequence_2 */
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SAI1_Init();
  MX_CRC_Init();
  MX_PDM2PCM_Init();
  /* USER CODE BEGIN 2 */
 
  volatile shared_data_t * const shared_data = (shared_data_t *)0x38000000;
  uint32_t pdmData[16];
  int32_t pcmData[16];
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
 
  __HAL_SAI_ENABLE(&hsai_BlockA1);
  while (1)
  {
	 HAL_SAI_Receive(&hsai_BlockA1, pdmData, 2, HAL_SAI_ERROR_TIMEOUT);
	 PDM_Filter(&pdmData[0], &pcmData[0], &PDM1_filter_handler);
	 share_information_write((shared_data_t*)shared_data, pcmData);
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

I am using the STM32CubeIde to initialize it and everything, so all of that is there. I have it set to 1 channel input and output since I am testing only one mic at the moment.

So when I run the code, it get a hard fault when I enter the PDM_Filter function. It gives me a hard fault.

0693W00000ANbSJQA1.png 

I've tried changing the buffers, pcm/pdm arrays size. I also tried changing them to int16_t and uin16_t. I've looked at other examples. The library seems pretty simple to use, but I'm just stuck on what could be wrong. Are there any verified examples?

This discussion is locked. Please start a new topic to ask your question.
1 ACCEPTED SOLUTION

Accepted Solutions
TDK
Guru

Seems like you are overrunning the bounds of an array. 0x20020000 is the end of the DTCM, which is where pdmData/pcmData probably exist. How many samples are you processing in each call.

If you feel a post has answered your question, please click "Accept as Solution".

View solution in original post

3 REPLIES 3
TDK
Guru

Seems like you are overrunning the bounds of an array. 0x20020000 is the end of the DTCM, which is where pdmData/pcmData probably exist. How many samples are you processing in each call.

If you feel a post has answered your question, please click "Accept as Solution".

0693W00000ANbl0QAD.pngIt should only be processing a byte of PDM information and outputting a 16-bit PCM signal at a time, unless I am misreading the application's note.

Wait, when I change the output_samples_number it started working. I thought that number was asking for how many bits you wanted the outputted number. Like a 16-bit PCM value. What exactly is 16 samples? Is it just 16 values of the same PCM number?