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

在nanoFramework中访问STM32备份寄存器

[复制链接]
木木&点点 发布时间:2018-11-19 21:48
1 m% p9 x' P. ?) T: t. _
在STM32的硬件条件下,很容易实现Stm32库的保存和读取Stm32备份寄存器。如果您需要在重新引导之间持久保存数据,那简直就是为你设计的。
1.jpg 8 @9 S. N1 t/ s
5 T. y. j+ j7 \$ I: W

3 ?3 i. C- H- f9 T0 V3 l
项目中使用的东西
- z" v! z, j7 {6 N0 h
硬件组件:
8 E" T/ Z" V( ~: k6 P
         STMicroelectronicsSTM32 Nucleo-144 Boards    *1;

) T# R9 w" L) J8 D7 N. J/ @- N
         nanoFramework VisualStudio extension
5 {# N. b: ?$ f% ]" n/ L' T
背景
8 F. B& @4 n1 W' i' d9 G4 r
有时候你的应用需要在重启之间保存数据。只是简单的数据收集。添加一个外部EEPROM并不是你想要做的事情。一堆额外的复杂,布线,更多的代码,板的真实状态和(如果这是一个商业项目)更多的成本到BOM。

' S9 y" n8 O+ q# t9 G+ g* d1 p
STM32 SoC有一个被称为备份内存的RAM区域,它由RTC电源插头供电,可以在重启后继续工作。这是一个完美的工具。

8 `* o! O' `3 Y% t9 w, s
nanoFramework.Hardware。Stm32类库抽象了使用此内存所需的所有配置和复杂性。您只需将需要保存的值(支持许多本机类型,因此您应该找到所需的类型)扔给它即可。如果你已经将电源连接到Vbatt pin,那就是。
; X7 ^- ?) @, I1 ]! E
当需要时,返回到API并读取这些值。
9 b6 G% M: f% L) W$ n: y4 D
代码:

- P9 ~! V3 d5 c$ a
示例应用程序写入STM32备份内存并读取
( U' G2 i/ b" }+ b
using System;
. t1 x' G1 a* [
using System.Threading;

* t' P9 G# q* G1 I. H1 \2 `
using nanoFramework.Hardware.Stm32;

" s. ~+ s1 z, X% o: A) R- Z+ U
! V# ^, I9 n. m. z
namespace Stm32BackupMemory.TestApp

/ Q( ?5 [. {9 k* j8 U
{

; d$ |6 D/ }- a0 r$ `9 }
    public class Program

4 t2 w1 u8 u8 i0 d
    {
3 @' e  y3 D6 Q7 R5 b2 Z  p- t- R
        public static voidMain()
$ u! a7 [9 p% R( o# \+ i
        {

9 d/ c% L5 ^  T6 J7 r9 x
           Console.WriteLine($"The backup memory has {BackupMemory.Size}bytes.");
* w. n, y. O9 D! g
, M4 B/ G9 k) f+ N. @6 @0 H
            // write a bytearray
5 i& `( x: ~, o9 w0 H1 k
            uinttestBufferPosition = 5;
& f4 I! X: W1 {/ m9 Y
8 @: R3 A: q7 I6 r' g3 ?% `
            byte[] testBuffer= new byte[] { 0xFA, 0xCE, 0xBE, 0xEF, 0xFA, 0xCE, 0xBE, 0xEF };

, U. s" j4 @, }; [8 r1 U6 `  s
           BackupMemory.WriteBytes(testBufferPosition, testBuffer);
7 T  K1 A# A4 a) m/ g$ v

1 @# Z# X3 ?0 u; @: D' u/ o
            // read back thebyte array
6 a3 D+ L3 H+ A# c
            byte[]readBackBuffer = new byte[testBuffer.Length];
. u0 J! X+ d8 F4 F2 V8 `! ]* l
           BackupMemory.ReadBytes(testBufferPosition, readBackBuffer);

' k, g3 h1 H" d

9 Y4 Z% u- E# T8 s- i
           if(readBackBuffer.GetHashCode() != testBuffer.GetHashCode())
9 X% v3 M( G  j/ \9 ~
            {
5 d6 H! h/ X8 B6 `0 W! E
               Console.WriteLine("Array read from backup memory is different thanwhat was written.");
" M" j; _$ W! O6 C4 _8 c  I7 L) }
            }

* Q3 ~" R4 i# m, z3 ~
            else

, ?  E( e/ k: d8 K: M( ?
            {
6 C4 `* {8 n, p
               Console.WriteLine("Buffer comparison check!");

0 ~" a; M+ Z( J5 B" B% G  i
            }
( h0 p; h/ I. R) F

# M5 U. E, E! r- v! {
            // write an Int64
: \4 j4 {8 o- o2 W) m+ k' {' _5 U
            uinttestInt64Position = 15;
4 e( M( v4 ^( N9 J3 M9 I

) ?! _$ D9 G$ Q
            Int64 testInt64 =9876543210;

, g6 F' M! p1 C' f$ G
           BackupMemory.WriteInt64(testInt64Position, testInt64);

  n' n1 g. x3 q5 H
  ^, ~4 n1 o4 Q; u
            if(BackupMemory.ReadInt64(testInt64Position) != testInt64)
  C, U; d4 Y; x" b5 w8 d
            {

3 F( ?; z3 Y: {% h2 T
               Console.WriteLine("Int64 read from backup memory is different thanwhat was written.");

1 Y6 z3 H0 j& D: j" ~  K$ H
            }

! w# v1 ^! J$ {% \
            else
2 Z  N' l5 i# q8 W, ~
            {
/ c: m6 s. U8 q0 m
               Console.WriteLine("Int64 comparison check!");

5 @: G" _8 E. a9 H. A% k4 o% G
            }
/ n9 |' y# b6 ~2 z  v5 v$ V' R0 H

3 f/ H8 X; V# v% j* P, D- E. E$ V
           Thread.Sleep(Timeout.Infinite);

9 L+ X# Q9 X5 ~- ^, Y+ [
        }

7 u) u- j8 y8 |2 v+ y- X
    }

/ \7 e$ ?- N) k- g+ |1 O
}
8 \- x4 |/ U9 D) [; H! a+ S

/ Y- @% }: J2 y
赞 收藏 评论0 发布时间:2018-11-19 21:48

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版