搜索
bottom↓
回复: 4

用STM32cubeMX做USB DFU Bootloader, 在更新时卡在94%不动

[复制链接]

出0入70汤圆

发表于 2019-3-27 19:04:15 | 显示全部楼层 |阅读模式
本帖最后由 SkyGz 于 2019-3-27 20:59 编辑

芯片是 STM32F072C8T6


已解决, 确认是 NbOfPages 的问题,  网上的代码 果然不靠谱
成功实现将 F072的JLINK OB,  弄成 可通过DFU更新固件了...现已升到JLINK_V644C里的..

============================================================================
更新APP用户程序时, 卡在Download Phase 94%处不动了...请问是什么原因, 刚做好时, 第一次能下载成功.....之后再下载就卡着失败了

usbd_dfu_if.c 里的代码, 贴出几处关键部份...............  

大伙看看这是否有错误,  是否NbOfPages值错误了  
NbOfPages = (USBD_DFU_APP_END_ADD - USBD_DFU_APP_DEFAULT_ADD) / FLASH_PAGE_SIZE;
(F800-4800) / 800 =  0x16 也是22个页,   是否应该23页呢?

#define USBD_DFU_APP_END_ADD      0x0800F800        //ADDR_FLASH_PAGE_31, APP 最后一个扇区的首地址
//#define USBD_DFU_APP_DEFAULT_ADD  0x08004800   //APP 程序起始地址 usbd_conf.h
//#define FLASH_PAGE_SIZE           0x800U    //2K 大小/页 stm32f0xx_hal_flash_ex.h
#define FLASH_ERASE_TIME    (uint16_t)50
#define FLASH_PROGRAM_TIME  (uint16_t)50


#define FLASH_DESC_STR      "@Internal Flash   /0x08000000/09*002Ka,23*002Kg"

uint16_t MEM_If_Erase_FS(uint32_t Add)
{
  /* USER CODE BEGIN 2 */
        uint32_t NbOfPages = 0;
        uint32_t PageError = 0;
        /* Variable contains Flash operation status */
        HAL_StatusTypeDef status;
        FLASH_EraseInitTypeDef eraseinitstruct;

        /* Get the number of sector to erase from 1st sector*/
        NbOfPages = (USBD_DFU_APP_END_ADD - USBD_DFU_APP_DEFAULT_ADD) / FLASH_PAGE_SIZE;
        eraseinitstruct.TypeErase = FLASH_TYPEERASE_PAGES;
        eraseinitstruct.PageAddress = USBD_DFU_APP_DEFAULT_ADD;
        eraseinitstruct.NbPages = NbOfPages;
        status = HAL_FLASHEx_Erase(&eraseinitstruct, &PageError);

        if (status != HAL_OK)
        {
                return USBD_FAIL;
        }
        return (USBD_OK);
  /* USER CODE END 2 */
}


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)
        {
                /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
                   be done by byte */
                if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest + i), *(uint32_t *)(src + i))
                        == HAL_OK)
                {
                        /* Check the written value */
                        if(*(uint32_t *)(src + i) != *(uint32_t *)(dest + i))
                        {
                                /* Flash content doesn't match SRAM content */
                                return 2;
                        }
                }
                else
                {
                        /* Error occurred while writing data in Flash memory */
                        return 1;
                }
        }
        return (USBD_OK);
  /* USER CODE END 3 */
}

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 = *psrc++;
        }
        return (uint8_t *)(dest);
  /* USER CODE END 4 */
}


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:
                buffer[1] = (uint8_t)FLASH_PROGRAM_TIME;
                buffer[2] = (uint8_t)(FLASH_PROGRAM_TIME << 8);
                buffer[3] = 0;
                break;

        case DFU_MEDIA_ERASE:
        default:
                buffer[1] = (uint8_t)FLASH_ERASE_TIME;
                buffer[2] = (uint8_t)(FLASH_ERASE_TIME << 8);
                buffer[3] = 0;
                break;
        }
        return  (USBD_OK);
  /* USER CODE END 5 */
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入70汤圆

 楼主| 发表于 2019-3-27 20:51:33 | 显示全部楼层
本帖最后由 SkyGz 于 2019-3-27 20:59 编辑

已解决, 确认是 NbOfPages 的问题,  网上的代码 果然不靠谱
成功实现将 F072的JLINK OB,  弄成 可通过DFU更新固件了...现已升到JLINK_V644C里的..

出0入0汤圆

发表于 2019-3-28 07:13:19 | 显示全部楼层
昨天想跟你说这个问题的,新人 限制发言了,

STM32的乞丐版SWD脱机下载器开源,含下载软件
www.amobbs.com/thread-5709230-1-1.html
(出处: amoBBS 阿莫电子论坛)

这个带dfu的

出0入0汤圆

发表于 2019-3-28 09:53:56 | 显示全部楼层
SkyGz 发表于 2019-3-27 20:51
已解决, 确认是 NbOfPages 的问题,  网上的代码 果然不靠谱
成功实现将 F072的JLINK OB,  弄成 可通过DFU更 ...

DFU如何判断何时运行app,何时运行DFU的?

出0入70汤圆

 楼主| 发表于 2019-3-28 10:04:31 | 显示全部楼层
bigk2000 发表于 2019-3-28 09:53
DFU如何判断何时运行app,何时运行DFU的?

指定一个 引脚,  可 短接为 高电平 或低电平(程序上设定),   上电, 即进入DFU模式
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 16:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表