cancel
Showing results for 
Search instead for 
Did you mean: 

STM32G0 Flash Erase and Flash Program not working when FDCAN is enabled.

CJami
Associate III

I am working on the stm32G0B1KBUX, i am using FDCAN on it. FDCAN is working fine and i can tranmsit and receive messages.

The problem arises when i try to erase a page and try to write data in the flash. I have reserved last page for configurations. My application just uses first 20 pages, rest of the pages are unused. I am using page 63 for my configurations. When i try to erase the page it never gets successful, trying to debug the issue it always get timeout because of the FLASH_SR_CFGBSY.

Interesting part is that if i remove the FDCAN initialization from my application everything works fine. I have made a simple project with just FDCAN and flash erase and write application. no CAN message transmission and receiving. it still fails and timeout.

What could be the relation of the FDCAN with flash, i don't get it?

Any help or insight can be very helpful. following is my FDCAN initialization and flash erase program, if i comment fdcanInit(500); everything works fine.

 

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 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 SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  fdcanInit(500);

  FLASH_EraseInitTypeDef eraseInfo = {0};
  	uint32_t PageError = 0;
  	uint32_t byteWrite[2] = {0xFFFFFFFF, 0xFFFFFFFF};
  	eraseInfo.TypeErase = FLASH_TYPEERASE_PAGES;
  	eraseInfo.Banks = FLASH_BANK_1;
  	eraseInfo.NbPages = 1;
  	eraseInfo.Page = (FLASH_PAGE_NB-1);



  	if(HAL_FLASH_Unlock() == HAL_OK)
  	{
  		/* Clear error programming flags */
  		__HAL_FLASH_CLEAR_FLAG(FLASH_SR_ERRORS);
  		if(HAL_FLASHEx_Erase(&eraseInfo, &PageError) == HAL_OK)  // FAILS HERE
  		{
  			if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, VEHICLE_TYPE_ADDRESS_FLASH, *(uint64_t *)byteWrite) == HAL_OK)
  			{
  				HAL_FLASH_Lock();
  			}
  		}
  	}

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

void fdcanInit(uint16_t baudrate)
{
	HAL_FDCAN_DeInit(&hfdcan1);

	hfdcan1.Instance = FDCAN1;
	hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
	hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
	hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
	hfdcan1.Init.AutoRetransmission = ENABLE;
	hfdcan1.Init.TransmitPause = DISABLE;
	hfdcan1.Init.ProtocolException = DISABLE;
	hfdcan1.Init.ExtFiltersNbr = 2;
	hfdcan1.Init.StdFiltersNbr = 2;
	hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;

	if(baudrate == BAUDRATE_250_KBITS)
	{
		hfdcan1.Init.NominalPrescaler = 2;
		hfdcan1.Init.NominalSyncJumpWidth = 12;
		hfdcan1.Init.NominalTimeSeg1 = 51;
		hfdcan1.Init.NominalTimeSeg2 = 12;
		hfdcan1.Init.DataPrescaler = 2;
		hfdcan1.Init.DataSyncJumpWidth = 12;
		hfdcan1.Init.DataTimeSeg1 = 51;
		hfdcan1.Init.DataTimeSeg2 = 12;
	}
	else
	{
	  hfdcan1.Init.NominalPrescaler = 2;
	  hfdcan1.Init.NominalSyncJumpWidth = 9;
	  hfdcan1.Init.NominalTimeSeg1 = 22;
	  hfdcan1.Init.NominalTimeSeg2 = 9;
	  hfdcan1.Init.DataPrescaler = 2;
	  hfdcan1.Init.DataSyncJumpWidth = 9;
	  hfdcan1.Init.DataTimeSeg1 = 22;
	  hfdcan1.Init.DataTimeSeg2 = 9;
	}
	if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
	{
		Error_Handler();
	}

	FDCAN_FilterTypeDef  sFilterConfig;
	sFilterConfig.IdType 				= FDCAN_STANDARD_ID;
	sFilterConfig.FilterIndex 			= 0;
	sFilterConfig.FilterType 			= FDCAN_FILTER_MASK;
	sFilterConfig.FilterID1 			= 0;
	sFilterConfig.FilterID2 			= 0;
	sFilterConfig.FilterConfig 			= FDCAN_FILTER_TO_RXFIFO0;

	if(HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK) {
		/* Filter configuration Error */
		Error_Handler();
	}

	if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK) {
		/* Start Error */
		Error_Handler();
	}
}

 

 

0 REPLIES 0