我已经使用STM32CubeMX / IDE为STM32F3DISCOVERY板生成USB HID项目。
USB BTABLE寄存器为零,表明BTABLE在分组存储区的开始。
(我在程序启动时将整个PMA归零,以避免过时的值。)
仅在执行__HAL_RCC_USB_CLK_ENABLE
宏之前(在HAL_PCD_MspInit()
中的usbd_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)
此宏如何使BTABLE初始化?
(我想将pma[12]
设为0x100
,而不是0x0
,因为我想将端点3用于复合设备中的HID接口。我正在使用此简单的HID设备来测试不同端点的使用。将0x81
和0x83
中的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]
的值确实被设置,但后来被覆盖:
我已经使用STM32CubeMX / IDE为STM32F3DISCOVERY板生成USB HID项目。 USB BTABLE寄存器为零,表明BTABLE在数据包存储区的开始。 (我...
__ HAL_RCC_USB_CLK_ENABLE()启用USB模块的时钟。在启用之前,所有外围设备位置均读取为零。启用时钟后,寄存器将初始化为其复位值,但PMA存储器未初始化,从而留下随机垃圾。