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

干货分享-保存配置数据

[复制链接]
tanic 发布时间:2020-1-15 11:55
    很多时候,我们需要在单片机中保存很多参数,这里提供一个给予STM32IC的例子,
# b& o/ g0 ?2 B# U8 \8 U2 U    env.c- s& x% @0 I! H' O( h$ [
  , S  y* z1 E; n) ]
  1. #include "env.h"0 R# w) C, J2 d; P* Y
  2. #define SAVE_ADDR        (0X08020000-0x400)
    8 U% B& g0 o$ }% D
  3. _env_base Env;: j; I3 n5 l$ L: \  W5 b0 ^
  4. uint16_t Crc16_Modbus(uint8_t *puchMsg,uint16_t usDataLen)
      V9 e4 _9 Z: J0 ]1 {
  5. {+ p0 V  k. W5 f. g+ f
  6.         uint16_t i=0;8 C! T& C; B4 i& h. L( d$ F2 N% K
  7.         uint16_t j=0;
    ! l0 N: h' t! r' j
  8.         uint16_t crc16=0xFFFF;$ x" Q" ^+ n. d) |- E
  9.         for (i = 0; i < usDataLen; i++)9 f7 A: g6 X( r5 N  D2 _6 }
  10.         {3 W1 l  m; S3 y( n3 H* U* ]
  11.                 crc16 ^= puchMsg[i];
    + A' b% B7 g# U, y: i# W
  12.                 for (j = 0; j < 8; j++)
    ! K! X+ X7 y( s
  13.                 {               
    5 e8 H* O$ N! P. a
  14.                         if ((crc16 & 0x01) == 1)
    5 s7 C8 }- r+ o, Z; S& l' v: F
  15.                         {
    " B) G& Q/ v; O' K& w4 O
  16.                                 crc16 = (crc16 >> 1) ^ 0xA001;
    5 i  e$ e6 g" A4 o/ ]$ R6 r6 p
  17.                         }1 d1 H2 Q% g4 w' Z" V
  18.                         else
    7 b; X. K' F6 g3 d/ _3 O
  19.                         {
    ; R' F) p. d- Q* N
  20.                                 crc16 = crc16 >> 1;
    3 G9 ^! J5 H+ B  S! k( @0 N
  21.                         }4 d. ~5 i2 q5 ~- m4 g. X
  22.                 }
    - m6 E, {" C9 t" d6 R
  23.         }
    4 D7 c9 A* P7 z( B2 `1 L: t7 M/ W, m% g
  24.         return crc16;       
    4 P+ z/ K" h7 g* S4 }6 p% n
  25. }: A1 l8 j. i8 i
  26. //保存值,env没有发生变化直接退出
    & p+ n7 p+ ?# q; N3 j
  27. int saveEnv()
    & |* Z9 {$ ?3 R' u+ D
  28. {
    & M6 {. G2 j7 e" u9 a( p/ ]
  29.         int i=0;5 h# y9 J9 k3 ]0 I  d) M
  30.         uint16_t crc;; j$ z* O7 B- s# G% V; V6 H. a$ a
  31.         uint32_t da;
    ' e: V% q/ x) r1 w/ r
  32.         crc = Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4);* t) {. G; u8 k( I0 D+ n, Q
  33.         if(crc==Env.crc)return 0;0 h2 T1 X8 D! d4 H, T
  34.         Env.crc = crc;       
    - |0 d8 _. K7 i, n4 r
  35.         FLASH_Unlock();' |. k0 K$ D0 t5 w( M
  36.         FLASH_ErasePage(SAVE_ADDR);' K- `+ `) R. P
  37.         for(i=0;i<sizeof(_env_base)/4;i++)
    % z% }7 m$ z8 ]! e
  38.         {
    - M' |. b/ U. B  n
  39.                 da = *((uint32_t*)&Env + 1*i);. j! L+ O. U! [, \0 i) n
  40.                 FLASH_ProgramWord(SAVE_ADDR+i*4,da);
    ' z2 A; G# U2 Z- c4 K- Q
  41.         }* Q$ y4 E6 u8 H# x% Q
  42.         FLASH_Lock();
    $ Z- [+ d! h" l1 }
  43.         return 1;
    " y- d8 n8 m) j3 D4 J5 C) B9 y( U5 P) T
  44. }8 F$ @6 J% n3 {5 l& |9 [, h
  45. //读取
    ! k) o: `! l# x: R  T; m
  46. int readEnv()1 p( ^3 v( W3 x0 z* n" T- o
  47. {
    5 p% d6 @# d' C: E0 T# F) ?
  48.         int i=0;2 p- ?7 w! p* n- m! T" I$ H4 ?3 k
  49.         uint32_t *p=(uint32_t *)(&Env);' i, l5 r+ l; i, R- g5 }
  50.         for(i=0;i<sizeof(_env_base)/4;i++)0 K. T3 }# r/ F: n: B
  51.         {
    2 ^+ R( G5 {: m6 h8 N
  52.                 *p++ = *(uint32_t *)(SAVE_ADDR+i*4);6 D* v( n, k% N6 W
  53.         }$ o" l0 `* b+ G' ^$ L9 C& T
  54.         if(Env.crc != Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4))
    0 [7 c% L6 W9 p; o
  55.         {- [+ r; |5 |, O: B7 e
  56.                 return -1;
    " R- [; s% _* f, K  i* @( j
  57.         }
    % K" H- J& [6 b* v7 C( i* u
  58.         return 0;# T- S9 w. ], f' C  \& ^0 X
  59. }
    + `  n7 `9 d$ h8 g- O
  60. //初始化' K7 G* _# A: ?
  61. void initEnvironment()
    : ~6 k/ K& O! @6 @
  62. {/ ~. r, J: K/ @) @) W% z
  63.         if(0!=readEnv())4 d% F% d$ f/ \* K5 `) h0 @# U3 F* _
  64.         {
    & N+ @2 H4 \! k# O& J: A. F
  65.                 tmc2208_set_default();//一个配置组默认值% t$ l# e) c: t0 T
  66.                 spin220_set_default();//另一个默认组默认值
    8 l0 ]5 e' c% i; ^! U1 l9 i( P
  67.                 saveEnv();
    1 ^9 R* P7 Q" z! A. d( C- Y
  68.         }5 f6 M& N. H$ X* f( F$ Q  S
  69.         else
    % a3 y7 t& X" M6 o0 v7 c( F
  70.         {( u4 N+ C3 p" {" w7 I
  71.                 //tmc2208_set_init();//针对配置计算运行时参数
    , m: M5 f( u3 u- I7 f0 a0 n
  72.                 //spin220_set_init();, a* N/ p! J. G; Y7 ?2 S
  73.         }" k/ w$ B% {. e! `
  74. }
复制代码
一共三个函数 saveEnv() readEnv() initEnvironment(),更多时候用户在Env发生变化后且需要保存是调用saceEnv即可,注意flash擦写次数。* Q$ h* P) a/ X% C
Env.h
" J1 p$ u0 w7 O# q
  1. #ifndef __ENV_H
    1 P2 {3 i! {4 b2 N
  2. #define __ENV_H
    3 k1 i; H/ ]$ ^

  3. 6 c) e% [6 i5 G" ~* [
  4. #include "stm32f0xx.h"
    9 ?7 A( E6 b, s
  5. #include "tmc2208.h"% x: k- q. X- D, w
  6. #include "spin220.h"+ m+ i3 L) ^. ]! z1 T

  7. ' D% o. s4 V1 ^5 q1 H
  8. #pragma pack(4)
    ! O, H7 r$ L, N# O
  9. typedef struct{# \% z* y  [8 {- s
  10.         uint8_t micro;
    8 g, v4 Y5 ~5 A6 u) p8 K* d, ]
  11.         uint8_t fullStep_angle;6 J$ z* q% B7 R& x4 z
  12.         uint16_t start_speed;
    / D9 ^8 U: k( N# @$ j
  13.         uint16_t max_speed;
      B, s7 Q2 Z" P2 h) @
  14.         uint16_t min_speed;$ c7 f% t7 Z- g" U; N4 U+ O  f
  15.         uint16_t inc_distence;
    8 i% n3 }% w' b2 b3 e! J$ p: d
  16.         uint16_t motor_max_current;
    . V+ ?6 v& g" U9 s: Y
  17.         uint16_t motor_resistance;
    ( G1 g5 ^' }# r! n' A5 @% M  Z. y
  18.         ; y0 b. g' V' C, k: d
  19.           C! t# w+ D; z& ~) `3 s
  20.         uint32_t pos;' g" r& W1 N0 s& j
  21.         uint32_t speed;
    6 c( G# G3 X) w8 M) P7 [. g
  22. }_tmc2208_set;
    % c$ @$ y, \% D! f0 T  V

  23. * f% i/ Q0 V3 C/ y  ?  U( k3 K# V/ g
  24. typedef struct{8 y) O  V0 V% o
  25.         uint8_t micro;2 s& P0 Z# ~% \
  26.         uint8_t fullStep_angle;" S$ P! d5 Q! |9 ]1 n  Y
  27.         uint8_t grat;9 z$ S0 x3 T+ {
  28.         " N# ]6 Q2 _5 D$ j& b: F
  29.         uint16_t start_speed;
    4 g4 J" Q' R  z  _7 \
  30.         uint16_t max_speed;( h& V- h, J; t
  31.         uint16_t min_speed;
    % u: ?8 ]+ A& f) Y$ x
  32.         uint16_t inc_distence;6 A' E# v* |6 e8 _! `$ e1 |1 T
  33.         BitAction max_io_value;+ r1 C% j9 s) Z! z7 O+ ]. I
  34.         3 X* ?; a+ P, `: Z; ?3 Y; W
  35.         uint32_t pos;
    6 A7 a9 W" c4 ]% ^$ `" b3 ?
  36.         uint32_t speed;
    2 w. ~- ~4 @$ f) g7 z
  37.        
    / K' j, l% I# H8 ]
  38.         int run_F0;) o& T' V7 c4 A; d3 w& p# _, m
  39.         int run6_max;. K, I- j  @" n& h% _
  40.         int run6_min;
    ) a' P1 G5 u" g
  41. }_spin220_set;
    # Y4 G5 y. v. a3 x$ h
  42. 4 J! [6 H, k; `8 j
  43.   b3 G$ r4 |: G6 u+ N9 p9 h

  44. + V) K# M, e0 F" K: S( f
  45. + _: y2 h% a$ H( c1 i
  46. typedef struct{
    & D! d1 Z, {* c# L6 P
  47.    _tmc2208_set tmc2208;
    . f  N+ H. m- w' s
  48.    _spin220_set spin220;" ]$ @( J" W# O/ ]3 M( k! m% o
  49.    uint16_t crc;2 B! D" q8 o% y. Q: k
  50. }_env_base;& [; s+ N3 m, l. J" Z$ g! v" y# T
  51. #pragma pack()
    6 I2 U3 ~6 l5 J, ]0 x/ v. D
  52. 9 |* g4 l& B1 ~1 `( p
  53. extern _env_base Env;
    # x7 d8 F8 s3 ~- w! n4 D
  54. void initEnvironment(void);
    & {: s4 Q$ \6 m, B0 A" K
  55. int saveEnv(void);
    ' A; {* A; G. q9 q1 C
  56. #endif
复制代码
这里只举了两个例子,有新的需要保存的参数直接添加修改 struct即可,同时在对应的xxx_set_default()添加默认值即可& _1 E: \9 n/ Y( c* S$ J$ j7 b
  1. + j+ p. `$ X9 t& o6 m
  2. void spin220_set_default(): s2 _7 X/ H) H- Y# m" `6 P
  3. {
    & K- Q( W0 V; [
  4.         Env.spin220.micro = 16;% \% t8 Y1 I" J
  5.         Env.spin220.fullStep_angle = 18;
    / L* P' f# H8 k9 c* V' S) c
  6.         Env.spin220.inc_distence = 2;
    0 F) ?: i4 v3 m! Z6 \
  7.         Env.spin220.start_speed = 60;//
    3 N& J% n& ~5 f& F3 `+ u+ j6 U
  8.         6 q  L/ Z8 i. V. y% W
  9.         Env.spin220.max_speed = 4000;
    3 {, b, F! I( m( P! K' l
  10.         Env.spin220.min_speed = 60;
    * l1 }. V0 \# c+ {- r7 h% P% G2 C
  11.        
    3 V  v4 h7 V) [4 r1 b; Y9 z$ C8 S# H
  12.         Env.spin220.max_io_value = Bit_RESET;
    / U" o; v* Y- y* ]/ V; j9 n% y
  13.        
    * r( x2 y0 r# }# q
  14.         Env.spin220.pos = 7200;
    + N! _6 r! B( K% v2 l
  15.         Env.spin220.speed = 4000;( i2 G. t+ x2 j$ I( D
  16.        
    4 a$ M( U3 p" d: p, j9 R
  17.         Env.spin220.grat = 0;) W; E3 L1 c( Y# P  l) z9 ^
  18.         $ g+ x; N- s. T
  19.         Env.spin220.run_F0 = 16;
    & t1 i2 Q( \: o4 o- e
  20.         % |- H7 U( Z! ~6 u; ?9 U; w8 [
  21.         Env.spin220.run6_max = 0;
    : i: A# m- R) ?) |& \
  22.         Env.spin220.run6_min = 16;9 m- ?* x3 k: {( P8 E; ^* o
  23.        
    - W6 g- w7 n2 w$ r: K1 Q- Q
  24.         spin220_set_init();
    4 I4 K0 n* |: @/ a  d' _. }4 Z& A
  25. }
复制代码
至于xxx_set_init()根据实际需要了0 K$ [- S. n1 ^$ o" j9 |% I  j

; [! W9 t+ A# E3 h$ h
/ }- U% K7 P2 b/ c  [% E
# m0 ?' P+ ~2 s. h- G& J+ J2 C$ J9 z, X' C7 u0 ^8 X3 S8 g
5 ?' H0 ^) C& U: W) F, }9 j" ]
收藏 评论0 发布时间:2020-1-15 11:55

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版