KEYKING STM32笔记:GPIO控制LED灯
GPIO——LED灯
第一课 点灯大师
推挽模式放入while函数中,用于GPIO高低电平调整和延时
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
第二课 点灯宗师
通过state实现流水灯, C语言部分基础
int state; // 声明一个整数变量state
if (state <= 2 || state==5){
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
}
if (state >= 1 && state<=3){
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
}
if (state >= 2 && state<=5){
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET);
}
HAL_Delay(300);
state++;
if (state > 5){
state = 0;
}
}
条件语句
常见的条件语句包括 if
语句、else
语句、else if
语句以及 switch
语句。下面是这些条件语句的详细讲解。
1. if 语句
if
语句根据一个布尔表达式(条件)的值来决定是否执行一个代码块。如果条件为真(非零值),则执行代码块;否则不执行。
if (condition) {
// 当condition为真时,执行这段代码
}
2. if-else 语句
if-else
语句在 if
条件为假(零值)时执行 else
代码块。
if (condition) {
// 当condition为真时,执行这段代码
} else {
// 当condition为假时,执行这段代码
}
3. if-else if-else 语句
if-else if-else
语句用于检查多个条件。在 if
和 else if
条件都为假时,执行 else
代码块。
if (condition1) {
// 当condition1为真时,执行这段代码
} else if (condition2) {
// 当condition1为假,condition2为真时,执行这段代码
} else {
// 当condition1和condition2都为假时,执行这段代码
}
4. 嵌套的 if 语句
可以在一个 if
或 else
代码块中再使用 if
语句,这就是嵌套的 if
语句。
if (condition1) {
// 当condition1为真时,执行这段代码
if (condition2) {
// 当condition1和condition2都为真时,执行这段代码
}
}
5. switch 语句
switch
语句根据一个变量或表达式的值,选择一个 case
代码块执行。break
语句用于结束当前 case
代码块,防止继续执行后面的 case
。
switch (expression) {
case constant1:
// 当expression等于constant1时,执行这段代码
break;
case constant2:
// 当expression等于constant2时,执行这段代码
break;
// 可以有多个case
default:
// 当expression不等于任何一个constant时,执行这段代码
}
关键点
if
条件可以是任何布尔表达式,包括比较操作和逻辑操作。if-else
提供了二选一的逻辑分支。if-else if-else
允许检查多个条件,但只执行第一个为真的条件代码块。- 嵌套
if
语句 允许复杂条件检查。 switch
语句 允许基于变量的多个值执行不同的代码块,适合用于检查一个变量的多个具体值。
在C语言中,运算符是用于执行各种操作的符号。运算符可以分为几类,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符和其他运算符。下面是对每一类运算符的详细讲解。
运算符
1. 算术运算符
算术运算符用于执行基本的算术运算,如加减乘除等。
运算符 | 描述 | 示例 |
---|---|---|
+ |
加法 | a + b |
- |
减法 | a - b |
* |
乘法 | a * b |
/ |
除法 | a / b |
% |
取模(取余) | a % b |
2. 关系运算符
关系运算符用于比较两个值,结果为真或假(即1或0)。
运算符 | 描述 | 示例 |
---|---|---|
== |
等于 | a == b |
!= |
不等于 | a != b |
> |
大于 | a > b |
< |
小于 | a < b |
>= |
大于等于 | a >= b |
<= |
小于等于 | a <= b |
3. 逻辑运算符
逻辑运算符用于进行逻辑操作,结果为真或假。
运算符 | 描述 | 示例 |
---|---|---|
&& |
逻辑与 | a && b |
双竖杠 |
逻辑或 | a双竖杠b |
! |
逻辑非 | !a |
4. 位运算符
位运算符用于按位操作二进制数。
运算符 | 描述 | 示例 |
---|---|---|
& |
按位与 | a & b |
竖杠 |
按位或 | a 竖杠b |
^ |
按位异或 | a ^ b |
~ |
按位取反 | ~a |
<< |
左移 | a << 2 |
>> |
右移 | a >> 2 |
示例
int a = 5, b = 3; // a = 0101, b = 0011 in binary
int result1 = a & b; // result1 = 1 (0001)
int result2 = a | b; // result2 = 7 (0111)
int result3 = a ^ b; // result3 = 6 (0110)
int result4 = ~a; // result4 = -6 (1111...1010 in 2's complement)
int result5 = a << 1; // result5 = 10 (1010)
int result6 = a >> 1; // result6 = 2 (0010)
5. 赋值运算符
赋值运算符用于将值赋给变量。
运算符 | 描述 | 示例 |
---|---|---|
= |
赋值 | a = b |
+= |
加后赋值 | a += b |
-= |
减后赋值 | a -= b |
*= |
乘后赋值 | a *= b |
/= |
除后赋值 | a /= b |
%= |
取模后赋值 | a %= b |
&= |
按位与后赋值 | a &= b |
竖杠 = |
按位或后赋值 | a竖杠b |
^= |
按位异或后赋值 | a ^= b |
<<= |
左移后赋值 | a <<= b |
>>= |
右移后赋值 | a >>= b |
示例
cint a = 10;
a += 5; // a = a + 5 = 15
a -= 3; // a = a - 3 = 12
a *= 2; // a = a * 2 = 24
a /= 4; // a = a / 4 = 6
a %= 5; // a = a % 5 = 1
6. 条件运算符(三元运算符)
条件运算符是一种简写的 if-else
语句。
运算符 | 描述 | 示例 |
---|---|---|
?: |
条件表达式 | condition ? expr1 : expr2 |
示例
int a = 5, b = 10;
int max = (a > b) ? a : b; // max = 10
7. 其他运算符
运算符 | 描述 | 示例 |
---|---|---|
sizeof |
返回变量或数据类型的大小(以字节为单位) | sizeof(a) |
& |
取地址运算符,返回变量的地址 | &a |
* |
间接寻址运算符,访问指针所指向的变量 | *ptr |
. |
结构体成员访问运算符 | structVar.member |
-> |
结构体指针成员访问运算符 | ptr->member |
示例
int a = 10;
int *ptr = &a; // ptr 指向 a 的地址
int size = sizeof(a); // size = 4 (假设 int 是 4 个字节)
第三课 按键控制小灯
不上拉不下拉浮空输入模式
在while中使用轮询方式读取按键
while (1)
{
HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);//高电平返回GPIO_PIN_SET,低高电平返回GPIO_PIN_RESET,该行代码无用
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET);
}
if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET){
HAL_Delay(10);//由于按键抖动,因此需要进行10ms延迟消抖
if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET){
HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);//用于切换(翻转)指定GPIO引脚状态的函数。
while (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET){}
}
}
第四课(重点)GPIO内部的电路原理
推挽输出电路
由来自芯片的电压驱动
开漏输出电路
依靠外部的电压来进行驱动
两种输出模式的对比
八大模式
作者:a.zhai