打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
GPIO的上拉和下拉输入
刚学习GPIO库文件gpio.c时,void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)这个函数里面有一段代码: 
   if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BRR = (((uint32_t)0x01) << pinpos);
        }
        else
        {
          /* Set the corresponding ODR bit */
          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
          {
            GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
          }
        }
当时一直不理解,网上有人说是为了防止内部上拉或者下拉与N-MOS或者P-MOS形成内部回路造成功耗,这种说法个人认为是错的。通过查阅资料,给出个人解释:
1.输出和输入存在一个方向,在内部会有处理。管脚配制成输入时,输出缓冲器是断开的,也就是说P-MOS和N-MOS已经失去作用了。这里给出ST的图,方便解释:
 
 从图上可以看出,配置为PD/PU/FLOAT时输出缓冲器已经断开。所以,网上解释说防止内部损耗是错误的。
2.为什么配置ODR。因为,上拉或者下拉是ODR决定的。ODRy=1,则为上拉,ODR=0则为下拉。
3.正确使用GPIO时,一般先用void GPIO_DeInit(GPIO_TypeDef* GPIOx)将管脚相关寄存器复位。但是,一般我们连续使用同一个管脚时,为了节省代码空间和时间,提高效率,通常跳过此步骤。直接使用void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)来初始化,这样就存在状态直接切换的问题。具体见4.
4.直接切换管脚状态存在的问题。
     (1)比如,PC7先配置为输出,若直接转换为输入,当执行到上面操作ODR代码时,其实PC7还在输出模式(因为GPIOx->CRL = tmpreg;这句话执行完后才会转换为输入模式),这时会有一段时间(大概几个指令周期吧,没有测量过,但个人感觉不会太长时间)的输出是被直接置为高(上拉PD时)或者低(下拉PW时)。但一般时间较短,也没有多大问题。
    (2)管脚的状态切换也不是立即完成的,会有一段切换时间。切换时间一般里,会存在输出和输入电路共同起作用的时间,这是可能会存在内部的P-MOS、N-MOS和上拉下拉电阻存在回路,这里个人也没有具体分析过。
 
 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
初识stm32的GPIO
GPIO内部结构及工作原理
明解STM32—GPIO理论基础知识篇之寄存器原理
STM32-GPIO模式+寄存器点灯
STM32-GPIO详解
一文看懂GPIO!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服