реклама на сайте
подробности

 
 
> Запись данных во Flash Sam7s256
Spoofing
сообщение Jun 21 2009, 17:55
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 21-06-09
Пользователь №: 50 508



Доброго времени суток.
Помогите решить такую проблему. Не могу разобраться как записать данные во флеш. Функционал - прием данных с USART запись в постоянную память, выдача по требованию. Все прекрасно работает с RAM - данные получаются и выдаются, но естественно сброс по питанию все обнуляет. С помошью SAM-BA залил прошивку, все работает из флеши и выполняется в RAM но как записывать пользовательские данные?
Судя по даташиту необходимо поместить данные в буфер-защелку, после чего запись команд в регистр EFC для операции со страницей №такой то. Где этот буфер определяется? по регистрам не нашел.

Второй вопрос как определить где закончится программа - с какого момента можно будет записать данные (флеш с 0х00100000 без ремапа начинается)
Не бейте сильно в электронике почти полный нуб) пока освоил инициализацию, прерывания и com
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sanya_kv
сообщение Jun 24 2009, 18:04
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 25-02-09
Из: Россия
Пользователь №: 45 369



Не мучийся вот:
CODE
//*----------------------------------------------------------------------------
//* ATMEL Microcontroller Software Support - ROUSSET -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name : Flash.c
//* Object : Flash routine
//* Creation : JPP 30/Jun/2004
//* Modif : JPM 16/Nov/2004 Flash write status
//*----------------------------------------------------------------------------

// Include Standard files
#include <hardware.h>
#include <flash.h>

#define false 0
#define true 1

//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Init
//* \brief Flash init
//*----------------------------------------------------------------------------
void AT91F_Flash_Init (void)
{
//* Set number of Flash Waite sate
// SAM7S64 features Single Cycle Access at Up to 30 MHz
// if MCK = 47923200, 50 Cycles for 1 µseconde ( field MC_FMR->FMCN)
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_1FWS;
}

//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Ready
//* \brief Wait the flash ready
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Ready (void)
{
unsigned int status;
status = 0;

//* Wait the end of command
while ((status & AT91C_MC_FRDY) != AT91C_MC_FRDY )
{
status = AT91C_BASE_MC->MC_FSR;
}
return status;
}

//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Lock_Status
//* \brief Get the Lock bits field status
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Lock_Status(void)
{
return (AT91C_BASE_MC->MC_FSR & AT91C_MC_FSR_LOCK);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Lock
//* \brief Write the lock bit and set at 0 FSR Bit = 1
//* \input page number (0-1023)
//* \output Region
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Lock (unsigned int Flash_Lock_Page)
{
//* set the Flash controller base address
AT91PS_MC ptMC = AT91C_BASE_MC;

//* write the flash
//* Write the Set Lock Bit command
ptMC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_LOCK | (AT91C_MC_PAGEN & (Flash_Lock_Page << 8) );

//* Wait the end of command
AT91F_Flash_Ready();

return (AT91F_Flash_Lock_Status());
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Unlock
//* \brief Clear the lock bit and set at 1 FSR bit=0
//* \input page number (0-1023)
//* \output Region
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Unlock(unsigned int Flash_Lock_Page)
{
//* Write the Clear Lock Bit command
AT91C_BASE_MC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_UNLOCK | (AT91C_MC_PAGEN &
(Flash_Lock_Page << 8) );

//* Wait the end of command
AT91F_Flash_Ready();

return (AT91F_Flash_Lock_Status());
}

//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Check_Erase
//* \brief Check the memory at 0xFF in 32 bits access
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Check_Erase (unsigned int * start, unsigned int size)
{
unsigned int i;
//* Check if flash is erased
for (i=0; i < (size/4); i++ )
{
if ( start[i] != ERASE_VALUE ) return false;
}
return true;
}

//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Erase_All
//* \brief Send command erase all flash
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Erase_All(void)
{
//* set the Flash controller base address
AT91PS_MC ptMC = AT91C_BASE_MC;
//* Write the Erase All command
ptMC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_ERASE_ALL;
//* Wait the end of command
AT91F_Flash_Ready();
//* Check the result
return ( (ptMC->MC_FSR & ( AT91C_MC_PROGE | AT91C_MC_LOCKE ))==0);
}

//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Write
//* \brief Write in one Flash page located in AT91C_IFLASH, size in 32 bits
//* \input Flash_Address: start at 0x0010 0000 size: in byte
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Write( unsigned int Flash_Address ,int size ,unsigned int * buff)
{
//* set the Flash controller base address
AT91PS_MC ptMC = AT91C_BASE_MC;
unsigned int i, page, status;
unsigned int * Flash;
//* init flash pointer
Flash = (unsigned int *) Flash_Address;
//* Get the Flash page number
page = ((Flash_Address - (unsigned int)AT91C_IFLASH ) /FLASH_PAGE_SIZE_BYTE);
//* copy the new value
for (i=0; (i < FLASH_PAGE_SIZE_BYTE) & (size > 0);i++, Flash++,buff++,size-=4 ){
//* copy the flash to the write buffer ensuring code generation
*Flash=*buff;
}
//* Write the write page command
ptMC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_START_PROG | (AT91C_MC_PAGEN & (page <<8));
//* Wait the end of command
status = AT91F_Flash_Ready();
//* Check the result
if ( (status & ( AT91C_MC_PROGE | AT91C_MC_LOCKE ))!=0) return false;
return true;
}

//*----------------------------------------------------------------------------
//* \fn AT91F_Flash_Write
//* \brief Write in one Flash page located in AT91C_IFLASH, size in byte
//* \input Start address (base=AT91C_IFLASH) size (in byte ) and buff address
//*----------------------------------------------------------------------------
__ramfunc int AT91F_Flash_Write_all( unsigned int Flash_Address ,int size ,unsigned int * buff)
{

int next, status;
unsigned int dest;
unsigned int * src;

dest = Flash_Address;
src = buff;
status = true;

while( (status == true) & (size > 0) )
{
//* Check the size
if (size <= FLASH_PAGE_SIZE_BYTE) next = size;
else next = FLASH_PAGE_SIZE_BYTE;

//* Unlock current sector base address - current address by sector size
AT91F_Flash_Unlock((dest - (unsigned int)AT91C_IFLASH ) /FLASH_PAGE_SIZE_BYTE);

//* Write page and get status
status = AT91F_Flash_Write( dest ,next ,src);
// * get next page param
size -= next;
src += FLASH_PAGE_SIZE_BYTE/4;
dest += FLASH_PAGE_SIZE_BYTE;
}
return status;
}

//*----------------------------------------------------------------------------
//* \fn AT91F_NVM_Status
//* \brief Get the NVM field status
//*----------------------------------------------------------------------------
__ramfunc int AT91F_NVM_Status(void)
{
return (AT91C_BASE_MC->MC_FSR & AT91C_MC_FSR_MVM);
}

//*----------------------------------------------------------------------------
//* \fn AT91F_NVM_Set
//* \brief Write the Non Volatile Memory Bits and set at 0 FSR Bit = 1
//*----------------------------------------------------------------------------
__ramfunc int AT91F_NVM_Set (unsigned char NVM_Number)
{
//* set the Flash controller base address
AT91PS_MC ptMC = AT91C_BASE_MC;

//* write the flash
//* Write the Set NVM Bit command
ptMC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_SET_GP_NVM | (AT91C_MC_PAGEN & (NVM_Number << 8)
);

//* Wait the end of command
AT91F_Flash_Ready();
return (AT91F_NVM_Status());
}
//*----------------------------------------------------------------------------
//* \fn AT91F_NVM_Clear
//* \brief Clear the Non Volatile Memory Bits and set at 1 FSR bit=0
//*----------------------------------------------------------------------------
__ramfunc int AT91F_NVM_Clear(unsigned char NVM_Number)
{
//* set the Flash controller base address
AT91PS_MC ptMC = AT91C_BASE_MC;

//* write the flash
//* Write the Clear NVM Bit command
ptMC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_CLR_GP_NVM | (AT91C_MC_PAGEN & (NVM_Number << 8)
);

//* Wait the end of command
AT91F_Flash_Ready();

return (AT91F_NVM_Status());
}

//*----------------------------------------------------------------------------
//* \fn AT91F_SET_Security_Status
//* \brief Get Flash Security Bit Status
//*----------------------------------------------------------------------------
int AT91F_SET_Security_Status (void)
{
return (AT91C_BASE_MC->MC_FSR & AT91C_MC_SECURITY);
}

//*----------------------------------------------------------------------------
//* \fn AT91F_SET_Security
//* \brief Set Flash Security Bit
//*----------------------------------------------------------------------------
int AT91F_SET_Security (void)
{
//* write the flash
//* Write the Set Security Bit command
AT91C_BASE_MC->MC_FCR = ( AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_SET_SECURITY );

//* Wait the end of command
AT91F_Flash_Ready();

return (AT91F_SET_Security_Status());
}


//*----------------------------------------------------------------------------
//* ATMEL Microcontroller Software Support - ROUSSET -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name : Flash.h
//* Object : Flash constan description
//* Creation : JPP 30/Jun/2004
//*
//*----------------------------------------------------------------------------

#ifndef Flash_h
#define Flash_h

/*-------------------------------*/
/* Flash Status Field Definition */
/*-------------------------------*/

#define AT91C_MC_FSR_MVM ((unsigned int) 0xFF << 8) // (MC) Status Register GPNVMx: General-purpose NVM
Bit Status
#define AT91C_MC_FSR_LOCK ((unsigned int) 0xFFFF << 16) // (MC) Status Register LOCKSx: Lock Region x
Lock Status

#define ERASE_VALUE 0xFFFFFFFF

/*-----------------------*/
/* Flash size Definition */
/*-----------------------*/
/* 64 Kbytes of Internal High-speed Flash, Organized in 512 Pages of 128 Bytes */

#define FLASH_PAGE_SIZE_BYTE 256
#define FLASH_PAGE_SIZE_LONG 32

#define FLASH_LOCK_BITS_SECTOR 16
#define FLASH_SECTOR_PAGE 32
#define FLASH_LOCK_BITS 16 /* 16 lock bits, each protecting 16 sectors of 32 pages*/
#define FLASH_BASE_ADDRESS 0x00100000
/*------------------------------*/
/* External function Definition */
/*------------------------------*/

/* Flash function */
extern void AT91F_Flash_Init(void);
extern int AT91F_Flash_Check_Erase(unsigned int * start, unsigned int size);
extern int AT91F_Flash_Erase_All(void);
extern int AT91F_Flash_Write( unsigned int Flash_Address ,int size ,unsigned int * buff);
extern int AT91F_Flash_Write_all( unsigned int Flash_Address ,int size ,unsigned int * buff);

/* Lock Bits functions */
extern int AT91F_Flash_Lock_Status(void);
extern int AT91F_Flash_Lock (unsigned int Flash_Lock);
extern int AT91F_Flash_Unlock(unsigned int Flash_Lock);

/* NVM bits functions */
extern int AT91F_NVM_Status(void);
extern int AT91F_NVM_Set (unsigned char NVM_Number);
extern int AT91F_NVM_Clear(unsigned char NVM_Number);

/* Security bit function */
extern int AT91F_SET_Security_Status (void);
extern int AT91F_SET_Security (void);

#endif /* Flash_h */
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 24 2009, 18:46
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Sanya_kv @ Jun 24 2009, 21:04) *
Не мучийся вот:
krapula.gif А самому сравнить, сколько этот "писанный левой ногой" код отъедает ОЗУ по сравнению с кодом, приведенном aaarrr в сообщении №9? Тут не мучаться, тут прослезиться нужно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Spoofing   Запись данных во Flash Sam7s256   Jun 21 2009, 17:55
- - singlskv   Цитата(Spoofing @ Jun 21 2009, 21:55) Суд...   Jun 22 2009, 21:58
- - Spoofing   Возможности проверить на железке дома нет. Но врод...   Jun 23 2009, 15:44
- - aaarrr   Не забудьте в MC_FMR записать корректные значения....   Jun 23 2009, 15:54
- - Spoofing   Кодp_pMC->MC_FMR = 0x24<<16; во время ...   Jun 23 2009, 17:40
|- - aaarrr   Цитата(Spoofing @ Jun 23 2009, 21:40) Код...   Jun 23 2009, 18:10
- - Spoofing   ЦитатаПонятно, на 24МГц работаете? пока на отладоч...   Jun 23 2009, 19:21
- - Spoofing   При прогоне на плате возникли такие проблемы: Есл...   Jun 24 2009, 15:20
- - aaarrr   Писать флеш можно только выполняя программу из RAM...   Jun 24 2009, 15:23
- - Spoofing   Для выполнения функции из RAM достаточно добавить ...   Jun 24 2009, 15:47
- - aaarrr   А это смотрите в хелпе на конкретный компилятор. У...   Jun 24 2009, 15:57
|- - aaarrr   Цитата(Sanya_kv @ Jun 24 2009, 22:04) Не ...   Jun 24 2009, 18:14
||- - Sanya_kv   Цитата(aaarrr @ Jun 24 2009, 22:14) Да-да...   Jun 25 2009, 08:09
||- - Сергей Борщ   Цитата(Sanya_kv @ Jun 25 2009, 11:09) Вни...   Jun 25 2009, 09:57
- - Spoofing   А смысл от этого монумента если большая часть не н...   Jun 24 2009, 20:04
- - Sanya_kv   Вы абсолютно правы, хочу лишь немного Вас поправит...   Jun 25 2009, 10:32
|- - Сергей Борщ   Цитата(Sanya_kv @ Jun 25 2009, 13:32) Но ...   Jun 25 2009, 12:42
|- - Sanya_kv   Цитата(Сергей Борщ @ Jun 25 2009, 16:42) ...   Jun 25 2009, 12:59
- - Spoofing   Спасибо всем за развернутые листинги. Использую Ke...   Jun 25 2009, 15:08
- - aaarrr   ИМХО, лучше функцию записи обрамить: Код#pragma ar...   Jun 25 2009, 15:13


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 01:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016