motorcontroldemo_028/Vinclude/V_UserMemory.h
2019-07-29 08:18:57 +03:00

163 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
\file V_UserMemory.h
\brief Работа с энергонезависимой памятью 1921BK028 (см. TUserMemory)
\author ООО "НПФ Вектор". http://motorcontrol.ru
\version v 2.0 20/03/2019
\defgroup V_UserMemory Работа с энергонезависимой памятью (см. TUserMemory)
@{
*/
#ifndef V_USERMEMORY_H
#define V_USERMEMORY_H
#include "DSP.h"
#ifdef __cplusplus
extern "C" {
#endif
/*! \class TUserMemory
\brief Работа с пользовательской энергонезависимой памятью МС01
Класс \a TUserMemory, основанный на структуре TUserMemory, представляет собой драйвер для работы с
flash памятью.\n
пример использования:\n
для инициализации\n
spimem.init.(&spimem);\n
для записи\n
UserMem.spiaddr=0;\n
UserMem.startaddr=buff;\n
UserMem.data_length=1000;\n
UserMem.write(&spimem);\n
*/
//! см. TUserMemory
//Пользовательскую память не рекомендуется размешать в той же области, где находится основная программа.
//Так как, если исполняться из BFlash и подать команду записи/стирания NVR ячейки той же BFlash, то произойдет приостановка
//работы ядра на время записи/стирания. Потому что это один физический блок, и он может работать только либо с основным
//массивом flash или с массивом NVR flash
//#define NVR_MAIN_FLASH //размещать пользовательские данные в NVR основной памяти
#define NVR_BOOT_FLASH //размещать пользовательские данные в NVR загрузочной памяти
#define USERMEMORY_USERFLASH_KEY 0xC0DE0100 // Ключ 0xC0DE0000 + бит NVRON
#define USERMEMORY_MAX_WAITCLOCKS 2000000L
#define USERMEMORY_WRITE_HARDFAULT 0x1
#define USERMEMORY_WRITE_TIMEOUT 0x2
#define USERMEMORY_READ_HARDFAULT 0x3
#define USERMEMORY_READ_TIMEOUT 0x4
#define USERMEMORY_OP_OK 0x0
#ifdef NVR_MAIN_FLASH
#define USERMEMORY_PAGE_SIZE MEM_MFLASH_PAGE_SIZE
#define NVRFLASH MFLASH
#define NUMBER_OF_BYTE_ON_PAGE 64
#define NUMBER_OF_32BIT_WORDS_AT_ONCE 16
#define PAGE_SIZE_LOG2 MEM_MFLASH_PAGE_SIZE_LOG2
#endif
#ifdef NVR_BOOT_FLASH
#define USERMEMORY_PAGE_SIZE MEM_BFLASH_PAGE_SIZE
#define NVRFLASH BFLASH
#define NUMBER_OF_BYTE_ON_PAGE 16
#define NUMBER_OF_32BIT_WORDS_AT_ONCE 4
#define PAGE_SIZE_LOG2 MEM_BFLASH_PAGE_SIZE_LOG2
#endif
#define USERMEMORY_CMD_READ (1<<0)
#define USERMEMORY_CMD_WRITE (1<<1)
#define USERMEMORY_CMD_PAGE_ERASE (1<<2)
#define USERMEMORY_CMD_FULL_ERASE (3<<2) // бит ERASESEC + бит ALLSEC
#define USERMEMORY_NVRON_BIT (1 << 8)
struct SUserMemory {
Uint16 MemStartAddr; //!Адрес на flash
Uint8 *MCUStartAddr8; //!адрес на массив с данными как байтовый указатель
Uint16 *MCUStartAddr; //!адрес на массив с данными
Uint16 data_length; //!длина данных
int16 receivedCode; //!Статус операции
Uint32 waitClocks; //!Счетчик для ожидания таймаута операции
Uint16 PageInCache; //!Номер текущей закешированной страницы
Uint16 autoFlushCounter; //!Счетчик для сохранения кеша на флеш по таймауту
Uint8 PageRAM_and_FLASH_IdenticalFlag; //!Флаг о том, что данные в кеше и на флеше идентичны
Uint8 NeedFlushRequest; //флаг запроса на запись данных из кеша на флеш
Uint8 cacheArr[USERMEMORY_PAGE_SIZE]; //кеш данных - одна страница памяти
void (*init)(struct SUserMemory*);
void (*write)(struct SUserMemory*);
void (*read)(struct SUserMemory*);
void (*full_erase)(struct SUserMemory*);
void (*flush)(struct SUserMemory*);
void (*ms_calc)(struct SUserMemory*);
void (*slow_calc)(struct SUserMemory*);
};
typedef struct SUserMemory TUserMemory;
//!Инициализатор по умолчанию
#define USERMEMORY_DEFAULTS {\
.init = USERMEMORY_Init, \
.write = USERMEMORY_Write,\
.read = USERMEMORY_Read,\
.full_erase = USERMEMORY_Full_Erase,\
.flush = USERMEMORY_Flush,\
.ms_calc = USERMEMORY_ms_calc,\
.slow_calc = USERMEMORY_slow_calc,\
}
//! \memberof TUserMemory
void USERMEMORY_Init(TUserMemory*);
//! \memberof TUserMemory
void USERMEMORY_Write(TUserMemory*);
//! \memberof TUserMemory
void USERMEMORY_Read(TUserMemory*);
//! \memberof TUserMemory
void USERMEMORY_Full_Erase(TUserMemory*);
//! \memberof TUserMemory
void USERMEMORY_ReadToCache(TUserMemory *p, int16 pageNum);
//! \memberof TUserMemory
void USERMEMORY_WriteFromCache(TUserMemory *p, int16 pageNum);
//! \memberof TUserMemory
void USERMEMORY_Flush(TUserMemory *p);
//! \memberof TUserMemory
void USERMEMORY_ms_calc(TUserMemory *p);
//! \memberof TUserMemory
void USERMEMORY_slow_calc(TUserMemory *p);
//! \memberof TUserMemory
void USERMEMORY_UpdateCurrentPage(TUserMemory *p, Uint16 spiaddr);
#ifdef __cplusplus
}
#endif
#endif
/*@}*/