Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 08.04.2021, 15:30  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию 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.
sanstan вне форума  
Непрочитано 08.04.2021, 17:13  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Read - write Flash STM32F767

Раздел 3. Embedded Flash memory (FLASH).
Там нет страниц, там стирание идет секторами и нужно указать номер сектора.
Вам необходимо открыть и прочитать мануал на эту серию и код подправить с учетом полученной информации. Ничего сложного там нет.
realid вне форума  
Непрочитано 13.04.2021, 13:21  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию 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; //Сбрасываем бит обратно
}
я не понял, как адрес задавать...
sanstan вне форума  
Непрочитано 13.04.2021, 13:49  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию 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.
realid вне форума  
Непрочитано 19.04.2021, 19:05  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию 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.
sanstan вне форума  
Непрочитано 19.04.2021, 20:48  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Read - write Flash STM32F767

Сообщение от sanstan Посмотреть сообщение
flash_write(Sector4Begin+tmp,flashVars);
Что там?
________________________
realid вне форума  
Непрочитано 20.04.2021, 10:39  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию 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;
  }
.......
}
sanstan вне форума  
Непрочитано 20.04.2021, 12:44  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию 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.
realid вне форума  
Сказали "Спасибо" realid
sanstan (28.04.2021)
Непрочитано 23.04.2021, 18:29  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию Re: Read - write Flash STM32F767

Работает!!! Спасибо большое - неделю бился.
sanstan вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучаем STM32 Cortex M3 EugVor ARM 6166 19.02.2024 18:22
Ускорить компьютер 7Fantomas7 Ремонт оргтехники 111 08.08.2018 05:27
Программирование программатором STERH 007 PIC микроконтроллеров ispitatel1 Песочница (вопросы новичков) 4 17.04.2017 17:18
Выход из спящего режима по INT0 putmannn AVR 24 07.01.2013 16:47
Программирование NOR FLASH ST_Senya Микроконтроллеры, АЦП, память и т.д 1 01.10.2010 22:18


Часовой пояс GMT +4, время: 20:46.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot