查看: 2104|回复: 1

[经验分享] 操作NXP芯片引脚,我为什么不用位带?

[复制链接]
  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4692

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10093
    最后登录
    2025-8-8
    发表于 2021-8-18 14:36:38 | 显示全部楼层 |阅读模式
    操作NXP芯片引脚,我为什么不用位带?
        位带是Cortex-M3内核提供的一项基本功能,其目的是为位操作提供另外一种方式。其优点是具有原子性。
    这么好的功能为什么在NXP芯片的操作过程中,我不使用呢?因为NXP提供了FIO操作功能,其要优于位带。
    本文以LPC1768芯片为例。
        LPC1768芯片中,NXP公司的芯片设计人员在GPIO的操作上面加入了Fast General Purpose Parallel I/O特性。
    微信截图_20210818143335.png
        针对我们平时设置高、低电平输出,切换输入输出配置,回读引脚电平等常用操作,NXP芯片的设计人员设计多个相互独立的寄存器来实现或操作上述功能。总体来讲,有如下功能加速操作GPIO
    • GPIO寄存器通过AHB总线访问,加速了寄存器的访问速度
    • 掩码寄存器的设置可以用来屏蔽不被此次操作的引脚对位的bit位
    • 所有的GPIO寄存器均可以以字节、半字节的地址方式访问
    • 支持Cortex-M3内核的bit-banding功能
    • 支持GPDMA控制功能
    • 所有引脚均可以中断触发
        功能显得高大上,在我们应用层面上讲,NXP芯片支持:
    • 单指令置位与清除Port口的bit位
    • 可直接控制指定bit位
    • 所有I/O口在上电后默认为输入模式
        文字码得多,说明可能还不是特别明白,下面我举个例子吧
    1. /**
    2. * @brief        Set an individual GPIO output pin to the high state
    3. * @param        pGPIO        : The base of GPIO peripheral on the chip'
    4. * @param        port        : GPIO Port number where pin is located
    5. * @param        pin                : pin number (0..n) to set high
    6. * @return        None
    7. * @note        Any bit set as a '0' will not have it's state changed. This only
    8. * applies to ports configured as an output.
    9. */
    10. STATIC INLINE void Chip_GPIO_SetPinOutHigh(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
    11. {
    12.      pGPIO[port].SET = (1 << pin);
    13. }

    14. /**
    15. * @brief        Set selected GPIO output pins to the low state
    16. * @param        pGPIO        : The base of GPIO peripheral on the chip
    17. * @param        port        : GPIO Port number where pin is located
    18. * @param        pins        : pins (0..n) to set low
    19. * @return        None
    20. * @note        Any bit set as a '0' will not have it's state changed. This only
    21. * applies to ports configured as an output.
    22. */
    23. STATIC INLINE void Chip_GPIO_SetPortOutLow(LPC_GPIO_T *pGPIO, uint8_t port, uint32_t pins)
    24. {
    25.      pGPIO[port].CLR = pins;
    26. }
    复制代码
       是的!各位网友没有看错,将引脚置位的操作仅需要一个指令。就像注册上面写得那样“寄存器仅会将bit==1的位进行置位or清零操作,而bit==0的位的状态将不受影响。”
        话说,如此简单的操作,又何必去研究bit-banding的操作呢!
    写在最后
        位带操作的其它特性还是非常值得在项目中使用的,比如用来做互斥状态的标识,但在操作GPIO的LED灯输出时,的确是NXP提供了更优解。









    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 20:44
  • 签到天数: 1869 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112697
    最后登录
    2025-8-24
    发表于 2021-8-19 10:21:33 | 显示全部楼层
    本帖最后由 stm1024 于 2021-8-19 10:23 编辑

    同意。可能我用的少, 但是个人感觉位带操作很鸡肋。
    LPC系列的寄存器设计,还是充满了人文关怀的。经常可以看到的是有三个一组的,XXX,XXXSET,XXXCLR,第一个可以像很多其他的寄存器一样,通过逻辑或、与非进行置位和清零,虽然理解起来并不难,但是总感觉太ugly了。然而有了相关的SET和CLR寄存器,我们只需要往其中写1,就可以实现置位和清零,比之前的方式强不少。而且像GPIO等,还有更简单粗暴的NOT寄存器,直接取反也很不错的。 TS1 - 副本 (2).jpg TS1 - 副本 (3).jpg TS1 - 副本 (4).jpg TS1 - 副本 (5).jpg TS1 - 副本 (7).jpg TS1 - 副本 (6).jpg TS1 - 副本 (8).jpg TS1 - 副本 (9).jpg TS1 - 副本 (10).jpg TS1.jpg
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-25 01:04 , Processed in 0.076400 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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