在看ST USB库时这种形式的函数写法我始终不能明白是怎么实现的,望那位大神指点以下
1 #define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg)
2 usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);
3 #define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value)
4 USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32);
我的疑惑在于:1中实现的是读出reg地址中的值(这总没有错吧),2中pdev->regs.GREGS->GUSBCFG就已经是GUSBCFG寄存器的地址值了(我是这样理解的),再取地址然后读,那么usbcfg.d32就是GUSBCFG寄存器地址的值而不是寄存器里存放的值了;3中是向reg这个地址写入value,然后4应该是实现向寄存器写入d32功能,感觉pdev->regs.GREGS->GUSBCFG这样就行了,为什么偏偏他又多了个&符号呢,对上面四行程序理解总感觉哪里出了点问题怪不过弯来,还望大神指点一下。
还有就是关于联合体的定义中结构体元素采用 uint32_t toutcal : 3; 这样的定义方式真的没有问题吗,在C语言书里面怎么找不到这种方式的写法。
typedef union _USB_OTG_GUSBCFG_TypeDef
{
uint32_t d32;
struct
{
uint32_t toutcal :
3;
uint32_t Reserved3_5 :
3;
uint32_t physel :
1;
uint32_t Reserved7 :
1;
uint32_t srpcap :
1;
uint32_t hnpcap :
1;
uint32_t usbtrdtim :
4;
uint32_t Reserved14 :
1;
uint32_t phylpwrclksel :
1;
uint32_t Reserved16 :
1;
uint32_t ulpi_fsls :
1;
uint32_t ulpi_auto_res :
1;
uint32_t ulpi_clk_sus_m :
1;
uint32_t ulpi_ext_vbus_drv :
1;
uint32_t ulpi_int_vbus_ind :
1;
uint32_t term_sel_dl_pulse :
1;
uint32_t ulpi_ind_cpl :
1;
uint32_t ulpi_passthrough :
1;
uint32_t ulpi_protect_disable :
1;
uint32_t Reserved26_28 :
3;
uint32_t force_host :
1;
uint32_t force_dev :
1;
uint32_t corrupt_tx :
1;
}
b;
} USB_OTG_GUSBCFG_TypeDef ; |