08.04.2021, 15:30
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Read - write Flash STM32F767
Добрый день.
Подскажите, какие регистры использовать с МК stm32f767?
для МК f103 подходил код:
Код:
|
uint32_t st_address;//адрес записи данных
void flash_unlock(void) {
FLASH-›KEYR = FLASH_KEY1;
FLASH-›KEYR = FLASH_KEY2;
}
void flash_lock() {
FLASH-›CR |= FLASH_CR_LOCK;
}
//Функция возврщает true когда можно стирать или писать память.
uint8_t flash_ready(void) {
return !(FLASH-›SR & FLASH_SR_BSY);
}
//Функция стирает ВСЕ страницы. При её вызове прошивка самоуничтожается
void flash_erase_all_pages(void) {
FLASH-›CR |= FLASH_CR_MER; //Устанавливаем бит стирания ВСЕХ страниц
FLASH-›CR |= FLASH_CR_STRT; //Начать стирание
while(!flash_ready()) // Ожидание готовности.. Хотя оно уже наверное ни к чему здесь...
;
FLASH-›CR &= FLASH_CR_MER;
}
//Функция стирает одну страницу. В качестве адреса можно использовать любой
//принадлежащий диапазону адресов той странице которую нужно очистить.
void flash_erase_page(uint32_t address) {
FLASH-›CR|= FLASH_CR_PER; //Устанавливаем бит стирания одной страницы
FLASH-›AR = address; // Задаем её адрес
FLASH-›CR|= FLASH_CR_STRT; // Запускаем стирание
while(!flash_ready())
; //Ждем пока страница сотрется.
FLASH-›CR&= ~FLASH_CR_PER; //Сбрасываем бит обратно
}
//запись данных во флеш
void flash_write(uint32_t address,uint32_t data) {
FLASH-›CR |= FLASH_CR_PG; //Разрешаем программирование флеша
while(!flash_ready()) //Ожидаем готовности флеша к записи
;
*(__IO uint16_t*)address = (uint16_t)data; //Пишем младшие 2 байта
while(!flash_ready())
;
address+=2;
data››=16;
*(__IO uint16_t*)address = (uint16_t)data; //Пишем старшие 2 байта
while(!flash_ready())
;
FLASH-›CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша
}
void flash_save_data(){
int p=100;
int tmp=0;
int flashVars=0; //разрешение на чтение из флеш памяти
st_address=FLASH_BASE+p*1024;
flash_unlock();
flash_erase_page(st_address);
flash_write(st_address+tmp,flashVars); //разрешение на чтение из флеш памяти
tmp+=4;
flash_write(st_address+tmp,t102); //Сохраняем максимальное давление компрессора.
tmp+=4;
for(int i=1;i‹=nProdMax;i++){
flash_write(st_address+tmp,price[i]);
tmp+=4;
}
password=atoi(strPasswordCurr);
flash_write(st_address+tmp,password); //пароль
tmp+=4;
for(tmp;tmp‹1024;tmp+=4){
flash_write(st_address+tmp,intFlash);
intFlash+=2;
}
flash_lock();
}
//Чтение данных из Флеш
uint32_t flash_read(uint32_t address) {
return (*(__IO uint32_t*) address);
}
void flash_read_data(){
int p=100;
int intFlash=0;
int tmp=0;
int flashVars; //разрешение на чтение из флеш памяти
st_address=FLASH_BASE+p*1024;
flash_unlock();
flashVars=flash_read(st_address+tmp); //Читаем разрешение на чтение из флеш памяти
tmp+=4;
if(flashVars==0){ //если запись во флеш ранее производилась
t102=flash_read(st_address+tmp); //Читаем максимальное давление компрессора.
tmp+=4;
for(int i=1;i‹=nProdMax;i++){
price[i]=flash_read(st_address+tmp);
tmp+=4;
}
password=flash_read(st_address+tmp); //Читаем пароль
sprintf(strPasswordCurr,"%8d", password);
//strPasswordSave=itoa(password);
tmp+=4;
}else{
password=atoi(strPasswordSave);
}
flash_lock();
} |
с easystm32.ru.
в f767 нет FLASH_CR_PER; //Устанавливаем бит стирания одной страницы
и FLASH-›AR
Последний раз редактировалось sanstan; 19.04.2021 в 19:06.
|
|
|
|
08.04.2021, 17:13
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Read - write Flash STM32F767
Раздел 3. Embedded Flash memory (FLASH).
Там нет страниц, там стирание идет секторами и нужно указать номер сектора.
Вам необходимо открыть и прочитать мануал на эту серию и код подправить с учетом полученной информации. Ничего сложного там нет.
|
|
|
|
13.04.2021, 13:21
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Read - write Flash STM32F767
Код:
|
void flash_erase_page(uint32_t address) {
FLASH-›CR|= FLASH_CR_PER; //Устанавливаем бит стирания одной страницы
FLASH-›AR = address; // Задаем её адрес
FLASH-›CR|= FLASH_CR_STRT; // Запускаем стирание
while(!flash_ready())
; //Ждем пока страница сотрется.
FLASH-›CR&= ~FLASH_CR_PER; //Сбрасываем бит обратно
} |
Должно быть:
Код:
|
void flash_erase_page(uint32_t address) {
FLASH-›CR|= FLASH_CR_SER; //Устанавливаем бит стирания одной страницы
FLASH-›AR = address; // Задаем её адрес
FLASH-›CR|= FLASH_CR_STRT; // Запускаем стирание
while(!flash_ready())
; //Ждем пока страница сотрется.
FLASH-›CR&= ~FLASH_CR_SER; //Сбрасываем бит обратно
} |
я не понял, как адрес задавать...
|
|
|
|
13.04.2021, 13:49
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Read - write Flash STM32F767
Там не адрес, а номер сектора для стирания задается в регистре FLASH-›CR, Bits 7:3 SNB[4:0]: Sector number.
По размеру секторов тоже есть нюансы. Читайте мануал внимательнее.
Цитата:
|
The Flash memory is organized as follows:
• Main memory organization depends on dual bank configuration bit:
– When the dual bank mode is disabled (nDBANK bit is set), the main memory block
is divided into 4 sectors of 32 Kbytes, 1 Sector of 128 Kbytes, and 7 sectors of 256
Kbytes
– In dual bank mode (nDBANK bit is reset), the main memory is divided into two
banks of 1 Mbyte. Each 1 Mbyte bank is composed of 4 sectors of 16 Kbytes, 1
Sector of 64 Kbytes and 7 sectors of 128 Kbytes
- If nDBANK=1, Size of main memory block: 4 sectors of 32 KBytes, 1 sector of
128 KBytes, 7 sectors of 256 KBytes (reference to memory organization)
- If nDBANK=0, Each 1MB banks is composed of: 4 sectors of 16 KBytes, 1 sector
of 64 KBytes, 7 sectors of 128 KBytes (reference to memory organization)
|
Цитата:
|
For erase operation, the right sector numbering must be considered according to
nDBANK option bit.
– When the nDBANK bit is set (single bank mode), the erase operation must be
performed on the default sector number.
– When the nDBANK bit is reset, to perform an erase operation on bank 2, the
sector number must be programmed (sector number from 12 to 19). Refer to
FLASH_CR register for SNB (Sector number) configuration.
Refer to Table 5: 1 Mbyte Flash memory single bank organization (256 bits read
width) and Table 6: 1 Mbyte Flash memory dual bank organization (128 bits read
Embedded Flash memory (FLASH) RM0410
87/1954 RM0410 Rev 4
width) for details on 1 Mbyte single bank and 1 Mbyte dual bank organizations.
|
На странице 88 есть таблица с номерами секторов, их размером и адресами.
Последний раз редактировалось realid; 13.04.2021 в 13:56.
|
|
|
|
19.04.2021, 19:05
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Read - write Flash STM32F767
Пишу:
Код:
|
#define Sector4Begin 0x08020000
void flash_save_data(){
int tmp=0;
int flashVars=0; //разрешение на чтение из флеш памяти
st_address=Sector4Begin;//FLASH_BASE+p*1024;
flash_unlock();
flash_erase_page(FLASH_CR_SNB_2);//4 сектор;
flash_write(Sector4Begin+tmp,flashVars);//st_address //разрешение на чтение из флеш памяти
tmp+=4;
.............. |
Не записывает по заданному адресу... Сохраняет зато в адрес 0x0000000 если
#define Sector4Begin 0x00000000
Последний раз редактировалось sanstan; 19.04.2021 в 20:26.
|
|
|
|
19.04.2021, 20:48
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Read - write Flash STM32F767
Сообщение от sanstan
|
flash_write(Sector4Begin+tmp,flashVars);
|
Что там?
________________________
|
|
|
|
20.04.2021, 10:39
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Read - write Flash STM32F767
там "0" записывается....потом для отличия я туда "7" записал потом 8 раз...
Код:
|
void flash_save_data(){
int flashVars=7;
.....
for(int i=0;i‹8;i++){
flash_write(Sector4Begin+tmp,flashVars);
tmp+=4;
}
.......
} |
|
|
|
|
20.04.2021, 12:44
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Read - write Flash STM32F767
Вот запись 32 бит на STM32F722, на вашем не должно отличаться.
Код:
|
FLASH_Unlock();
FLASH-›CR &= CR_PSIZE_MASK;
FLASH-›CR |= (FLASH_PSIZE_WORD | FLASH_CR_PG); //32 bit
for(c = 0; c ‹ 4; c++)
{
*(__IO uint32_t*)(address+(c*4)) = data[c]; //32 bit
__DSB();
while(FLASH-›SR & FLASH_SR_BSY);
}
FLASH-›CR &= (~FLASH_CR_PG); |
Последний раз редактировалось realid; 20.04.2021 в 12:47.
|
|
|
|
23.04.2021, 18:29
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Read - write Flash STM32F767
Работает!!! Спасибо большое - неделю бился.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:01.
|
|