打印

关于USB库中读写寄存器的问题

[复制链接]
275|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
车水马龙|  楼主 | 2018-7-27 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在看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 ;

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

474

主题

476

帖子

0

粉丝