当在HAL_PCD_MspInit()中执行__HAL_RCC_USB_CLK_ENABLE()宏时,初始化STM32 USB BTABLE内容的内容是什么?

问题描述 投票:0回答:1

我已经使用STM32CubeMX / IDE为STM32F3DISCOVERY板生成USB HID项目。

USB BTABLE寄存器为零,表明BTABLE在分组存储区的开始。

(我在程序启动时将整个PMA归零,以避免过时的值。)

仅在执行__HAL_RCC_USB_CLK_ENABLE宏之前(在HAL_PCD_MspInit()中的usbd_conf.c中),BTABLE的值(在PMA中从零开始,为:]]

BTABLE before

执行该宏后,值是:

BTABLE after

宏扩展为:

do { \
    volatile uint32_t tmpreg; \
    ((((RCC_TypeDef *) ((0x40000000UL + 0x00020000UL) + 0x00001000UL))->APB1ENR) |= ((0x1UL << (23U))));\
    /* Delay after an RCC peripheral clock enabling */ \
    tmpreg = ((((RCC_TypeDef *) ((0x40000000UL + 0x00020000UL) + 0x00001000UL))->APB1ENR) & ((0x1UL << (23U))));\
    (void)tmpreg; \
} while(0U)

此宏如何使BTABLE初始化?

(我想将pma[12]设为0x100,而不是0x0,因为我想将端点3用于复合设备中的HID接口。我正在使用此简单的HID设备来测试不同端点的使用。将0x810x83中的USBD_LL_Init()更改为#define HID_EPIN_ADDR不足以更改pma[12]的值。pma[12]处使用了不正确的TX指针,并且在Wireshark中观察到损坏的数据。]


更新:

如果添加代码以手动将pma[12]设置为0x100

HAL_StatusTypeDef  HAL_PCDEx_PMAConfig(PCD_HandleTypeDef *hpcd,
                                       uint16_t ep_addr,
                                       uint16_t ep_kind,
                                       uint32_t pmaadress)
  ...
  /* Here we check if the endpoint is single or double Buffer*/
  if (ep_kind == PCD_SNG_BUF)
  {
    /* Single Buffer */
    ep->doublebuffer = 0U;
    /* Configure the PMA */
    ep->pmaadress = (uint16_t)pmaadress;

    // correct PMA BTABLE
    uint32_t *btable = (uint32_t *) USB_PMAADDR; // Test this.
    if (ep->is_in) {
        btable[ep->num * 4] = pmaadress;
    }
  }

pam[12]的值确实被设置,但后来被覆盖:

BTABLE updated

我已经使用STM32CubeMX / IDE为STM32F3DISCOVERY板生成USB HID项目。 USB BTABLE寄存器为零,表明BTABLE在数据包存储区的开始。 (我...

stm32 hid btable hal-rcc-usb-clk-enable packet-memory-area
1个回答
0
投票

__ HAL_RCC_USB_CLK_ENABLE()启用USB模块的时钟。在启用之前,所有外围设备位置均读取为零。启用时钟后,寄存器将初始化为其复位值,但PMA存储器未初始化,从而留下随机垃圾。

© www.soinside.com 2019 - 2024. All rights reserved.