Перейти к содержанию

Запись / чтение в / из флешь STM32F100C8T6


artos5

Рекомендуемые сообщения

Доброй ночи всем!

Нашел в интернете примеры. И решил себе тоже применить. Но вот засада , то ли сохраняется корректно , то ли не считывается. 

Кто подскажет где косяк?

Скрытый текст



//=== чтение и запись с/в флешь ===//
//#define FLASH_KEY1 ((uint32_t)0x45670123)
//#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
void flash_unlock(void) {
  FLASH->KEYR = FLASH_KEY1;
  FLASH->KEYR = FLASH_KEY2;
  //FLASH_Unlock();
}

void flash_lock() {
  FLASH->CR |= FLASH_CR_LOCK;
}

uint32_t flash_read(uint32_t address) {
  return (*(__IO uint32_t*) address);
}

//Функция возврщает 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 save_cmd_eeprom(uint8_t p)
{
	uint32_t buff = 0;
	uint32_t st_address = FLASH_BASE + p * 1024;
	__disable_irq();
	flash_unlock();
	flash_erase_page(st_address);
	flash_lock();

	st_address = FLASH_BASE + p * 1024;

	flash_unlock();
		for(byte_block_cnt=0; byte_block_cnt<32; byte_block_cnt+=4)
		{
		          buff = data_ir_eep0[byte_block_cnt+3];
		          buff<<=8;
		          buff |= data_ir_eep0[byte_block_cnt+2];
		          buff<<=8;
		          buff |= data_ir_eep0[byte_block_cnt+1];
		          buff<<=8;
		          buff |= data_ir_eep0[byte_block_cnt];

		 flash_write(st_address+byte_block_cnt, buff);
		}
	flash_lock();
	__enable_irq();
}

void load_cmd_eeprom(uint8_t p)
{
	uint32_t data=0;
	uint32_t st_address = FLASH_BASE + p * 1024;
	__disable_irq();
	for(byte_block_cnt=0; byte_block_cnt<32; byte_block_cnt+=4)
	{
	 data = flash_read(st_address);
	 data_ir_eep0[byte_block_cnt]   = data&0x000000FF;
	 data_ir_eep0[byte_block_cnt+1] = (data>>8)&0x000000FF;
	 data_ir_eep0[byte_block_cnt+2] = (data>>16)&0x000000FF;
	 data_ir_eep0[byte_block_cnt+3] = (data>>24)&0x000000FF;
	}
	__enable_irq();
}


 

пишу и читаю 63 страницу.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Первое что бросается в глаза, у вас адреса не правельные, должны начинатся на 0х08....  Второе проверить правильно-ли записали в память можно с помощью куб программера, оч простая и удобная программа от ST. 

#define MEM_CRC         0x0801F800             // адрес переменной в памяти контроллера
uint32_t crc = *(__IO uint32_t *)MEM_CRC;  // чтение из памяти контроллера в переменную

Мог-бы и с записью во флешь помочь, но у меня все на HAL

Изменено пользователем andryxa
Ссылка на комментарий
Поделиться на другие сайты

В другой теме вы про подсчет црц спрашивали в каждой строке, если это для записи в бутлоадер, то можно считать одну контрольную сумму для всего файла. Это можно делать автоматически самим компилятором при помощи этой программы http://srecord.sourceforge.net/man/man1/srec_info.html

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 минуту назад, andryxa сказал:

В другой теме вы про подсчет црц спрашивали

Нет , нужно именно в хекс файле строки править. Текст отображаемый на дисплее

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

uint8_t Flash_Write( uint16_t *address, uint16_t *data, uint16_t size_nbytes )
{
	if((uint32_t)address < FLASH_START || (uint32_t)address >= FLASH_START + FLASH_SIZE_NBYTES ||
	   (uint32_t)address % 2) /* Address to write must be 2-byte aligned and in FLASH addresses range. */
		return 1;

	if( data == NULL || (uint32_t)data % 2 ) /* Data pointer must be 2-byte aligned. */
		return 1;

	if( !size_nbytes || size_nbytes > FLASH_PAGE_NBYTES || (size_nbytes % 2) )
		return 1;

	if( ((uint32_t)address + size_nbytes) >= FLASH_START + FLASH_SIZE_NBYTES )
		return 1;

	for( uint16_t index = 0; index < size_nbytes / 2; index++ )
	{
		if( address[index] != 0xFFFF )
			return 1; /* Flash not erased. Write cannot be done! */
	}

	__disable_irq();

	while( GET_BIT_BOOL(FLASH, , SR, BSY) ) continue;

	if( GET_BIT_BOOL(FLASH, , CR, LOCK) )
	{
		/* Unlock flash memory. */
		WRITE_REG( FLASH, , KEYR, 0x45670123 );
		WRITE_REG( FLASH, , KEYR, 0xCDEF89AB );
	}

	SET_BIT( FLASH, , CR, PG ); /* Enable Flash programming */

	for( uint16_t index = 0; index < size_nbytes / 2; index++ )
	{
		*(address++) = *(data++);

		while( GET_BIT_BOOL(FLASH, , SR, BSY) || !GET_BIT_BOOL(FLASH, , SR, EOP) ) continue;
		SET_BIT( FLASH, , SR, EOP ); /* Clear End Of Programming flag */
	}

	CLEAR_BIT( FLASH, , CR, PG ); /* Disable Flash programming */
	SET_BIT( FLASH, , CR, LOCK ); /* Lock Flash memory         */

	__enable_irq();

	return 0;
}

 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В общем , я в замешательстве....

Написал кусок кода для отладки терминалом. 

Код такой:

Скрытый текст



 else if(strstr(rx_buffer0, "READ_FLASH>")) // read all param
  {
	 char buff[10];
	for(x=0; x<2; x++)
		{
		 buff[x] = (char)rx_buffer0[x+11];
		}
	uint8_t p=atoi(buff);
	     S_uart1_N("Start READ().\r\n");
	      if (p>63) {
	    	  S_uart1_N("Invalid page number!\r\n");
	 					return;
	 				}
	 				uint32_t st_address = FLASH_BASE + p * 1024;
	 				
	 				uint8_t i,j;
	 				uint8_t st[16];
	 				for (i=0;i<64;i++) {

	 					for (j=0;j<16;j+=4)  {
	 						st[j]=flash_read(st_address);
	 						st[j+1]=flash_read(st_address)>>8;
	 						st[j+2]=flash_read(st_address)>>16;
	 						st[j+3]=flash_read(st_address)>>24;

	 						uart_write_hex((uint8_t)flash_read(st_address));
	 						Usart1_Send_symbol_(' ');
	 						uart_write_hex(flash_read(st_address)>>8);
	 						Usart1_Send_symbol_(' ');
	 						uart_write_hex(flash_read(st_address)>>16);
	 						Usart1_Send_symbol_(' ');
	 						uart_write_hex(flash_read(st_address)>>24);
	 						Usart1_Send_symbol_(' ');
	 						st_address+=4;

	 					}

	 					Usart1_Send_symbol_(':');Usart1_Send_symbol_(' ');
	 					for (j=0;j<16;j++) {
	 						if (st[j]<=20) {
	 							Usart1_Send_symbol_('.');
	 						} else {
	 							S_uart1_N(st[j]);
	 						}
	 					}
	 					S_uart1_N("\r\n");
	 				}
	 				S_uart1_N("\r\n");
	 				S_uart1_N("Done.\r\n");

 	  timer=0;
 	  test_flags=0;
 	  clear_buffer_rx_0();
  }

  else if(strstr(rx_buffer0, "WRITE_FLASH>")) // read all param
   {
 	 char buff[10];
 	for(x=0; x<2; x++)
 		{
 		 buff[x] = (char)rx_buffer0[x+12];
 		}
 	uint8_t p=atoi(buff);

 	      if (p>63) {
 	    	  S_uart1_N("Invalid page number!\r\n");
 	 					return;
 	 				}

 	     				uint32_t st_address = FLASH_BASE + p * 1024;

	                        flash_unlock();
	     					flash_erase_page(st_address);
	     					flash_lock();
	     					send_to_uart('\r'); send_to_uart('\n');
	     					S_uart1_N("The page has been erased.");
	     					send_to_uart('\r'); send_to_uart('\n');


 	     				flash_unlock();
 	     				uint16_t tmp;
 	     				for(tmp=0;tmp<1024;tmp+=4)
 	     					flash_write(st_address+tmp,0x54534554);

 	     				flash_lock();
 	     				Usart1_Send_symbol_('\r'); Usart1_Send_symbol_('\n');
 	     				S_uart1_N("The page has been writed.");
 	     				Usart1_Send_symbol_('\r'); Usart1_Send_symbol_('\n');

  	  timer=0;
  	  test_flags=0;
  	  clear_buffer_rx_0();
   }


 

Все пишется и считывается нормально , данные соответствуют , но ровно до перезагрузки питания.

После сброса питания , данные либо FF либо абракадабра...

вот пример чтения:

До сброса питания:

54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP
54 45 53 54 54 45 53 54 54 45 53 54 54 45 53 54 : НPНPНPНPНPНPНPНPНPНPНPНP

И после сброса:

Start READ().
85 4F 00 08 87 4F 00 08 89 4F 00 08 8B 4F 00 08 : НP.©НP..НPНP..
8D 4F 00 08 00 00 00 00 00 00 00 00 00 00 00 00 P..............
00 00 00 00 8F 4F 00 08 91 4F 00 08 00 00 00 00 : ...НPP......
93 4F 00 08 95 4F 00 08 CD 50 00 08 99 4F 00 08 PP..PНPP..
CD 50 00 08 CD 50 00 08 CD 50 00 08 CD 50 00 08 : PНP..PНP..PНP..PНP..
CD 50 00 08 9D 4F 00 08 A3 4F 00 08 CD 50 00 08 : PНP..НP.ННP..PНP..
CD 50 00 08 CD 50 00 08 CD 50 00 08 CD 50 00 08 : PНP..PНP..PНP..PНP..
CD 50 00 08 CD 50 00 08 CD 50 00 08 CD 50 00 08 : PНP..PНP..PНP..PНP..
A9 4F 00 08 00 00 00 00 00 00 00 00 00 00 00 00 : НP..............
00 00 00 00 CD 50 00 08 CD 50 00 08 CD 50 00 08 : ....PНP..PНP..PНP..
CD 50 00 08 CD 50 00 08 B5 4F 00 08 C1 4F 00 08 : PНP..PНP..НP..НP..
CD 50 00 08 CD 50 00 08 CD 50 00 08 00 00 00 00 : PНP..PНP..PНP......
00 00 00 00 CD 50 00 08 CD 50 00 08 CD 4F 00 08 : ....PНP..PНP..НP..
CD 50 00 08 CD 50 00 08 E1 4F 00 08 CD 50 00 08 : PНP..PНP..НP..PНP..
CD 50 00 08 00 00 00 00 00 00 00 00 00 00 00 00 : PНP..............
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
CD 50 00 08 CD 50 00 08 00 00 00 00 00 00 00 00 : PНP..PНP..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
00 00 00 00 5F F8 08 F1 10 B5 05 4C 23 78 33 B9 : ...ЈO..OPНP
04 4B 13 B1 04 48 AF F3 00 80 01 23 23 70 10 BD : НP.O.НµOPP.P
E0 01 00 20 00 00 00 00 8C 73 00 08 08 B5 03 4B : бO.....НP...OНP
1B B1 03 49 03 48 AF F3 00 80 08 BD 00 00 00 00 :O.P.НµOP.P....
E4 01 00 20 8C 73 00 08 03 46 13 F8 01 2B 00 2A : НPP......
FB D1 18 1A 01 38 70 47 81 F0 00 41 02 E0 00 BF : PЌO.“OННPP.POНP
83 F0 00 43 30 B5 4F EA 41 04 4F EA 43 05 94 EA POOНPPН™O.
05 0F 08 BF 90 EA 02 0F 1F BF 54 EA 00 0C 55 EA : ..НPPНP..P
02 0C 7F EA 64 5C 7F EA 65 5C 00 F0 E2 80 4F EA : PНPќНPPќO.ННP
54 54 D4 EB 55 55 B8 BF 6D 42 0C DD 2C 44 80 EA : НPНPНPPННPP.PЏOOНP
02 02 81 EA 03 03 82 EA 00 00 83 EA 01 01 80 EA : ..P...НP..НP
02 02 81 EA 03 03 36 2D 88 BF 30 BD 11 F0 00 4F : ..P..O©НPOPP
4F EA 01 31 4F F4 80 1C 4C EA 11 31 02 D0 40 42 PPНPНP.OPНP
61 EB 41 01 13 F0 00 4F 4F EA 03 33 4C EA 13 33 : P..ННPНP
02 D0 52 42 63 EB 43 03 94 EA 05 0F 00 F0 A7 80 : .Н™O...НPНP
A4 F1 01 04 D5 F1 20 0E 0D DB 02 FA 0E FC 22 FA : НP..OP..
05 F2 80 18 41 F1 00 01 03 FA 0E F2 80 18 43 FA : PЌOP....НPЌ™O
05 F3 59 41 0E E0 A5 F1 20 05 0E F1 20 0E 01 2A : .PPOP....
03 FA 0E FC 28 BF 4C F0 02 0C 43 FA 05 F3 C0 18 : PНP.™OPЌO
51 EB E3 71 01 F0 00 45 07 D5 4F F0 00 0E DC F1 PP..OP..НP
00 0C 7E EB 00 00 6E EB 01 01 B1 F5 80 1F 1B D3 : ....OНO
B1 F5 00 1F 0C D3 49 08 5F EA 30 00 4F EA 3C 0C : OOPЈOOНPO.
04 F1 01 04 4F EA 44 52 12 F5 80 0F 80 F0 9A 80 : ..НPOPPНP
BC F1 00 4F 08 BF 5F EA 50 0C 50 F1 00 00 41 EB : НPНPНЈOНPP..
04 51 41 EA 05 01 30 BD 5F EA 4C 0C 40 41 41 EB : .PP..‘OЈOНPPP
01 01 11 F4 80 1F A4 F1 01 04 E9 D1 91 F0 00 0F : ...НPНP..PP..
04 BF 01 46 00 20 B1 FA 81 F3 08 BF 20 33 A3 F1 : НP..OPНP
0B 03 B3 F1 20 02 0C DA 0C 32 08 DD 02 F1 14 0C : O....P...
C2 F1 0C 02 01 FA 0C F0 21 FA 02 F1 0C E0 02 F1 : ......бO.
14 02 D8 BF C2 F1 20 0C 01 FA 02 F1 20 FA 0C FC : ..ННP....
DC BF 41 EA 0C 01 90 40 E4 1A A2 BF 01 EB 04 51 : ННPP..НPННP.P
29 43 30 BD 6F EA 04 04 1F 3C 1C DA 0C 34 0E DC :™OOНP..•O..НP
04 F1 14 04 C4 F1 20 02 20 FA 04 F0 01 FA 02 F3 : .......
40 EA 03 00 21 FA 04 F3 45 EA 03 01 30 BD C4 F1 : НP...O..‘OP
0C 04 C4 F1 20 02 20 FA 02 F0 01 FA 04 F3 40 EA : ......НP
03 00 29 46 30 BD 21 FA 04 F0 29 46 30 BD 94 F0 : ..‘OP.‘OP

Done.

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Приведенный код нормально пишет в память. Значения после подключения/отключения питания в памяти сохраняются. 

Советую искать ошибку в алгоритме отладки.

Проверить правильность записи можно и без дополнительных усилий. 

После записи и повторного подключения питания нужно просто подключится к МК с помощью ST-Link Utility и его средствами посмотреть что там по заданному адресу в памяти записалось. 

 

 

555.JPG

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Вуйко сказал:

заданному адресу в памяти записалось. 

Да это я знаю. Читает некорректно .

И при считывании терминалом , тоже иногда абракадабра считывается.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

В руководстве по программированию есть такое требование:

For write and erase operations on the Flash memory (write/erase), the internal RC oscillator
(HSI) must be ON

Проверьте на всякий случай включен у вас HSI или нет. При запуске он всегда включен, но если работаете на внешнем кварце, то могли выключить.

Ссылка на комментарий
Поделиться на другие сайты

проверил у себя . У меня запись не проходит... Ст линком не видно тестовых данных.

1 час назад, Вуйко сказал:

заданному адресу в памяти записалось. 

Да это я знаю. Читает некорректно .

И при считывании терминалом , тоже иногда абракадабра считывается.

 

Кстати , у меня нет таких адресов...

Последний адрес в памяти 0х08008710....

Неужто подделка чипа ?

IMG_20190927_141042_1.jpg

Стоп , вижу те адреса теперь. У меня неправильно был задан размер памяти .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

И что там по адресам? Записанные данные есть?

Переменная FLASH_BASE правильно задана?

Если данных нет, то только по шагам смотреть что в функции записи происходит отладчиком. 

 

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Вуйко сказал:

И что там по адресам?

Короче пишет странно как то.

Функция save_eeprom()

Правильная . А запись происходит через каждых 4 байта . 

Запись массива такая:

Я ее уже пилил 50 раз .

void save_cmd_eeprom(uint32_t p)
{
	char buff[64];
	uint32_t st_address = FLASH_BASE + p * 1024;

	flash_unlock();
	flash_erase_page(st_address);

		S_uart1_N("The page has been erased.");
		send_to_uart('\r'); send_to_uart('\n');

	//flash_unlock();
		for(byte_block_cnt=0; byte_block_cnt<64; byte_block_cnt+=4)
		{
		 flash_write(st_address+byte_block_cnt, data_ir_eep0[byte_block_cnt]);
		 sprintf(buff ,"ADDR=0x%8X; DATA=0x%8X\r\n", (st_address+byte_block_cnt), flash_read(st_address+byte_block_cnt));
		 S_uart1_N(buff);
		}
			S_uart1_N("The page has been writed.");
			send_to_uart('\r'); send_to_uart('\n');
	//flash_lock();
}

А сама отправка данных и их запись выглядит так:

 if(Iconst!=0 && call_a==0) // ток
         {
		data_ir_eep0[1]=Iconst;
		data_ir_eep0[0]=ADC_Data[1];

		sprintf(buff ,"Iwr=0x%8X; Iwr2=0x%8X; Ire=0x%8X; Ire2=%8X\r\n", ADC_Data[1], Iconst , data_ir_eep0[0], data_ir_eep0[1]);
	    S_uart1_N(buff);

	save_cmd_eeprom(55);
        }

.....................
  .........
  
  if(Vconst!=0 && volt_call==0) // напряжение
				 		   {
				 			data_ir_eep0[3]=ADC_Data[2];

				 			data_ir_eep0[2]=(uint32_t)Vconst;
				 			sprintf(buff ,"Vwr=0x%8X; Vwr2=0x%8X; Vre=0x%8X; Vre2=%8X\r\n", ADC_Data[2], Vconst , data_ir_eep0[3], data_ir_eep0[2]);


							 data_ir_eep0[8]=0x20;
							 data_ir_eep0[9]=0x21;
							 data_ir_eep0[10]=0x22;
							 data_ir_eep0[11]=0x23;
							 save_cmd_eeprom(55);
				 		   }

 

Терминал выводит следующее:

Iwr=0x      51; Iwr2=0x       2; Ire=0x      51; Ire2= �<0>�<0>  �<0>The page has been erased.
ADDR=0x 800DC00; DATA=0x      51
ADDR=0x 800DC04; DATA=0x54534554
ADDR=0x 800DC08; DATA=0x      20
ADDR=0x 800DC0C; DATA=0x54534554
ADDR=0x 800DC10; DATA=0xFFFFFFFF
ADDR=0x 800DC14; DATA=0xFFFFFFFF
ADDR=0x 800DC18; DATA=0xFFFFFFFF
ADDR=0x 800DC1C; DATA=0xFFFFFFFF
ADDR=0x 800DC20; DATA=0xFFFFFFFF
ADDR=0x 800DC24; DATA=0xFFFFFFFF
ADDR=0x 800DC28; DATA=0xFFFFFFFF
ADDR=0x 800DC2C; DATA=0xFFFFFFFF
ADDR=0x 800DC30; DATA=0xFFFFFFFF
ADDR=0x 800DC34; DATA=0xFFFFFFFF
ADDR=0x 800DC38; DATA=0xFFFFFFFF
ADDR=0x 800DC3C; DATA=0xFFFFFFFF
The page has been writed.

 

 

Как видно , в ОЗУ нет данных (пусто). 

7 минут назад, artos5 сказал:

Ire2=

а я хотел записать:

8 минут назад, artos5 сказал:

Iwr2=0x       2;

 

И в ST Link тоже самое показывает.

переменные объявил так:

uint32_t Iconst=2,Vconst=200;
uint32_t  data_ir_eep0[64];

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Проверил более тщательно , копируется в ОЗУ . Но во флешь не записывается . 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Разобрался!!! Это ужас просто! Косяк такой простой , но оказывается незаметный ))

В общем проблема была с адресацией памяти в буфере.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...