自学第三节

时间:2025-03-07 08:02:16

文章目录

    • 一、小要点
      • 输出模式(推挽输出模式)下,低电平点亮小灯。
      • 2.
      • 3.在STM32微控制器中,单个GPIO端口的物理引脚在同一时间不能既作为输入又作为输出。

一、小要点

输出模式(推挽输出模式)下,低电平点亮小灯。

2.

GPIO_InitTypeDef GPIO_InitStructure;  //用自带的通用输出口结构体,实例化了一个结构体变量

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

这段代码是基于STM32系列MCU的GPIO初始化过程,用于初始化GPIOA端口的Pin1和Pin2为推挽输出模式,并设置最大工作速率为50MHz。逐句解释如下:

(1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 这行代码的作用是使能GPIOA端口的时钟。RCC是Reset and Clock Control(复位与时钟控制)的缩写,该函数激活了GPIOA所在的APB2外设总线时钟,使得GPIOA可以正常工作。
(2)GPIO_InitTypeDef GPIO_InitStructure; 定义一个GPIO_InitTypeDef类型的结构体变量GPIO_InitStructure。这是一个STM32库中预定义的结构体类型,用于存储GPIO端口的初始化参数。
(3)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 设置GPIO_InitStructure结构体中的GPIO_Mode成员变量为GPIO_Mode_Out_PP,这意味着将要初始化的GPIO引脚将配置为推挽输出模式。
(4)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; 设置GPIO_InitStructure结构体中的GPIO_Pin成员变量,这里使用按位或操作符(|)组合GPIO_Pin_1和GPIO_Pin_2,表示同时初始化GPIOA端口的第1号引脚和第2号引脚。
(5)GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 设置GPIO_InitStructure结构体中的GPIO_Speed成员变量为GPIO_Speed_50MHz,这表示将要初始化的GPIO引脚的最大工作速率被设定为50MHz。
(6)GPIO_Init(GPIOA, &GPIO_InitStructure); 调用GPIO_Init函数,传入GPIOA作为GPIO端口,以及指向前面定义并初始化好的GPIO_InitStructure结构体的地址。这个函数会根据提供的参数对GPIOA端口的Pin1和Pin2进行初始化,使其满足上述配置要求:推挽输出模式,最大工作速率为50MHz。

为什么用I表示同时选定两个引脚,而不用&?

在GPIO(通用输入/输出)端口的Pin定义中,每一个引脚都会对应一个二进制位。例如,假设GPIO_Pin_1对应的是二进制的0001,GPIO_Pin_2对应的是二进制的0010。
现在我们要初始化GPIOA的Pin1和Pin2,就像开启两盏灯一样,我们需要同时点亮这两盏灯,而不是只点亮其中交集部分(如果有交集的话)。
使用按位或运算符 “|”: 如果我们将GPIO_Pin_1(0001)和GPIO_Pin_2(0010)进行按位或运算,结果将是0011。这就意味着我们设置了GPIOA端口的第二位和第三位为1,即同时启用了Pin1和Pin2。
使用按位与运算符 “&”: 如果我们使用"&“运算符,那么只有当Pin1和Pin2对应的位置都是1时,结果位置才会是1。但在实际情况下,Pin1和Pin2是两个不同的引脚,它们在二进制表示中不会共享相同的位,因此”&"操作不能用来同时选择多个引脚。
总结来说,在初始化GPIO端口时,为了同时启用多个引脚,我们采用按位或运算符 “|” 来合并所有想要启用的引脚对应的二进制位,从而达到同时初始化多个GPIO引脚的目的。

3.(1)在C++中,单个"&"符号有两种不同的含义:

①位与运算符:当"&“两边跟着两个整数或整型表达式时,它表示二进制位与操作,例如 a & b。这时”&"用于对两个操作数的每个对应位执行逻辑与运算,结果中每一位均为1当且仅当两个对应位都是1。

int a = 0b1010; // 二进制表示为1010(十进制10)
int b = 0b0110; // 二进制表示为0110(十进制6)
int result = a & b; // 结果将是0b0010(十进制2)

② 引用声明:在声明变量时,"&“用于定义引用,它不是一个操作符而是声明的一部分,例如 int &ref = variable;。这时”&"表示refvariable的一个别名,对ref的所有操作实际上都是对原始变量variable的操作。

(2)两个"&"
逻辑与运算符:对于布尔逻辑操作,表示逻辑与(AND)的符号是双"&",即 &&。当用在布尔表达式中时,如 if (a && b),它会检查两个表达式ab是否都为真,只有两者同时为真时,整个表达式才为真。

bool condition1 = true;
bool condition2 = false;
if (condition1 && condition2) {
  // 这个块不会执行,因为condition2为false
}

综上所述,表示逻辑与(AND)时使用两个"&“符号连续书写——&&,而在进行位与运算或声明引用时,只使用单个”&"符号。

3.在STM32微控制器中,单个GPIO端口的物理引脚在同一时间不能既作为输入又作为输出。

GPIO引脚在硬件设计上是单一方向的,因此必须明确配置为输入模式或输出模式,不能同时既作为输入又作为输出。

如果一个GPIO引脚配置为输入模式(如GPIO_Mode_IPU、GPIO_Mode_IPD、GPIO_Mode_AIN等),那么它就只能接收外部信号,无法向外部输出任何电平。此时,可用GPIO_ReadInputDataBit()函数,返回输出入端口电平。

如果一个GPIO引脚配置为输出模式(如GPIO_Mode_Out_PP、GPIO_Mode_Out_OD等),则它可以由微控制器控制输出高低电平,但这时它就不能反映外部信号的输入状态。此时,可用GPIO_ReadOutputDataBit()函数,返回输出端口电平。