 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Čet Avg 11, 2011 12:04 pm Naslov sporočila: |
|
|
Za hardware-specific sem našel nekaj:
Koda: |
FLASH_UnlockBank1();
FLASH_ErasePage(...);
FLASH_ProgramWord(Address, Data);
FLASH_LockBank1(); |
Za Compiler-specific zadeve: Keil uVision 4.20; C Compiler: Armcc.Exe 4.1.0.644
Če je kdo že počel kaj podobnega, se priporočam za vsako informacijo...
(Temo sem prestavil na tak način, da je tudi pri AVR-jih ostala povezava in jo je lažje najti. Itak ta forum rabi eno konkretno reorganizacijo...)
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Čet Avg 11, 2011 12:28 pm Naslov sporočila: |
|
|
Za STM32:
Standard library:
Funkcije: stm32f10x_flash.c in stm32f10x_flash.h
Primer: STM32F10x_StdPeriph_Examples\FLASH\Program
Organizacija flasha:
Reference Manual, Memory and bus architecture, Memory map, Embedded Flash memory
Za uVision:
Postavitev spremenljivk na določeno lokacijo:
Koda: |
#include <absacc.h>
const char table[] __at(0x00001000) = {0x01, 0x02, 0x03, 0x04}; |
|
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Čet Avg 11, 2011 5:12 pm Naslov sporočila: |
|
|
Yay!
mi je prvič v karieri le uspelo priti do:
Koda: |
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
} |
V glavnem, rutine za brisanje in pisanje flash-a zagotovo delujejo.
Ko pa uC resetiram, se mu skeglja še preden pride v main. Malo bo treba še raziskati tole..
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Avg 12, 2011 9:57 am Naslov sporočila: |
|
|
Sem temo kar razdelil, ker očitno še ne bo konca mojim težavam
Torej, ostal sem pri tem, da vpišem tabelo iz RAM v Flash.
Primer sem vzel iz iz ST-jeve knjižnice in deluje normalno.
Predzadnji Page proti koncu Flash-a (ki je prazen, preverjeno v MAP datoteki) pobriše in vpiše notri nove podatke. Vse ok.
V debuggerju sem podatke pregledal in se pravilno pobriše in pravilno vpiše.
Koda, ki to naredi je:
Koda: |
#define FLASH_PAGE_SIZE ((uint16_t)0x400)
#define FLASH_WRITE_START_ADDR ((uint32_t) (0x08010000-(2*FLASH_PAGE_SIZE))) // 2 kb pred koncem (predzadnji Page)
void Zapisi_V_Flash (void)
{
FLASH_Unlock(); // Unlock the Flash Bank1 Program Erase controller
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); //Clear All pending flags
FLASHStatus = FLASH_ErasePage(FLASH_WRITE_START_ADDR); //Erase the FLASH page
WR_Address = (u32) naslov "konstante" v Flash-u;
WR_Data = željen podatek za vpis;
FLASHStatus = FLASH_ProgramWord (WR_Address, WR_Data);
FLASH_Lock();
} |
Program normalno teče naprej in vse dela.
Ko pa ga resetiram, se inicializacijski del izvede enako kot prej:
Koda: |
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0
ENDP |
Koda: |
0x080001CC 4808 LDR r0,[pc,#32] ; @0x080001F0
0x080001CE 4700 BX r0 |
V R0 se pravilno naloži pozicija __main funkcije (80000EC), ampak namesto da bi skočil na tisti naslov, kot prej, se usuje (Hard Fault)
Tudi če ga odklopim z elektrike se ne pobere.
Koda: |
__main:
0x080000EC F000F802 B L.W __scatterload_rt2_thumb_only (0x080000F4)
0x080000F0 F000F85C B L.W __rt_entry_sh (0x080001AC)
__scatterload_rt2_thumb_only:
0x080000F4 A00A ADR r0,{pc}+4 ; @0x08000120
.... |
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pet Avg 12, 2011 11:07 am Naslov sporočila: |
|
|
aly je napisal/a: |
...v programu cel page rezervirat zase, da ne bo compiler metal drugih stvari tja (ki jih v MAP ne napiše) ... |
Seveda, saj on ne ve, da misliš vse pobrisat! Sorry, ker sem pozabil omenit
|
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Avg 12, 2011 11:23 am Naslov sporočila: |
|
|
In kako rezerviraš določeo stran v flashu?
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pet Avg 12, 2011 11:30 am Naslov sporočila: |
|
|
SimonS je napisal/a: |
In kako rezerviraš določeo stran v flashu? |
#include <absacc.h>
#define FLASH_PAGE_SZ 0x___
#define FLASH_PAGE_ADDR 0x________
const char table[FLASH_PAGE_SZ] __at(FLASH_PAGE_ADDR) = {__, __, ... , __};
|
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Avg 12, 2011 11:40 am Naslov sporočila: |
|
|
Hvala!
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Pet Avg 12, 2011 2:46 pm Naslov sporočila: |
|
|
No, sedaj pa bo
Eno stran v Flashu sem razdelil na koristne podatke in na dummy tabelo (vse 0xFF).
Koda: |
const s16 Offset_Flash[] __at(FLASH_WRITE_START_ADDR) = {0,60,37,95,27,71,34,4,17,89,93,59,86,74,47,28,76,98,67,56,64,75,50,69,59,84,93,63,79,74,25,75,48,36,40,53,119,77,55,81,58,47,25,28,30,98,43,30,105,75,40,-15,105,49};
const u8 Dummy[] __at(FLASH_WRITE_START_ADDR + 108) = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, ...................
|
Umnik, hvala res
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Avg 12, 2011 4:46 pm Naslov sporočila: |
|
|
Malce nerodno ima rešeno pisanje po flashu. Lahko pišeš le z word ali halfword. Torej za pisanje tipa byte je malce nerodno. Napisal sem si svojo rutinico za pisanje in branje po flashu. Uporabe je resnično enostavna in ne rabi razlage. Upam, da bo prišlo še komu za prav.
Opis: |
|
 Download |
Ime datoteke: |
iap.rar |
Velikost datoteke: |
809 Bytov |
Downloadano: |
12 krat |
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Sob Avg 13, 2011 9:28 pm Naslov sporočila: |
|
|
Aly, dummy tabele 0xFF ti res ni treba zapisovati. Ko pobrišeš celotno page so itak že vsi prazni 0xFF. Potem samo vpišeš toliko podatkov, kot jih potrebuješ.
Jaz imam takole rešeno in dela super.
Koda: |
void write_parameters () {
u32 *a = (u32 *)parameters;
u32 addr = ADDR_parameters;
u8 size = N_parameters;
FLASH_Unlock(); // Unlock the Flash Program Erase controller
FLASHStatus=FLASH_ErasePage(addr);
do {
FLASH_ProgramWord((addr),*a); //store array of parameters
a++;
addr+=4;
}
while (--size);
FLASH_Lock(); // Lock the Flash Program Erase controller
|
En page pač reskiram za te podatke. Ostalo, kar ni koristno ostane 0xFF.
|
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Sob Avg 13, 2011 9:37 pm Naslov sporočila: |
|
|
Če se ne motim si Aly s tem rezervira lokacijo, da slučajno prevajalnik ne uporabi one lokacije.....
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Ned Avg 14, 2011 11:17 am Naslov sporočila: |
|
|
spy je napisal/a: |
Aly, dummy tabele 0xFF ti res ni treba zapisovati.
...
En page pač reskiram za te podatke. Ostalo, kar ni koristno ostane 0xFF. |
Tako kot je SimonS napisal. Prevajalnik preostali Flash uporabi zase in ob tem nič je napiše v report (.map fajl). Zaradi tega se mi je program sesuval.
Poglej tukaj.
Dummy tabele ne vpisujem v Flash med delovanjem programa.
Tam je samo zato, da prevajalnik nima dostopa do tistih lokacij, ker bodo pobrisane.
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Ned Avg 14, 2011 10:25 pm Naslov sporočila: |
|
|
Aha..ok.
Jaz imam svoje na koncu, zadnji page.
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|