|
Запись данных во Flash Sam7s256 |
|
|
|
Jun 21 2009, 17:55
|
Группа: Участник
Сообщений: 11
Регистрация: 21-06-09
Пользователь №: 50 508

|
Доброго времени суток. Помогите решить такую проблему. Не могу разобраться как записать данные во флеш. Функционал - прием данных с USART запись в постоянную память, выдача по требованию. Все прекрасно работает с RAM - данные получаются и выдаются, но естественно сброс по питанию все обнуляет. С помошью SAM-BA залил прошивку, все работает из флеши и выполняется в RAM но как записывать пользовательские данные? Судя по даташиту необходимо поместить данные в буфер-защелку, после чего запись команд в регистр EFC для операции со страницей №такой то. Где этот буфер определяется? по регистрам не нашел.
Второй вопрос как определить где закончится программа - с какого момента можно будет записать данные (флеш с 0х00100000 без ремапа начинается) Не бейте сильно в электронике почти полный нуб) пока освоил инициализацию, прерывания и com
|
|
|
|
|
 |
Ответов
|
Jun 24 2009, 18:04
|

Частый гость
 
Группа: Свой
Сообщений: 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 Правил форума.
|
|
|
|
Сообщений в этой теме
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 Сергей Борщ Цитата(Sanya_kv @ Jun 24 2009, 21:04) Не ... Jun 24 2009, 18:46 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|