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

干货分享-保存配置数据

[复制链接]
tanic 发布时间:2020-1-15 11:55
    很多时候,我们需要在单片机中保存很多参数,这里提供一个给予STM32IC的例子,
8 \' L% Y/ i0 ]4 h    env.c4 |$ p" M5 B4 X" G. t( ]
  1 R* ]' r: W# ?- M' `' {
  1. #include "env.h": H+ `8 v, G! q/ C# \; N
  2. #define SAVE_ADDR        (0X08020000-0x400)
    ; l0 e+ A. W9 @7 e! w
  3. _env_base Env;: `& {7 v3 a- t* Y
  4. uint16_t Crc16_Modbus(uint8_t *puchMsg,uint16_t usDataLen); V  ?" T1 z2 E" j1 U7 a2 n
  5. {. V2 ]9 _" h2 y& `4 o4 f
  6.         uint16_t i=0;- W, u7 n- T0 R: z- E3 \
  7.         uint16_t j=0;4 g% ]" S& I5 b5 W0 c$ @
  8.         uint16_t crc16=0xFFFF;* l4 x: k6 I% h- I+ h7 U& P
  9.         for (i = 0; i < usDataLen; i++)3 D: \( s! @+ a0 C- f4 d
  10.         {
    ! |" {+ j( f1 H( ?: k
  11.                 crc16 ^= puchMsg[i];1 P% |. ?6 ~/ x7 `+ m1 d
  12.                 for (j = 0; j < 8; j++)
    ( U/ `/ c3 \% H
  13.                 {                ! k8 U3 s9 Z+ t; C
  14.                         if ((crc16 & 0x01) == 1)8 Z# S* Z6 j# ]- |0 h% K
  15.                         {
    ; C/ {; w; q# t# Z
  16.                                 crc16 = (crc16 >> 1) ^ 0xA001;# b$ S6 B8 d- z. s% n
  17.                         }
    2 D+ z- `" i0 ^* A5 I$ B
  18.                         else
    # J" o% k1 [: R5 {& y" t* E5 s8 w$ B; b
  19.                         {- K. g5 E: T7 w3 J, F! R0 `1 c
  20.                                 crc16 = crc16 >> 1;
    : o% b6 }; x6 ~- I
  21.                         }6 I4 f3 R" |. C7 [
  22.                 }. G% V- i' `5 k7 i, j
  23.         }
    + s  V- l8 f( Z& M# O9 x
  24.         return crc16;        / ?, \4 m, l6 H- l" p& f
  25. }
    0 Q( X# {% f' V1 Y1 b
  26. //保存值,env没有发生变化直接退出- P$ O: R9 I% a$ I* O( d0 P6 x
  27. int saveEnv()0 |2 W7 o% h. X
  28. {
    ! O( F( h! w& k+ N0 {- c7 N. a5 J
  29.         int i=0;
    7 O) x( I8 K; m( Q7 k- W' b2 Q
  30.         uint16_t crc;
    6 w1 o$ \2 n: P, ?
  31.         uint32_t da;
    + h* o, h) v0 B- q  X, {3 M9 U+ ^, K
  32.         crc = Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4);
    ) P$ ]7 R1 z. [; f. _) k! s% q! L
  33.         if(crc==Env.crc)return 0;
    & g4 U# X" [' W7 _+ q- V& O* u
  34.         Env.crc = crc;        ) }. X' U) c) e( S9 v$ b: I
  35.         FLASH_Unlock();
    7 o6 a4 Y! {! D' R- h
  36.         FLASH_ErasePage(SAVE_ADDR);
      ?* H, k! R  s- X! l( r
  37.         for(i=0;i<sizeof(_env_base)/4;i++)0 X9 H: Y1 `; C# W% n+ F0 q
  38.         {
    ' G9 a$ }2 k* ]3 P1 O: M3 c
  39.                 da = *((uint32_t*)&Env + 1*i);' O3 Q5 }" K% l
  40.                 FLASH_ProgramWord(SAVE_ADDR+i*4,da);
    5 w% y$ g' ?& M; n" o; B6 S- M
  41.         }
    + U/ {. j% k+ i
  42.         FLASH_Lock();
    , L7 m( G+ i0 B" B: `% q
  43.         return 1;$ V9 [- Z7 e* }& P  |
  44. }3 J7 P% \9 {1 u& u3 F, Q/ Q* R# `8 u* N
  45. //读取
    0 q8 a( ]' p5 H. D
  46. int readEnv()2 Z$ _) x! q0 S5 R
  47. {+ a. q& a/ l/ \6 r- D; ^. n# t
  48.         int i=0;: N  t- s! C, |+ U# p3 u
  49.         uint32_t *p=(uint32_t *)(&Env);0 V5 y! K$ _4 n
  50.         for(i=0;i<sizeof(_env_base)/4;i++)
    # S# n, [1 m" z6 _
  51.         {
    1 O% A" ^9 P+ \6 f
  52.                 *p++ = *(uint32_t *)(SAVE_ADDR+i*4);1 o6 R0 ^: n; t9 ~) z2 }: b
  53.         }2 h$ V+ P5 X6 m7 d
  54.         if(Env.crc != Crc16_Modbus((uint8_t *)(&Env),sizeof(_env_base)-4))* B9 `' g+ k) |
  55.         {# L# ?$ Y; z* _' [4 E$ [
  56.                 return -1;
    " y$ c7 J9 X2 K: {- Q
  57.         }# b6 |$ d% J" R0 G& G( ^" a
  58.         return 0;6 V) D' P7 Q# K- y
  59. }
    ) G2 h# e! n: O; y
  60. //初始化
    7 C. ^% m1 ~" x- ^8 s( T9 e+ j
  61. void initEnvironment()
    * }( T# d, q) N. G1 B7 d" j
  62. {3 E9 j1 K) s0 ]1 _# t, F
  63.         if(0!=readEnv())
    ' T# n! F) c6 _3 ]
  64.         {
    " k; i* A5 ^+ a9 z9 A7 |
  65.                 tmc2208_set_default();//一个配置组默认值3 V" T) J# _, t0 S+ b+ g9 S) n
  66.                 spin220_set_default();//另一个默认组默认值6 O5 ?1 t5 l3 T- f3 l/ a/ v
  67.                 saveEnv();
    * ^0 C7 P- `9 T  I' `1 z
  68.         }
    " h8 I% B' h5 A4 D& x6 b) W
  69.         else7 J# i, F6 h) e: F; }
  70.         {' E  N, e( Z1 z* v* u3 y
  71.                 //tmc2208_set_init();//针对配置计算运行时参数; _( B" F) X" k% G' g7 x8 ^
  72.                 //spin220_set_init();; t4 F0 V0 V2 Q3 U; y+ ]
  73.         }" U: W* h- k% B# @
  74. }
复制代码
一共三个函数 saveEnv() readEnv() initEnvironment(),更多时候用户在Env发生变化后且需要保存是调用saceEnv即可,注意flash擦写次数。
+ A/ W* V& M+ t0 D, z/ J8 oEnv.h- M2 k5 Y4 Z: d+ o. O
  1. #ifndef __ENV_H
    3 n, D6 F+ s$ L) B( T% J  U  q
  2. #define __ENV_H( G' K3 z/ H# `. q6 [9 T

  3. & ]8 y6 C/ U/ @2 ^, w7 M
  4. #include "stm32f0xx.h"
    # |, @! g  `& @4 h+ b+ ^7 Y( \
  5. #include "tmc2208.h"
    ! L- N  u* t8 ?: ]6 H- T7 u
  6. #include "spin220.h"  M7 i3 `+ l5 X) |( W& O8 ~
  7. ; \% v8 D# p- C/ u% ~; I. X; T
  8. #pragma pack(4)6 F) J8 e0 w& X% d5 ?. Z
  9. typedef struct{& b* D' [5 d5 m) a3 Z% v. S! o
  10.         uint8_t micro;( R" l1 J& @0 z
  11.         uint8_t fullStep_angle;
    * @$ Q* A& o8 ^* a4 U
  12.         uint16_t start_speed;: E8 R2 D' R" @, H# V8 W
  13.         uint16_t max_speed;* g8 ~1 ?1 D% @! a4 ]0 D' k+ |% V
  14.         uint16_t min_speed;
    3 z* _" a! e7 `3 e- [( O
  15.         uint16_t inc_distence;7 K, d; y4 p0 v2 D% h) Q2 e
  16.         uint16_t motor_max_current;
    # y7 R  L3 `* G& l5 c
  17.         uint16_t motor_resistance;
    / w* R$ E2 s1 `
  18.         6 @' S& e# |# N, n+ i$ t  o
  19.         ( A* E7 G+ M, n0 X0 g% ]! N
  20.         uint32_t pos;
    # W1 x( X8 p3 J5 o2 ~
  21.         uint32_t speed;
    $ r. b( ?* H3 Y& Y4 t: r
  22. }_tmc2208_set;. g1 z0 V8 o0 i0 o4 ]5 u

  23. . q0 S4 q7 d* ?# C  i
  24. typedef struct{
    . M4 a9 G+ X. g! ~, k' c
  25.         uint8_t micro;! Z# c: ?- R/ U+ v
  26.         uint8_t fullStep_angle;
      [6 S, g* }" Z
  27.         uint8_t grat;
    ! t2 P- G7 D4 I# C# e, q
  28.         - Q1 m' z' h' R1 Z) [8 c
  29.         uint16_t start_speed;; |- O6 R- [, N* w
  30.         uint16_t max_speed;! f' A7 O4 {; G
  31.         uint16_t min_speed;; q, w% d  i) n1 g- j4 j7 U
  32.         uint16_t inc_distence;# E; R9 C4 @" m5 s. ^  k
  33.         BitAction max_io_value;& G+ H3 g; M' X
  34.        
    9 t3 z' G# Y! y# Y0 v1 U, s
  35.         uint32_t pos;
    3 n) q2 R9 n( \. k" I0 @! q) J* O8 _3 q
  36.         uint32_t speed;4 n0 Z' t9 f: z+ O: v
  37.         3 C" ~: Z3 c3 K! }) E
  38.         int run_F0;
    - e6 W' @( |. C: [7 U) V# Z' J  {1 ^+ e
  39.         int run6_max;
    7 z) `" D! T, @% ~
  40.         int run6_min;
    7 o9 A8 h$ D" A# y
  41. }_spin220_set;
    3 t0 n0 I! b9 a1 R' {' x
  42. ) O- x1 Q! \0 i
  43. 0 X% |# v' e6 e( P

  44. 0 ^/ E, Q/ X: c$ P" r

  45. / A; A3 {8 U; L8 F
  46. typedef struct{- a, M/ z1 p) G0 c
  47.    _tmc2208_set tmc2208;4 }* A# s) q6 i. w4 q
  48.    _spin220_set spin220;
    3 B0 {9 |1 U, Q, k, I/ U
  49.    uint16_t crc;
    - p; {: d& i: x( m; P
  50. }_env_base;
    % m4 h4 A  K/ o+ U* r
  51. #pragma pack()* P4 q7 ~" S0 M/ X' @7 ]

  52. ) v( f9 ]4 Y  m, t$ C% T+ t
  53. extern _env_base Env;
    , c9 [; C: D. H* h: }
  54. void initEnvironment(void);4 V- n) |9 k. Y! C! P+ Y6 p6 i+ l
  55. int saveEnv(void);" T$ E7 x1 |  ~* r3 A3 d- z
  56. #endif
复制代码
这里只举了两个例子,有新的需要保存的参数直接添加修改 struct即可,同时在对应的xxx_set_default()添加默认值即可
! K3 M) r5 \5 N0 {8 A+ J, n

  1. 7 H7 X- i) u3 G5 e) i
  2. void spin220_set_default()
    ( `9 H) X7 `2 g1 O  b) ~/ h
  3. {$ d: Z$ l' N. J+ x
  4.         Env.spin220.micro = 16;* d0 }2 Y9 [( N. i
  5.         Env.spin220.fullStep_angle = 18;
    2 O& I' D5 j6 T' i( `4 X; I
  6.         Env.spin220.inc_distence = 2;3 r" W: K& b, C9 T$ ?
  7.         Env.spin220.start_speed = 60;//: S# c- G" }$ [, A$ e1 y0 n
  8.        
      }2 G7 n0 _+ k8 [1 r0 K
  9.         Env.spin220.max_speed = 4000;
    ; I' p$ y7 j; t: P7 [! _
  10.         Env.spin220.min_speed = 60;7 A# y; N( O2 O0 M2 C
  11.           p( N2 T# I3 F6 `: O
  12.         Env.spin220.max_io_value = Bit_RESET;" F  D) \" l, ?& f# z# f( K5 R2 t
  13.         8 P$ z% L" ^4 {' Y; ^1 W
  14.         Env.spin220.pos = 7200;
    . P7 i: u$ f" H5 t" v4 O8 {
  15.         Env.spin220.speed = 4000;! ]5 N7 F# V, I/ W1 W
  16.        
    / \" V* I0 c- t% f( R
  17.         Env.spin220.grat = 0;
    4 @+ g1 s1 t' Z$ c, m  h
  18.         - h  ?: S3 L& M; v! Y. K$ D9 H7 N
  19.         Env.spin220.run_F0 = 16;2 ^  e7 O+ D7 K4 J# ?
  20.        
    2 o3 G# N" Z6 w+ t
  21.         Env.spin220.run6_max = 0;
    2 \6 w* B+ ~6 \( Y
  22.         Env.spin220.run6_min = 16;. H9 ^; a; B! G$ y" U
  23.        
    , N3 T: d7 P6 U/ w- y% e0 y. J6 |! |
  24.         spin220_set_init();, p$ W. @' B3 k' l; R$ N0 ~3 X
  25. }
复制代码
至于xxx_set_init()根据实际需要了
* }* \6 }! b5 p6 X* i/ S! i
) W5 p/ d6 P$ S8 U: i+ o5 c; L
* K& G  k2 ]( h) i  O; Y
; c- B. O/ h# h; J- F' z& g5 j% G, _$ d
5 @7 T6 c3 ]4 x; m; C3 q# k
收藏 评论0 发布时间:2020-1-15 11:55

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版