CH32V307 GPIO上下拉电阻

配置端口为带上下拉的输入时,说明书内无如何选择上拉或下拉的说明,
看实例代码由端口输出寄存器OUTDR控制上拉或下拉,理解是是否正确?

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BCR = (((uint32_t)0x01) << pinpos);
        }
        else
        {
          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
          {
            GPIOx->BSHR = (((uint32_t)0x01) << pinpos);
          }
        }


您好,若需要配置为上下拉输入模式时,需要通过GPIO配置寄存器(GPIOx_CFGLR/GPIOx_CFGHR)配置为带有上下拉的输入模式,比如MODEx位配置为00,表示输入模式,CNFx位配置为10,表示带有上下拉模式,具体可见下图配置寄存器说明。关于具体是上拉还是下拉,可通过BCR或者BSHR寄存器决定。若下拉,设置端口复位寄存器(GPIOx_BCR),若上拉,设置端口复位/置位寄存器(GPIOx_BSHR)的0-15对应位置1。

Snipaste_2021-11-15_13-33-12.jpg

if-else语句里的两个寄存器分别为端口复位寄存器(GPIOx_BCR)和端口复位/置位寄存器(GPIOx_BSHR),关于这两个寄存器的具体说明如下图。

1636940918223921.jpg

1636940918186964.jpg



我的问题如何设定IO输入时的上拉与下拉?
看代码码跟置位与复位寄存器有关


您好,GPIO引脚上下拉输入具体配置方式如下图:

Snipaste_2021-11-15_13-43-04.jpg



  if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BCR = (((uint32_t)0x01) << pinpos);
        }
        else
        {
          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
          {
            GPIOx->BSHR = (((uint32_t)0x01) << pinpos);
          }
        }

代码我已经看到,就是实际操作时,也是对OUTDR进行设置?没有专门的管理上拉与下拉的寄存器?
与OUTDR寄存器复用?


您好,GPIO引脚的上下拉输入配置与OUTDR寄存器无关,OUTDR寄存器是一个端口输出寄存器,表示端口输出的数据。关于端口复位/置位寄存器(GPIOx_BSHR)或者端口复位寄存器(GPIOx_BCR)里描述的清除对应的OUTDR位,意思是说:无论是配置为输入或者输出,当你要将这个引脚拉高或者拉低时,都会对OUTDR寄存器写0复位,然后设置引脚拉高拉低。关于上下拉寄存器,当配置为输入时,对BSHR或BCR寄存器进行相应的操作即可设置上下拉。


引脚输入输出切换后,希望输出保持原来的状态,

1、引脚在输出状态,OUTDR寄存器输出有效。

2、引脚 配置为输入上拉,这时,OUTDR会被复位

3、 重新配置为输出,这时我必须重新设置OUTDR的值,因为原始值第二步被复位了


我想请问一下这个OUTDR是不是和mdk里面的ODR是同一样东西呢?还有INDR是不是和IDR是同一样东西呢


您好,OUTDR为端口输出寄存器,INDR为端口输入寄存器,同ODR、IDR功能是一样的,具体介绍可看MCU对应的应用手册介绍,如下图:

image.png


只有登录才能回复,可以选择微信账号登录