你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

干货分享-保存配置数据

[复制链接]
tanic 发布时间:2020-1-15 11:55
    很多时候,我们需要在单片机中保存很多参数,这里提供一个给予STM32IC的例子,
    env.c
  
  1. #include "env.h"
  2. #define SAVE_ADDR        (0X08020000-0x400)
  3. _env_base Env;
  4. uint16_t Crc16_Modbus(uint8_t *puchMsg,uint16_t usDataLen)
  5. {
  6.         uint16_t i=0;
  7.         uint16_t j=0;
  8.         uint16_t crc16=0xFFFF;
  9.         for (i = 0; i < usDataLen; i++)
  10.         {
  11.                 crc16 ^= puchMsg[i];
  12.                 for (j = 0; j < 8; j++)
  13.                 {               
  14.                         if ((crc16 & 0x01) == 1)
  15.                         {
  16.                                 crc16 = (crc16 >> 1) ^ 0xA001;
  17.                         }
  18.                         else
  19.                         {
  20.                                 crc16 = crc16 >> 1;
  21.                         }
  22.                 }
  23.         }
  24.         return crc16;       
  25. }
  26. //保存值,env没有发生变化直接退出
  27. int saveEnv()
  28. {
  29.         int i=0;
  30.         uint16_t crc;
  31.         uint32_t da;
  32.         crc = Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4);
  33.         if(crc==Env.crc)return 0;
  34.         Env.crc = crc;       
  35.         FLASH_Unlock();
  36.         FLASH_ErasePage(SAVE_ADDR);
  37.         for(i=0;i<sizeof(_env_base)/4;i++)
  38.         {
  39.                 da = *((uint32_t*)&Env + 1*i);
  40.                 FLASH_ProgramWord(SAVE_ADDR+i*4,da);
  41.         }
  42.         FLASH_Lock();
  43.         return 1;
  44. }
  45. //读取
  46. int readEnv()
  47. {
  48.         int i=0;
  49.         uint32_t *p=(uint32_t *)(&Env);
  50.         for(i=0;i<sizeof(_env_base)/4;i++)
  51.         {
  52.                 *p++ = *(uint32_t *)(SAVE_ADDR+i*4);
  53.         }
  54.         if(Env.crc != Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4))
  55.         {
  56.                 return -1;
  57.         }
  58.         return 0;
  59. }
  60. //初始化
  61. void initEnvironment()
  62. {
  63.         if(0!=readEnv())
  64.         {
  65.                 tmc2208_set_default();//一个配置组默认值
  66.                 spin220_set_default();//另一个默认组默认值
  67.                 saveEnv();
  68.         }
  69.         else
  70.         {
  71.                 //tmc2208_set_init();//针对配置计算运行时参数
  72.                 //spin220_set_init();
  73.         }
  74. }
复制代码
一共三个函数 saveEnv() readEnv() initEnvironment(),更多时候用户在Env发生变化后且需要保存是调用saceEnv即可,注意flash擦写次数。
Env.h
  1. #ifndef __ENV_H
  2. #define __ENV_H

  3. #include "stm32f0xx.h"
  4. #include "tmc2208.h"
  5. #include "spin220.h"

  6. #pragma pack(4)
  7. typedef struct{
  8.         uint8_t micro;
  9.         uint8_t fullStep_angle;
  10.         uint16_t start_speed;
  11.         uint16_t max_speed;
  12.         uint16_t min_speed;
  13.         uint16_t inc_distence;
  14.         uint16_t motor_max_current;
  15.         uint16_t motor_resistance;
  16.        
  17.        
  18.         uint32_t pos;
  19.         uint32_t speed;
  20. }_tmc2208_set;

  21. typedef struct{
  22.         uint8_t micro;
  23.         uint8_t fullStep_angle;
  24.         uint8_t grat;
  25.        
  26.         uint16_t start_speed;
  27.         uint16_t max_speed;
  28.         uint16_t min_speed;
  29.         uint16_t inc_distence;
  30.         BitAction max_io_value;
  31.        
  32.         uint32_t pos;
  33.         uint32_t speed;
  34.        
  35.         int run_F0;
  36.         int run6_max;
  37.         int run6_min;
  38. }_spin220_set;




  39. typedef struct{
  40.    _tmc2208_set tmc2208;
  41.    _spin220_set spin220;
  42.    uint16_t crc;
  43. }_env_base;
  44. #pragma pack()

  45. extern _env_base Env;
  46. void initEnvironment(void);
  47. int saveEnv(void);
  48. #endif
复制代码
这里只举了两个例子,有新的需要保存的参数直接添加修改 struct即可,同时在对应的xxx_set_default()添加默认值即可

  1. void spin220_set_default()
  2. {
  3.         Env.spin220.micro = 16;
  4.         Env.spin220.fullStep_angle = 18;
  5.         Env.spin220.inc_distence = 2;
  6.         Env.spin220.start_speed = 60;//
  7.        
  8.         Env.spin220.max_speed = 4000;
  9.         Env.spin220.min_speed = 60;
  10.        
  11.         Env.spin220.max_io_value = Bit_RESET;
  12.        
  13.         Env.spin220.pos = 7200;
  14.         Env.spin220.speed = 4000;
  15.        
  16.         Env.spin220.grat = 0;
  17.        
  18.         Env.spin220.run_F0 = 16;
  19.        
  20.         Env.spin220.run6_max = 0;
  21.         Env.spin220.run6_min = 16;
  22.        
  23.         spin220_set_init();
  24. }
复制代码
至于xxx_set_init()根据实际需要了





收藏 评论0 发布时间:2020-1-15 11:55

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版