dengdc 发表于 2023-1-15 22:49

Atmega644 GPIO引脚输出高低电平翻转问题

我用Atmel Start自动生成的项目文件,PORTB GPIO输出高低电平翻转的代码如下:
/**
* \brief Toggle output level on pin
*
* Toggle the pin levels on pin
*
* \param pin       The pin number for device
*/
static inline void PORTB_toggle_pin_level(const uint8_t pin)
{
      PINB = 1 << pin;
}

也就是说 第一次调用PORTB_toggle_pin_level(2)
PB2输出高电平
第一次调用PORTB_toggle_pin_level(2)
PB2输出低电平
但是PINB是PortB Input Pins Address, PORTB输入引脚地址
不知道是怎么能够实现翻转的?

dengdc 发表于 2023-1-15 22:51

PINB在数据手册定义:

dengdc 发表于 2023-1-15 22:53


dengdc 发表于 2023-1-15 22:55

数据手册67页:
12.2.2 Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a port.

jiajs 发表于 2023-1-15 22:57

AVR的一个特色

dengdc 发表于 2023-1-15 22:59

ATMEGA32就没有这个功能。

stly 发表于 2023-1-15 23:02

这个估计要看I/O口的内部设计
页: [1]
查看完整版本: Atmega644 GPIO引脚输出高低电平翻转问题