在线时间1080 小时
UID299704
注册时间2011-6-18
NXP金币2022
TA的每日心情 | 开心 2025-8-8 16:43 |
---|
签到天数: 1504 天 连续签到: 1 天 [LV.Master]伴坛终老
版主
  
- 积分
- 10093
- 最后登录
- 2025-8-8
|
操作NXP芯片引脚,我为什么不用位带?
位带是Cortex-M3内核提供的一项基本功能,其目的是为位操作提供另外一种方式。其优点是具有原子性。
这么好的功能为什么在NXP芯片的操作过程中,我不使用呢?因为NXP提供了FIO操作功能,其要优于位带。
本文以LPC1768芯片为例。
LPC1768芯片中,NXP公司的芯片设计人员在GPIO的操作上面加入了Fast General Purpose Parallel I/O特性。
针对我们平时设置高、低电平输出,切换输入输出配置,回读引脚电平等常用操作,NXP芯片的设计人员设计多个相互独立的寄存器来实现或操作上述功能。总体来讲,有如下功能加速操作GPIO
- GPIO寄存器通过AHB总线访问,加速了寄存器的访问速度
- 掩码寄存器的设置可以用来屏蔽不被此次操作的引脚对位的bit位
- 所有的GPIO寄存器均可以以字节、半字节的地址方式访问
- 支持Cortex-M3内核的bit-banding功能
- 支持GPDMA控制功能
- 所有引脚均可以中断触发
功能显得高大上,在我们应用层面上讲,NXP芯片支持:
- 单指令置位与清除Port口的bit位
- 可直接控制指定bit位
- 所有I/O口在上电后默认为输入模式
文字码得多,说明可能还不是特别明白,下面我举个例子吧
- /**
- * @brief Set an individual GPIO output pin to the high state
- * @param pGPIO : The base of GPIO peripheral on the chip'
- * @param port : GPIO Port number where pin is located
- * @param pin : pin number (0..n) to set high
- * @return None
- * @note Any bit set as a '0' will not have it's state changed. This only
- * applies to ports configured as an output.
- */
- STATIC INLINE void Chip_GPIO_SetPinOutHigh(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
- {
- pGPIO[port].SET = (1 << pin);
- }
- /**
- * @brief Set selected GPIO output pins to the low state
- * @param pGPIO : The base of GPIO peripheral on the chip
- * @param port : GPIO Port number where pin is located
- * @param pins : pins (0..n) to set low
- * @return None
- * @note Any bit set as a '0' will not have it's state changed. This only
- * applies to ports configured as an output.
- */
- STATIC INLINE void Chip_GPIO_SetPortOutLow(LPC_GPIO_T *pGPIO, uint8_t port, uint32_t pins)
- {
- pGPIO[port].CLR = pins;
- }
复制代码 是的!各位网友没有看错,将引脚置位的操作仅需要一个指令。就像注册上面写得那样“寄存器仅会将bit==1的位进行置位or清零操作,而bit==0的位的状态将不受影响。”
话说,如此简单的操作,又何必去研究bit-banding的操作呢!
写在最后
位带操作的其它特性还是非常值得在项目中使用的,比如用来做互斥状态的标识,但在操作GPIO的LED灯输出时,的确是NXP提供了更优解。
|
|