stm32while循环语句用法
时间: 2024-01-17 16:18:20 浏览: 289
STM32中的while循环语句有两种用法,分别是`while( 表达式 );`和`while( 表达式 ){ 循环体 }`。
1. `while( 表达式 );`:这种用法表示当满足条件时进入循环,循环体为空,循环会一直执行下去,直到条件不满足时跳出循环。例如:
```c
while( i < 10 );
```
上述代码表示当`i`小于10时,进入循环,但循环体为空,所以循环会一直执行下去,直到`i`不小于10时跳出循环。
2. `while( 表达式 ){ 循环体 }`:这种用法表示当满足条件时进入循环,循环体会被执行一次,然后再次判断条件是否满足,如果满足则继续执行循环体,直到条件不满足时跳出循环。例如:
```c
while( i < 10 ){
// 循环体
i++;
}
```
上述代码表示当`i`小于10时,进入循环,执行循环体中的代码,然后将`i`加1,再次判断条件是否满足,如果满足则继续执行循环体,直到`i`不小于10时跳出循环。
区别:
- 第一种用法中,循环体为空,只判断条件是否满足,如果满足则继续执行循环,不满足则跳出循环。
- 第二种用法中,循环体不为空,先执行一次循环体中的代码,然后再判断条件是否满足,如果满足则继续执行循环体,不满足则跳出循环。
相关问题
stm32如何跳出while循环
以下是几种跳出while循环的方法:
1. 使用break语句:在while循环中使用break语句可以直接跳出循环,例如:
```c
while(1){
if(condition){
break;
}
}
```
2. 使用goto语句:在while循环中使用goto语句可以跳转到指定的标签处,例如:
```c
while(1){
if(condition){
goto label;
}
}
label: // 标签处
```
3. 修改循环条件:在while循环中修改循环条件可以使循环结束,例如:
```c
while(condition){
if(some_condition){
condition = 0; // 修改循环条件
}
}
```
stm32按钮的用法
### STM32 中按钮使用的教程
在STM32项目中,按钮通常连接到GPIO引脚上,并通过外部中断或轮询方式检测其状态变化。下面将以STM32G030C8T6为例说明如何配置并实现简单的按键控制功能。
#### 配置 GPIO 输入模式
为了读取按钮的状态,需要先设置相应的GPIO引脚为输入模式。可以利用STM32CubeMX工具来简化这一过程:
- 打开STM32CubeMX软件新建工程[^1]。
- 选择目标芯片型号(如STM32G030C8Tx)。
- 进入Pinout & Configuration界面找到要连接按钮的引脚(例如PA0),将其配置成Input模式下的Pull-up or Pull-down电阻选项之一,这取决于实际硬件电路设计需求。
#### 编写初始化函数
完成上述配置后,在生成的代码框架内会自动生成对应的初始化语句。对于手动编写的情况,则需调用`HAL_GPIO_Init()`接口来进行具体参数设定:
```c
// 初始化结构体定义
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 设置端口时钟使能
__HAL_RCC_GPIOA_CLK_ENABLE();
// PA0作为输入引脚, 上拉电阻
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
#### 实现按键事件处理逻辑
接下来就是核心部分——判断是否有按下动作发生以及响应措施。这里提供两种常见做法:一种基于定时器循环扫描;另一种则是借助EXTI(External Interrupt Line)触发机制。
##### 方法一: 定时器轮询法
这种方法适用于较为简单应用场景下,不需要精确捕捉按压时刻的情形。可以在主程序里加入延时等待环节定期查询指定IO电平状况:
```c
while (1){
// 延迟一段时间再继续执行后续操作
HAL_Delay(10);
// 判断PA0是否被按下(低电平有效), 若成立则点亮LED灯
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_RESET){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); // 点亮LED
}else{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); // 关闭LED
}
}
```
##### 方法二: EXTI 中断驱动型
当追求更高效的实时性能表现时可选用此方案。它允许CPU处于休眠状态下也能及时感知外界信号变动从而唤醒系统做出反应。首先得确保已经正确设置了相关外设资源之后才能启用该特性:
```c
/* 在stm32_hal_conf.h文件中取消注释 */
#define USE_HAL_DRIVER
#define HAL_USE_EXTI /* Enable External lines Interface */
/* 添加至main.c中的全局变量声明区 */
extern void MX_GPIO_Init(void);
/* 修改main()入口处添加以下内容 */
void SystemClock_Config(void);
int main(void)
{
...
// 注册回调函数
HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while (1){}
}
/* 创建新的源文件exti_handler.c并将下列代码粘贴进去 */
#include "main.h"
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0){
static uint8_t led_state=0;
// 反转当前LED状态
led_state=!led_state;
// 控制LED开关
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13,(GPIO_PinState)led_state);
}
}
```
阅读全文