Jump to content
artos5

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

Recommended Posts

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

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

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

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



//=== чтение и запись с/в флешь ===//
//#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 страницу.


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

Share this post


Link to post
Share on other sites

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

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

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

Edited by andryxa

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Как сделать ИП с ультрашироким диапазоном?

Ключевыми особенностями высоковольтных SiC MOSFET Wolfspeed являются малое сопротивление канала в открытом состоянии и минимальное значение паразитных емкостей, что позволяет максимально снизить статические и динамические потери, и, соответственно, увеличить рабочую частоту преобразователей.

Подробнее

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

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

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


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

Share this post


Link to post
Share on other sites

Вебинар «Практика разработки IoT-устройств с BlueNRG-LP – волшебной палочкой разработчика» (23/03/2021)

Приглашаем 23 февраля на бесплатный практический вебинар по BlueNRG-LP - новой SoC STMicroelectronics. Будут рассмотрены новые возможности создания прототипов IoT-устройств на BlueNRG-LP с использованием экосистемы и отладочных средств ST, а также практические примеры по использованию BlueNRG-GUI v.4.0.0, настройке и работе в сети BLE-MESH, пример управления умным домом с помощью BlueNRG-LP и другие.

Подробнее

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;
}

 

Share this post


Link to post
Share on other sites

Материалы вебинара Практическое использование TrustZone в STM32L5

Материалы вебинара, посвященного экосистеме безопасности и возможностях, которые дает новая технология TrustZone в МК STM32L5, содержат две подробные практические работы: создание простого приложения с изоляцией в TrustZone, и пример отладки и тестирования TFM-SBSFU. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

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

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

Код такой:

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



 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.

 


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

Share this post


Link to post
Share on other sites

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

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

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

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

 

 

555.JPG

Share this post


Link to post
Share on other sites
1 час назад, Вуйко сказал:

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

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

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


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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

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

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

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

IMG_20190927_141042_1.jpg

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


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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites
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];

 


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

Share this post


Link to post
Share on other sites

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


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

Share this post


Link to post
Share on other sites

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

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


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

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...