硬汉嵌入式论坛

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

[有问必答] 请教如何关闭STM32F4的USB外设

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2021-10-30 15:48:21 | 显示全部楼层 |阅读模式
在弄一个USB读取U盘升级程序的IAP和APP,但是发现在跳转到APP后,重新打开USB的时候,USB工作异常(其他功能均正常)。
通过在IAP程序中关闭USB外设,跳转至APP,USB外设能正常工作。
想请教大家,有什么办法可以复位USB外设。或者有啥办法可以避免跳转到APP后重新打开USB时USB外设工作异常。

解决了,安富莱的硬汉提醒了下,从时钟入手,整个脑回路都在USB库里面弄,没跳出来
通过时钟来操作是可行的。但是有点需要注意是需要再复位过程中关闭时钟。
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_OTG_HS, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, DISABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS_ULPI, DISABLE);
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_OTG_HS, DISABLE);




硬汉哥,这位兄台的具体操作没看懂。能麻烦花几分钟指点一下么?






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2021-10-30 17:10:48 | 显示全部楼层
通过下面这两个可以复位外设。
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_OTG_HS, ENABLE);
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_OTG_HS, DISABLE);

然后下面是关闭外设时钟。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, DISABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS_ULPI, DISABLE);

回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-10-31 13:24:58 | 显示全部楼层
eric2013 发表于 2021-10-30 17:10
通过下面这两个可以复位外设。
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_OTG_HS, ENABLE);
RCC_AHB1Periph ...

谢谢硬汉哥,我去试试看。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-10-31 16:38:19 | 显示全部楼层
非常难 为情,硬汉哥,没成功。再次麻烦硬汉哥指正。
我的IAP跳转程序是这样的 :
  typedef void (*_func)(void);
    __disable_irq();
   
    /* MCU peripherals re-initial. */
    {
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStruct.GPIO_Pin &= ~(GPIO_Pin_13 | GPIO_Pin_14); /* SWDIO/SWCLK */
        GPIO_Init(GPIOA, &GPIO_InitStruct);

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_Init(GPIOC, &GPIO_InitStruct);
        GPIO_Init(GPIOD, &GPIO_InitStruct);
        GPIO_Init(GPIOE, &GPIO_InitStruct);
        GPIO_Init(GPIOF, &GPIO_InitStruct);
        GPIO_Init(GPIOG, &GPIO_InitStruct);
        GPIO_Init(GPIOH, &GPIO_InitStruct);
        GPIO_Init(GPIOI, &GPIO_InitStruct);

        /* reset systick */
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

        /* disable all peripherals clock. */
        RCC->AHB1ENR = (1<<20); /* 20: F4 CCMDAT ARAMEN. */
        RCC->AHB2ENR = 0;
        RCC->AHB3ENR = 0;
        RCC->APB1ENR = 0;
        RCC->APB2ENR = 0;

        /* Switch to default cpu clock. */
        RCC->CFGR = 0;
    } /* MCU peripherals re-initial. */

    /* Disable MPU */
    MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;

    /* disable and clean up all interrupts. */
    {
        int i;

        for(i = 0; i < 8; i++)
        {
            /* disable interrupts. */
            NVIC->ICER[i] = 0xFFFFFFFF;

            /* clean up interrupts flags. */
            NVIC->ICPR[i] = 0xFFFFFFFF;
        }
    }

//    /* Set new vector table pointer */
    SCB->VTOR = FLASH_APP1_ADDR;

//    /* reset register values */
    __set_BASEPRI(0);
    __set_FAULTMASK(0);

//    /* set up MSP and switch to it */
    __set_MSP(*(uint32_t*)FLASH_APP1_ADDR);
    __set_PSP(*(uint32_t*)FLASH_APP1_ADDR);
    __set_CONTROL(0);

//    /* ensure what we have done could take effect */
    __ISB();

    __disable_irq();
//               
//       
   RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_OTG_FS, ENABLE);
        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, DISABLE);
//RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS_ULPI, DISABLE);
RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_OTG_FS, DISABLE);       
//    /* never return */
    ((_func)(*(uint32_t*)(FLASH_APP1_ADDR + 4)))();

APP 程序是跳转正常,就是无法检测到U盘插入。
这个写法对么?
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-10-31 21:57:24 | 显示全部楼层
硬汉哥,问题解决了。我要在APP程序中,把总中断开启。就好了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2021-11-1 00:38:04 | 显示全部楼层
6789364 发表于 2021-10-31 21:57
硬汉哥,问题解决了。我要在APP程序中,把总中断开启。就好了。

好的,还有什么问题再交流。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-11-1 08:39:04 | 显示全部楼层
eric2013 发表于 2021-11-1 00:38
好的,还有什么问题再交流。

好的,谢谢硬汉哥
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 16:17 , Processed in 0.043005 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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