硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3405|回复: 5
收起左侧

[USB] stm32H743iit6 DFU模式USB无法识别

[复制链接]

10

主题

17

回帖

47

积分

新手上路

积分
47
发表于 2021-2-5 14:03:31 | 显示全部楼层 |阅读模式
大家有没遇到过这样的问题,同样一台电脑,同样一块板,stm32h743的芯片,USB虚拟串口是能正常工作的,证明USB硬件是没有问题的,但DFU模式就无法识别,电脑的驱动是没问题的,另一块同样的板的DFU是能识别和正常更新的。目前测试了6块板,有2块是这样的情况,6块USB 虚拟串口都可以使用,2块DFU无法识别,不知哪里出了问题

进入DFU的代码是下面的
/*
*********************************************************************************************************
*        函 数 名: JumpToBootloader
*        功能说明: 跳转到系统BootLoader
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void JumpToBootloader(void)
{
        uint32_t i=0;
        void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
        __IO uint32_t BootAddr = 0x1FF09800; /* STM32H7的系统BootLoader地址 */

        /* 关闭全局中断 */
        DISABLE_INT();

        /* 关闭滴答定时器,复位到默认值 */
        SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

        /* 设置所有时钟到默认状态,使用HSI时钟 */
        HAL_RCC_DeInit();

        /* 关闭所有中断,清除所有中断挂起标志 */
        for (i = 0; i < 8; i++)
        {
                NVIC->ICER[i]=0xFFFFFFFF;
                NVIC->ICPR[i]=0xFFFFFFFF;
        }       

        /* 使能全局中断 */
        ENABLE_INT();

        /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
        SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

        /* 设置主堆栈指针 */
        __set_MSP(*(uint32_t *)BootAddr);
       
        /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
        __set_CONTROL(0);

        /* 跳转到系统BootLoader */
        SysMemBootJump();

        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
        while (1)
        {

        }
}


回复

使用道具 举报

10

主题

17

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2021-2-5 17:17:53 | 显示全部楼层
测试了一下,把BOOT0接VCC,板子是可以进入DFU模式并且可以更新的,难道上面跳转的代码有问题吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-2-6 07:47:49 | 显示全部楼层
ndthome 发表于 2021-2-5 17:17
测试了一下,把BOOT0接VCC,板子是可以进入DFU模式并且可以更新的,难道上面跳转的代码有问题吗

上面的不是我写的代码么,在我们V7板子上面全部通过了。。
回复

使用道具 举报

10

主题

17

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2021-2-6 08:46:39 | 显示全部楼层
eric2013 发表于 2021-2-6 07:47
上面的不是我写的代码么,在我们V7板子上面全部通过了。。

是你的代码,现在我在自己画的板子有问题,所以想请教有可能哪个地方有问题呢
回复

使用道具 举报

10

主题

17

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2021-2-6 10:42:30 | 显示全部楼层
        if(firm_temp1 == 123 && firm_temp2 == 123 ) //确认是更新固件标志,则跳入bootloader
        {
                        SDRAM_Init();                                                 //初始化SDRAM
                        LCD_Init();                                                         //初始化LCD
                  Init_firmware_flag();//清除固件更新标志
                  Dis_firmware();//显示提示固件更新内容
//                  delay_ms2(40000);
//                  delay_ms2(40000);
//                  delay_ms2(40000);
//                  delay_ms2(40000);       
//                        delay_ms2(40000);
//                  delay_ms2(40000);
//                  delay_ms2(40000);
//                  delay_ms2(40000);       
//                  delay_ms2(40000);
                       
            JumpToBootloader();
       
        }

//延时函数
void delay_us2(u16 j)
{
        u16 i = 0;
        for (i = 0; i < j; i++)
        {
                ;
                ;
                ;
                ;
        }
}
void delay_ms2(u16 j)
{
        u16 i = 0;
        for (i = 0; i < j; i++)
        {
                delay_us2(2000);
        }
}

把上面的延时函数屏蔽就可以了,本来延时是为了显示完提示信息后,再进入bootload的,但想不明白为什么就这几个延时导致进入DFU失败,提示USB无法识别
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-2-7 07:58:42 | 显示全部楼层
ndthome 发表于 2021-2-6 10:42
if(firm_temp1 == 123 && firm_temp2 == 123 ) //确认是更新固件标志,则跳入bootloader
        {
                        SDRAM_In ...

那不一定是延迟的问题了,有可能是其它问题导致的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 04:32 , Processed in 0.189476 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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