163 lines
5.2 KiB
C
163 lines
5.2 KiB
C
/*!
|
||
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
|
||
|
||
/*@}*/
|
||
|
||
|
||
|
||
|