임베디드/STM32

DFU 이용할때 추가 해야 하는것

큰꼬꼬 2023. 9. 4. 23:26

DFU를 구현하고자 한다면 앞글과같이 부트로더를 해줘야 하며,

usbd_duf_if.c 파일을 아래와 같이 수정

user code 를 수정해 주면 된다.

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Memory initialization routine.
  * @retval USBD_OK if operation is successful, MAL_FAIL else.
  */
uint16_t MEM_If_Init_FS(void)
{
  /* USER CODE BEGIN 0 */
  HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR);
  return (USBD_OK);
  /* USER CODE END 0 */
}

/**
  * @brief  De-Initializes Memory
  * @retval USBD_OK if operation is successful, MAL_FAIL else
  */
uint16_t MEM_If_DeInit_FS(void)
{
  /* USER CODE BEGIN 1 */
  HAL_FLASH_Lock();
  return (USBD_OK);
  /* USER CODE END 1 */
}

/**
  * @brief  Erase sector.
  * @param  Add: Address of sector to be erased.
  * @retval 0 if operation is successful, MAL_FAIL else.
  */
uint16_t MEM_If_Erase_FS(uint32_t Add)
{
  /* USER CODE BEGIN 2 */
  FLASH_EraseInitTypeDef pEraseInit;
  uint32_t SectorError;
  pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
  pEraseInit.NbPages = 1;
  pEraseInit.PageAddress = Add;
  pEraseInit.Banks = FLASH_BANK_1;
  if(HAL_FLASHEx_Erase(&pEraseInit,&SectorError)!=HAL_OK)
  {
    return (USBD_FAIL);
  }
  return (USBD_OK);
  /* USER CODE END 2 */
}

/**
  * @brief  Memory write routine.
  * @param  src: Pointer to the source buffer. Address to be written to.
  * @param  dest: Pointer to the destination buffer.
  * @param  Len: Number of data to be written (in bytes).
  * @retval USBD_OK if operation is successful, MAL_FAIL else.
  */
uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{
  /* USER CODE BEGIN 3 */
  uint32_t i = 0;
  for(i = 0;i < Len;i += 4)
  {
    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,
       (uint32_t)(dest + i),*(uint32_t *)(src + i)) == HAL_OK)
    {
      if(*(uint32_t *)(src + i) != *(uint32_t *)(dest + i))
          return 2;
    }
    else
      return 1;
  }
  return (USBD_OK);
  /* USER CODE END 3 */
}

/**
  * @brief  Memory read routine.
  * @param  src: Pointer to the source buffer. Address to be written to.
  * @param  dest: Pointer to the destination buffer.
  * @param  Len: Number of data to be read (in bytes).
  * @retval Pointer to the physical address where data should be read.
  */
uint8_t *MEM_If_Read_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{
  /* Return a valid address to avoid HardFault */
  /* USER CODE BEGIN 4 */
  uint32_t i = 0;
  uint8_t *psrc = src;
  for(i = 0;i < Len;i++) dest[i] = *psrc++;
  return dest;
  /* USER CODE END 4 */
}

/**
  * @brief  Get status routine
  * @param  Add: Address to be read from
  * @param  Cmd: Number of data to be read (in bytes)
  * @param  buffer: used for returning the time necessary for a program or an erase operation
  * @retval USBD_OK if operation is successful
  */
uint16_t MEM_If_GetStatus_FS(uint32_t Add, uint8_t Cmd, uint8_t *buffer)
{
  /* USER CODE BEGIN 5 */
  switch (Cmd)
  {
    case DFU_MEDIA_PROGRAM:

    break;

    case DFU_MEDIA_ERASE:
    default:

    break;
  }
  return (USBD_OK);
  /* USER CODE END 5 */
}

'임베디드 > STM32' 카테고리의 다른 글

bootloader 추가..  (0) 2023.09.04
STM32F103RCT6 BOOTLOADER  (0) 2023.09.04