很多时候,我们需要在单片机中保存很多参数,这里提供一个给予STM32IC的例子,
env.c
- #include "env.h"
- #define SAVE_ADDR (0X08020000-0x400)
- _env_base Env;
- uint16_t Crc16_Modbus(uint8_t *puchMsg,uint16_t usDataLen)
- {
- uint16_t i=0;
- uint16_t j=0;
- uint16_t crc16=0xFFFF;
- for (i = 0; i < usDataLen; i++)
- {
- crc16 ^= puchMsg[i];
- for (j = 0; j < 8; j++)
- {
- if ((crc16 & 0x01) == 1)
- {
- crc16 = (crc16 >> 1) ^ 0xA001;
- }
- else
- {
- crc16 = crc16 >> 1;
- }
- }
- }
- return crc16;
- }
- //保存值,env没有发生变化直接退出
- int saveEnv()
- {
- int i=0;
- uint16_t crc;
- uint32_t da;
- crc = Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4);
- if(crc==Env.crc)return 0;
- Env.crc = crc;
- FLASH_Unlock();
- FLASH_ErasePage(SAVE_ADDR);
- for(i=0;i<sizeof(_env_base)/4;i++)
- {
- da = *((uint32_t*)&Env + 1*i);
- FLASH_ProgramWord(SAVE_ADDR+i*4,da);
- }
- FLASH_Lock();
- return 1;
- }
- //读取
- int readEnv()
- {
- int i=0;
- uint32_t *p=(uint32_t *)(&Env);
- for(i=0;i<sizeof(_env_base)/4;i++)
- {
- *p++ = *(uint32_t *)(SAVE_ADDR+i*4);
- }
- if(Env.crc != Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4))
- {
- return -1;
- }
- return 0;
- }
- //初始化
- void initEnvironment()
- {
- if(0!=readEnv())
- {
- tmc2208_set_default();//一个配置组默认值
- spin220_set_default();//另一个默认组默认值
- saveEnv();
- }
- else
- {
- //tmc2208_set_init();//针对配置计算运行时参数
- //spin220_set_init();
- }
- }
复制代码 一共三个函数 saveEnv() readEnv() initEnvironment(),更多时候用户在Env发生变化后且需要保存是调用saceEnv即可,注意flash擦写次数。
Env.h
- #ifndef __ENV_H
- #define __ENV_H
- #include "stm32f0xx.h"
- #include "tmc2208.h"
- #include "spin220.h"
- #pragma pack(4)
- typedef struct{
- uint8_t micro;
- uint8_t fullStep_angle;
- uint16_t start_speed;
- uint16_t max_speed;
- uint16_t min_speed;
- uint16_t inc_distence;
- uint16_t motor_max_current;
- uint16_t motor_resistance;
-
-
- uint32_t pos;
- uint32_t speed;
- }_tmc2208_set;
- typedef struct{
- uint8_t micro;
- uint8_t fullStep_angle;
- uint8_t grat;
-
- uint16_t start_speed;
- uint16_t max_speed;
- uint16_t min_speed;
- uint16_t inc_distence;
- BitAction max_io_value;
-
- uint32_t pos;
- uint32_t speed;
-
- int run_F0;
- int run6_max;
- int run6_min;
- }_spin220_set;
- typedef struct{
- _tmc2208_set tmc2208;
- _spin220_set spin220;
- uint16_t crc;
- }_env_base;
- #pragma pack()
- extern _env_base Env;
- void initEnvironment(void);
- int saveEnv(void);
- #endif
复制代码 这里只举了两个例子,有新的需要保存的参数直接添加修改 struct即可,同时在对应的xxx_set_default()添加默认值即可
- void spin220_set_default()
- {
- Env.spin220.micro = 16;
- Env.spin220.fullStep_angle = 18;
- Env.spin220.inc_distence = 2;
- Env.spin220.start_speed = 60;//
-
- Env.spin220.max_speed = 4000;
- Env.spin220.min_speed = 60;
-
- Env.spin220.max_io_value = Bit_RESET;
-
- Env.spin220.pos = 7200;
- Env.spin220.speed = 4000;
-
- Env.spin220.grat = 0;
-
- Env.spin220.run_F0 = 16;
-
- Env.spin220.run6_max = 0;
- Env.spin220.run6_min = 16;
-
- spin220_set_init();
- }
复制代码 至于xxx_set_init()根据实际需要了
|