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 |
function Flash_Write(address, lData : dword) : dword; |
---|---|
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 |
Address := 0xC00; // erase block (Address must be 1024 byte aligned) Flash_Write(Address, 0xAAAAAAAA); // write one word |
Notes |
None. |
Flash_Write_Buffer
Prototype |
function Flash_Write_Buffer(address : dword; ppData : ^byte) : dword; |
---|---|
Description |
This function will program a sequence of words into the on-chip flash. |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
unsigned long Address = 0xC00; var buff : array[32] of dword; Address := 0xC00; 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 |
function Flash_Erase_Block(address: dword) : dword; |
---|---|
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 |
Address := 0xC00; // erase block (Address must be 1024 byte aligned) Flash_Erase_Block(Address); |
Notes |
Address should be 1024 byte aligned or else unpredictable behavior can occur. |
Flash_Set_uSec
Prototype |
procedure Flash_Set_uSec(clocks : dword); |
---|---|
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 |
procedure 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 |
procedure 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 |
procedure 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 |
procedure 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 |
procedure 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 |
procedure 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 |
procedure 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 |
procedure 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 |
function FLASH_EraseSector(FLASH_Sector : dword) : dword; |
||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
function FLASH_ErasePage(Address : dword) : dword; |
---|---|
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 |
function FLASH_EraseAllPages() : dword; |
---|---|
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 |
function FLASH_EraseAllBank1Pages() : dword; |
---|---|
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 |
function FLASH_EraseAllBank2Pages() : dword; |
---|---|
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 |
function FLASH_EraseAllSectors() : dword; |
---|---|
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 |
function FLASH_Write_DoubleWord(Address : dword; lData : uint64) : dword; |
---|---|
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 |
function FLASH_Write_Word(Address : dword; lData : dword) : dword; |
---|---|
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 |
function FLASH_Write_HalfWord(Address : dword; lData : dword) : dword; |
---|---|
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 |
function FLASH_Write_Byte(Address : dword; lData : byte) : dword; |
---|---|
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 |
function FLASH_AddressToSector(Address : dword) : longint; |
---|---|
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 |
function FLASH_SectorSize(flash_sector: dword) : longint; |
||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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
program Flash; var buff : array[32] of dword; var i, Address : dword; var ptr : ^dword; begin GPIO_Digital_Output(@GPIO_PORTH, _GPIO_PINMASK_ALL); // digital output GPIO_PORTH GPIO_Digital_Output(@GPIO_PORTJ, _GPIO_PINMASK_ALL); // digital output GPIO_PORTJ Address := 0xC00; // erase block (Address must be 1024 byte aligned) for i := 0 to 31 do buff[i] := i + (i shl 16); Flash_Erase_Block(Address); Flash_Write_Buffer(Address,@buff); // write buffer with 32 long words ptr := Address; for i := 0 to 31 do begin GPIO_PORTH_DATA := ptr^; GPIO_PORTJ_DATA := ptr^ shr 16; Inc(ptr); Delay_ms(250); end; Delay_ms(1000); Flash_Write(Address + 32*4, 0xAAAAAAAA);// write one word ptr := Address + 32*4; GPIO_PORTH_DATA := ptr^; GPIO_PORTJ_DATA := ptr^ shr 16; end.
STM32
program Flash; var buff : array[32] of dword; var i, tmp : dword; var Address, Address2 : dword; var ptr : ^dword; begin GPIO_Digital_Output(@GPIOD_BASE, _GPIO_PINMASK_ALL); // digital output PORTD GPIO_Digital_Output(@GPIOE_BASE, _GPIO_PINMASK_ALL); // digital output PORTE Address := 0x08008000; Address2 := 0x08009000; for i := 0 to 31 do buff[i] := i + (i shl 16); FLASH_ErasePage(Address); // erase block (Address must be 2048 byte aligned) for i:= 0 to 31 do FLASH_Write_Word(Address + i*4, buff[i]); // write buffer with 32 long words ptr := ^dword(Address); for i := 0 to 31 do begin tmp := ptr^; GPIOD_ODR := HiWord(tmp); GPIOE_ODR := LoWord(tmp) shl 8; Inc(ptr); Delay_ms(50); end; 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 := ^dword(Address2); i := ptr^; GPIOE_ODR := (LoWord(i)) shl 8; end.
What do you think about this topic ? Send us feedback!