STM32'的内容的初始值是什么;在HAL_PCD_MspInit()中执行uu HAL_RCC_USB_CLK_ENABLE()宏时,是否为s USB B表?

STM32'的内容的初始值是什么;在HAL_PCD_MspInit()中执行uu HAL_RCC_USB_CLK_ENABLE()宏时,是否为s USB B表?,stm32,hid,Stm32,Hid,我已经使用STM32CubeMX/IDE为STM32F3发现板生成了一个USB HID项目 USB BTABLE寄存器为零,表示BTABLE位于数据包存储区域的起始位置 (我在程序开始时将整个PMA归零,以避免过时的值。) 就在执行HAL\u RCC\u USB\u CLK\u ENABLE宏(在HAL\u PCD\u MspInit()中的usbd\u conf.c中)之前,BTABLE的值(从索引零开始,在PMA中): 执行该宏后,值为: 宏扩展为: do { \ volatil

我已经使用STM32CubeMX/IDE为STM32F3发现板生成了一个USB HID项目

USB BTABLE寄存器为零,表示BTABLE位于数据包存储区域的起始位置

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

就在执行
HAL\u RCC\u USB\u CLK\u ENABLE
宏(在
HAL\u PCD\u MspInit()
中的
usbd\u conf.c
中)之前,BTABLE的值(从索引零开始,在PMA中):

执行该宏后,值为:

宏扩展为:

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)
设置了pam[12]处的值,但随后会被覆盖:

\uuuuuHAL\uRCC\uUSB\uCLK\uEnable()启用USB块的时钟。在启用之前,所有外围位置都被读取为零。时钟启用之后,实际PMA内容变得可见,无论重置之前写入了什么内容,或者通电后留下了随机垃圾。因此,执行\uuHAL\uRCC\uUSB\uCLK\uEnable()与你的问题无关

我不知道端点3的TX缓冲区地址在哪里被覆盖,但我猜是多维数据集决定在端点上发送数据时设置的。我不熟悉多维数据集,它是否有用于发送USB数据包的API

此外,请仔细检查pma数组的定义是否正确。在F1和F3上,32位位置的每个位置都有一个2字节的值


UPD:对不起,我先看到了这个问题,但你真正的问题是为什么TX addr会被覆盖或设置不正确。

我已经为这个问题制定了解决方案,但我不能确定它的可靠性:PMA是CPU和USB外设之间共享的内存。当你调用u HAL_RCC_USB_CLK_ENABLE(),USB外围设备启用并开始工作。它可以随时向PMA写入数据,即使CPU停止。如果USB中断在初始化时已设置,它也可能会中断您的程序并调用中断处理程序。因此,(1)USB外围设备在初始化时覆盖它,(2)您的便携式维修辅助设备配置不正确,部分便携式维修辅助设备被接收到的数据覆盖,或(3)中断处理程序被调用并修改数据。当USB时钟启用时,哪个代码、哪个函数实际写入了B表值?PMA是16位内存。我的PMA阵列只是为了在调试时查看。我可以使用一个uint16s阵列,每一个uint16s都是0/不可访问的,或者使用一个uin32s阵列,前16位位为0/不可访问。我认为后者在调试器中更容易读取。
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;
    }
  }