STM32F103C8T6flash调参
时间: 2025-05-25 13:13:47 浏览: 14
### STM32F103C8T6 Flash按键调参教程
STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的高性能微控制器,广泛应用于智能车和其他嵌入式项目中。Flash 调参是一种常见的方法,用于在不连接电脑的情况下调整系统参数。以下是实现此功能的具体步骤和示例代码。
---
#### 一、Flash按键的工作原理
Flash按键通常被用作触发条件,当按下该按键时,系统会进入一种特殊的配置模式。这种模式允许用户通过其他硬件接口(如旋钮或拨码开关)修改预设参数,并将新值保存到非易失性存储器(如 EEPROM 或 Flash 的指定区域)中[^1]。
---
#### 二、硬件准备
1. **Flash按键**:连接至任意 GPIO 引脚。
2. **显示模块(可选)**:例如 OLED 屏幕,用于实时反馈当前参数值。
3. **输入设备(可选)**:如旋转编码器或电位计,用于调整参数值。
4. **存储介质**:使用内部 Flash 或外部 EEPROM 存储参数。
---
#### 三、软件设计思路
##### 1. 检测Flash按键状态
编写一个函数定期轮询 Flash 按键的状态。如果检测到按键按下,则切换至参数调整模式。
```c
void CheckFlashButton(void) {
static uint8_t button_pressed = 0;
if (HAL_GPIO_ReadPin(FLASH_BUTTON_PORT, FLASH_BUTTON_PIN) == GPIO_PIN_RESET) {
if (!button_pressed) {
EnterConfigMode(); // 进入参数调整模式
button_pressed = 1;
}
} else {
button_pressed = 0; // 按键松开后重置标志位
}
}
```
##### 2. 定义参数存储位置
创建全局变量数组来表示需要调整的参数,并将其映射到 Flash 中的一个固定地址。
```c
#define PARAMETER_ADDRESS ((uint32_t)0x0801F000) // 预留的Flash空间地址
typedef struct {
float pid_kp; // PID比例增益
float pid_ki; // 积分增益
float pid_kd; // 微分增益
} ParameterStruct;
ParameterStruct parameters __attribute__((section(".parameter_section"))) = {0};
```
注意:`__attribute__((section))` 将结构体放置于自定义内存分区中,需配合链接脚本设置。
##### 3. 提供用户交互手段
假设使用旋转编码器作为输入设备,每转动一圈增加/减少某个参数值。
```c
void AdjustParametersWithEncoder(int direction) {
switch (current_parameter_index) {
case 0:
parameters.pid_kp += direction * 0.1f;
break;
case 1:
parameters.pid_ki += direction * 0.01f;
break;
case 2:
parameters.pid_kd += direction * 0.1f;
break;
}
SaveParametersToFlash();
}
// 将参数写入Flash
void SaveParametersToFlash(void) {
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
uint32_t address = PARAMETER_ADDRESS;
for (int i = 0; i < sizeof(ParameterStruct); i++) {
HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address++, *((uint8_t*)¶meters + i));
}
HAL_FLASH_Lock();
}
```
##### 4. 显示当前参数值
如果有 OLED 显示屏可用,可以动态更新屏幕上的数据显示给用户。
```c
void DisplayCurrentParameters(void) {
char buffer[50];
snprintf(buffer, sizeof(buffer), "KP:%.2f\nKI:%.2f\nKD:%.2f", parameters.pid_kp,
parameters.pid_ki, parameters.pid_kd);
SSD1306_Clear();
SSD1306_WriteString(buffer, Font_7x10, White);
SSD1306_UpdateScreen();
}
```
---
#### 四、完整流程总结
1. 初始化GPIO端口及其他外设。
2. 主循环中不断监测Flash按键状态。
3. 若检测到按键按下则进入参数调整模式。
4. 用户可通过旋转编码器或其他输入装置修改目标参数。
5. 修改完成后保存最新参数至Flash并退出配置模式。
---
### 示例代码片段
以下是一个简化版的整体框架:
```c
#include "stm32f1xx_hal.h"
#include "ssd1306.h"
#define FLASH_BUTTON_PORT GPIOA
#define FLASH_BUTTON_PIN GPIO_PIN_0
volatile int current_parameter_index = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1) {
CheckFlashButton();
HAL_Delay(10);
}
}
void CheckFlashButton(void) {
static uint8_t button_pressed = 0;
if (HAL_GPIO_ReadPin(FLASH_BUTTON_PORT, FLASH_BUTTON_PIN) == GPIO_PIN_RESET) {
if (!button_pressed) {
EnterConfigMode();
button_pressed = 1;
}
} else {
button_pressed = 0;
}
}
void EnterConfigMode(void) {
while (HAL_GPIO_ReadPin(FLASH_BUTTON_PORT, FLASH_BUTTON_PIN) == GPIO_PIN_RESET) {
DisplayCurrentParameters();
HandleUserInput(); // 处理来自旋转编码器等设备的输入
HAL_Delay(10);
}
SaveParametersToFlash();
}
```
---
####
阅读全文
相关推荐














