OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4109|回复: 0

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

[复制链接]

11

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-11-16
在线时间
24 小时
发表于 2017-1-5 22:22:45 | 显示全部楼层 |阅读模式
在看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 ;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 22:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表