Flash Memory Library
This library provides routines for accessing microcontroller's (internal) Flash memory.
Library Routines
Stellaris Specific Routines
ST Specific Routines
- FLASH_Unlock
- FLASH_Unlock_Banks
- FLASH_Unlock_Bank1
- FLASH_Unlock_Bank2
- FLASH_Lock
- FLASH_Lock_Banks
- FLASH_Lock_Bank1
- FLASH_Lock_Bank2
- FLASH_EraseSector
- FLASH_EraseAllSectors
- FLASH_ErasePage
- FLASH_EraseAllPages
- FLASH_EraseAllBank1Pages
- FLASH_EraseAllBank2Pages
- FLASH_Write_DoubleWord
- FLASH_Write_Word
- FLASH_Write_HalfWord
- FLASH_Write_Byte
- FLASH_AddressToSector
- FLASH_SectorSize
Flash_Write
Prototype |
long Flash_Write(unsigned long address, unsigned long lData); |
---|---|
Description |
This function will program one words into the on-chip flash. Each word in a page of Flash can only be programmed one time between an erase of that page;
Since the flash is programmed one word at a time, the starting address and byte count must both be multiples of four.
|
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
unsigned long Address = 0xC00; Flash_Write(Address, 0xAAAAAAAA); // write one word |
Notes |
None. |
Flash_Write_Buffer
Prototype |
long Flash_Write_Buffer(unsigned long address, void *pData); |
---|---|
Description |
This function will program a sequence of words into the on-chip flash. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
unsigned long Address = 0xC00; unsigned long buff[32]; Flash_Write_Buffer(Address, buff); // write buffer with 32 long words |
Notes |
This function is available only for MCUs that support buffered writing operation. |
Flash_Erase_Block
Prototype |
long Flash_Erase_Block(unsigned long address); |
---|---|
Description |
This function will erase a 1 kB block of the on-chip Flash. After erasing, the block is filled with 0xFF bytes. Read-only and execute-only blocks cannot be erased.
|
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
unsigned long Address = 0xC00; Flash_Erase_Block(Address); // erase block (Address must be 1024 byte aligned) |
Notes |
Address should be 1024 byte aligned or else unpredictable behavior can occur. |
Flash_Set_uSec
Prototype |
void Flash_Set_uSec(unsigned long clocks); |
---|---|
Description |
This function is used to tell the Flash controller the number of processor clocks per micro-second. |
Parameters |
|
Returns |
Nothing. |
Requires |
Nothing. |
Example |
Flash_Set_uSec(80); // If 80 MHz is used as a processor clock |
Notes |
This value must be programmed correctly or the Flash most likely will not program correctly; it has no affect on reading |
FLASH_Unlock
Prototype |
void FLASH_Unlock(); |
---|---|
Description |
This routine will unlock the FLASH control register access. This routine is valid only for ST devices. |
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_Unlock(); |
Notes |
This routine is valid only for ST devices. |
FLASH_Unlock_Banks
Prototype |
void FLASH_Unlock_Banks(); |
---|---|
Description |
This routine will unlock the FLASH Program Erase Controller. This routine is valid only for STM32F10x devices :
|
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_Unlock_Banks(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_Unlock_Bank1
Prototype |
void FLASH_Unlock_Bank1(); |
---|---|
Description |
This routine will unlock the FLASH Bank1 Program Erase Controller. This routine is valid only for STM32F10x devices :
|
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_Unlock_Bank1(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_Unlock_Bank2
Prototype |
void FLASH_Unlock_Bank2(); |
---|---|
Description |
This routine will unlock the FLASH Bank2 Program Erase Controller. This routine is valid only for STM32F10x devices :
|
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_Unlock_Bank2(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_lock
Prototype |
void FLASH_lock(); |
---|---|
Description |
This routine will lock the FLASH control register access. This routine is valid only for ST devices. |
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_lock(); |
Notes |
This routine is valid only for ST devices. |
FLASH_Lock_Banks
Prototype |
void FLASH_Lock_Banks(); |
---|---|
Description |
This routine will Lock the FLASH Program Erase Controller. This routine is valid only for STM32F10x devices :
|
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_Lock_Banks(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_Lock_Bank1
Prototype |
void FLASH_Lock_Bank1(); |
---|---|
Description |
This routine will lock the FLASH Bank1 Program Erase Controller. This routine is valid only for STM32F10x devices :
|
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_Lock_Bank1(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_Lock_Bank2
Prototype |
void FLASH_Lock_Bank2(); |
---|---|
Description |
This routine will lock the FLASH Bank2 Program Erase Controller. This routine is valid only for STM32F10x devices :
|
Parameters |
None. |
Returns |
Nothing. |
Requires |
Nothing. |
Example |
FLASH_Lock_Bank2(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_EraseSector
Prototype |
unsigned long FLASH_EraseSector(unsigned long FLASH_Sector); |
||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Description |
This routine will erases a specified FLASH Sector. This routine is valid only for ST devices. |
||||||||||||||||||||||||||
Parameters |
|
||||||||||||||||||||||||||
Returns |
|
||||||||||||||||||||||||||
Requires |
Nothing. |
||||||||||||||||||||||||||
Example |
// Delete FLASH sector 1 status = FLASH_EraseSector(FLASH_Sector_1); |
||||||||||||||||||||||||||
Notes |
This routine is valid only for ST devices. |
FLASH_ErasePage
Prototype |
unsigned long FLASH_ErasePage(unsigned long Address); |
---|---|
Description |
This routine will erases a specified FLASH memory page. This routine is valid only for STM32F10x devices. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_ErasePage(address); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_EraseAllPages
Prototype |
unsigned long FLASH_EraseAllPages(); |
---|---|
Description |
This routine erases all FLASH memory pages. This routine is valid only for STM32F10x devices. |
Parameters |
None. |
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_EraseAllPages(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_EraseAllBank1Pages
Prototype |
unsigned long FLASH_EraseAllBank1Pages(); |
---|---|
Description |
This routine erases all Bank1 FLASH memory pagess. This routine is valid only for STM32F10x devices. :
|
Parameters |
None. |
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_EraseAllBank1Pages(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_EraseAllBank2Pages
Prototype |
unsigned long FLASH_EraseAllBank2Pages(); |
---|---|
Description |
This routine erases all Bank2 FLASH memory pagess. This routine is valid only for STM32F10x devices. :
|
Parameters |
None. |
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_EraseAllBank2Pages(); |
Notes |
This routine is valid only for STM32F10x devices. |
FLASH_EraseAllSectors
Prototype |
unsigned long FLASH_EraseAllSectors(); |
---|---|
Description |
This routine will erase all FLASH Sectors. This routine is valid only for ST devices. |
Parameters |
None. |
Returns |
|
Requires |
Nothing. |
Example |
// Delete all FLASH sectors status = FLASH_EraseAllSectors(); |
Notes |
This routine is valid only for ST devices. |
FLASH_Write_DoubleWord
Prototype |
unsigned long FLASH_Write_DoubleWord(unsigned long Address, uint64 ldata); |
---|---|
Description |
Programs a double word (64-bit) at a specified address. This routine is valid only for ST devices. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_Write_DoubleWord(0x08008000, data_); |
Notes |
This function must be used when the device voltage range is from 2.7V to 3.6V and an External Vpp is present. This routine is valid only for ST devices. |
FLASH_Write_Word
Prototype |
unsigned long FLASH_Write_Word(unsigned long Address, unsigned long lData); |
---|---|
Description |
Programs a word (32-bit) at a specified address. This routine is valid only for ST devices. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_Write_Word(0x08008000, data_); |
Notes |
This function must be used when the device voltage range is from 2.7V to 3.6V and an External Vpp is present. This routine is valid only for ST devices. |
FLASH_Write_HalfWord
Prototype |
unsigned long FLASH_Write_HalfWord(unsigned long Address, unsigned long lData); |
---|---|
Description |
Programs a half word (16-bit) at a specified address. This routine is valid only for ST devices. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_Write_HalfWord(0x08008000, data_); |
Notes |
This function must be used when the device voltage range is from 2.1V to 3.6V. This routine is valid only for ST devices. |
FLASH_Write_Byte
Prototype |
unsigned long FLASH_Write_Byte(unsigned long Address, unsigned char lData); |
---|---|
Description |
Programs a byte (8-bit) at a specified address. This routine is valid only for ST devices. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_Write_Byte(0x08008000, data_); |
Notes |
This function can be used within all the device supply voltage ranges. This routine is valid only for ST devices. |
FLASH_AddressToSector
Prototype |
long FLASH_AddressToSector(unsigned long Address); |
---|---|
Description |
This routine returns the FLASH sector number of the specifed address. This routine is valid only for STM32F2XX and STM32F4XX devices. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
status = FLASH_AddressToSector(0x08008000); |
Notes |
This routine is valid only for STM32F2XX and STM32F4XX devices. |
FLASH_SectorSize
Prototype |
long FLASH_SectorSize(unsigned long flash_sector); |
||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Description |
This routine returns the size of the specified FLASH sector number. This routine is valid only for STM32F2XX and STM32F4XX devices. |
||||||||||||||||||||||||||
Parameters |
|
||||||||||||||||||||||||||
Returns |
|
||||||||||||||||||||||||||
Requires |
Nothing. |
||||||||||||||||||||||||||
Example |
status = FLASH_SectorSize(_FLASH_SECTOR_0); |
||||||||||||||||||||||||||
Notes |
This routine is valid only for STM32F2XX and STM32F4XX devices. |
Library Example
Stellaris
unsigned long buff[32]; unsigned long i; unsigned long Address = 0xC00; unsigned long* ptr; void main() { GPIO_Digital_Output(&GPIO_PORTH, _GPIO_PINMASK_ALL); // digital output GPIO_PORTH GPIO_Digital_Output(&GPIO_PORTJ, _GPIO_PINMASK_ALL); // digital output GPIO_PORTJ for(i=0; i<32; i++) buff[i]=i+(i<<16); Flash_Erase_Block(Address); // erase block (Address must be 1024 byte aligned) Flash_Write_Buffer(Address, buff); // write buffer with 32 long words ptr = (unsigned long*)Address; for(i=0; i<32; i++) { GPIO_PORTH_DATA = *ptr; GPIO_PORTJ_DATA = *ptr >> 16; ptr++; Delay_ms(250); } Delay_ms(1000); Flash_Write(Address + 32*4, 0xAAAAAAAA); // write one word ptr = Address + 32*4; GPIO_PORTH_DATA = *ptr; GPIO_PORTJ_DATA = *ptr >> 16; }
STM32
#include <built_in.h> unsigned long buff[32]; unsigned long i, tmp; unsigned long Address = 0x08008000; unsigned long Address2 = 0x08009000; unsigned long* ptr; void main() { GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_ALL); // digital output PORTD GPIO_Digital_Output(&GPIOE_BASE, _GPIO_PINMASK_ALL); // digital output PORTE for(i=0; i<32; i++) buff[i]=i+(i<<16); FLASH_ErasePage(Address); // erase block (Address must be 2048 byte aligned) for(i=0; i<32; i++) FLASH_Write_Word(Address + i*4, buff[i]); // write buffer with 32 long words ptr = (unsigned long*)Address; for(i=0; i<32; i++) { tmp = *ptr; GPIOD_ODR = HiWord(tmp); GPIOE_ODR = LoWord(tmp) << 8; ptr++; Delay_ms(50); } Delay_ms(1000); FLASH_ErasePage(Address2); // erase block (Address must be 2048 byte aligned) FLASH_Write_HalfWord(Address2, 0xAAAA); // write one word GPIOD_ODR = 0; ptr = (unsigned long*)Address2; i = *ptr; GPIOE_ODR = (LoWord(i)) << 8; }
What do you think about this topic ? Send us feedback!