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

Запускаем новый BLE 5.2-чип BlueNRG-LP от STMicroelectronics

Любая разработка начинается с чтения документации и изучения доступных средств разработки. Данный материал целиком посвящен средствам разработки, включая детальные инструкции по запуску вашего первого приложения на BlueNRG-LP. Описана работа с отладкой STEVAL-IDB011V1, набором инструментов и пакетом ПО позволяющим разработчику быстро войти в курс дела.

Подробнее

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

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

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


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

Share this post


Link to post
Share on other sites

Революция в силовой электронике. Начало

Что привлекает в SiC по сравнению с кремнием, и какие особенности делают компоненты SiC часто используемыми, несмотря на более высокую стоимость в сравнении с кремниевыми высоковольтными устройствами? – Объясняет специалист ведущего разработчика силовых приборов из карбида кремния, компании Infineon.

Подробнее

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...

  • Сообщения

    • Я написал про это выше про тему про коллайдер.                                                                                                                                   Там разогнанные электроны полем могут врезаться в пластину, и застревая в ней, могут накапливаться и этим увеличивать в ней количество заряда. Разгон разностью потенциалов электрона в вакууме затруднительно в моём случае, потому что моя пластина в районе одного квадратного метра, а может в процессе наладки схемы быть и больше. И это будет кинескоп от телика на несколько метров из толстого стекла    Потребуется очень дорогой заказ со стекольного завода такого произведения , плюс многие квадратные метры для расположения этого. Вот я думаю, можно электроны разгонять высоким напряжением вырванным из атомов воздуха, или из нагретой до красна тены, или всё вместе. Например, есть такая схема.                                                                                                         В лампе между горячим катодом и сеткой её создаётся высокое напряжение. Электроны испаряемые горячим катодом сильно притягиваются сеткой и этим самым сильно притягиваются к ней. Потом при подходе к ней их скорость доходит почти до скорости света. И они из-за этого не успевают на ней затормозить и пролетают сквозь неё на анод лампы. Этим анодом можно сделать одиночную пластину для накачивания этими электронами, то есть большим количеством заряда. То есть надо просто поставить в воздухе сетку заряженную высоки положительным потенциалом, например Вольт 100 000. А за ней расположить пластину. Может перед этой заряженной сеткой добавить нагретую спираль для подсоса с ней электронов. Часть электронов эта сетка буде брать из этой спирали нагретой а часть из воздуха. И эти разогнанные электроны сеткой, будут не успевать затормозить на ней и будут пролетать к пластине в которую будут врезаться и накапливаться там, повышая этим там количество заряда.               Но эта положительная сетка будет с этой отрицательной пластиной образовывать ведь конденсатор, опят двух сторонняя поляризация, а нужна односторонняя, одиночной пластины. Получается какой то замкнуты круг Может разгонять электроны магнитным полем. Оно не будет образовывать конденсатор, двух стороннюю поляризацию.                                                                                                                                    Но переменное магнитное поле электроны будет дёргать в обе стороны, что не разгонит их в одну. Тогда нужно прилагать постоянное магнитное поле. Но это какой большой постоянный ток, мощность МегоВатты..
    • Kodkey, а какая задача стоит? Может можно проще сделать?
    • Да это идея, мне нужна как раз заряженная отрицательно пластина.                                                                                              Работа коллайдера основана на разгоне частиц. Так можно последовательными высоковольтными обмотками разгонять электроны в одиночную пластину. Они же будут ударяясь об неё застревать в ней. Так они со временем накопятся в ней, что даст большое количество заряда на этой одиночной пластине.      Да Ван дер Граф накачивает заряды, но он их накачивает по уровню их (потенциал их, напряжение), а не по количеству, на одиночную пластину (шар) его.  Увеличивающееся напряжение там приводит, к увеличению количества заряда. Например по логике, глубина дырки атома это уровень напряжения. Чем глубже дырка атома тем большее количество электронов там не хватает. А это большее количество их и есть большее количество зарядов, что доказывает, что повышение напряжения (потенциала пластины) приводит к повышению на ней количества заряда, без всякого внешнего приложенного поля конденсатора. Но это на напряжении до 7ми миллионов Вольт. Но по логике если стеклянной щёткой терануть в нём по резиновой ленте, то мы в ней выдерем электроны в ней. Дырки образующиеся на атомах резиновой ленты прикладываются через вторую щётку на шар одиночную пластину. С этого шара электроны стекают (заряжая его положительно), на эти дырки атомов в резиновой ленте. Так постепенно идёт отсос электронов с этого шара одиночной пластины до очень глубоких дырок его атомов, глубиной в 7 миллиардов Вольт. Но этот отсос осуществляется с шара противовесом поля второй пластиной (вторым шариком) как в конденсаторе, на которую уходят эти электроны. Без этого разгона внешнего поля, тирки щётки всего на десятки Вольт не перейдут на 5-7 миллионов Вольт шара. Так же эта вторая пластина (небольшой шарик), на рисунке номер 8, служит для проскакивания искры, демонстрации набранного большого напряжения:   Так, что видно на этом рисунке, что здесь не одиночная пластина, а конденсатор. А мне нужна одиночная пластина для односторонней поляризации. Может быть этот Вандеграфф может набрать количество заряда, и без второй пластины (шарика)       Я про это забыл, спасибо что напомнили Вот если по этому методу, одиночную пластину сделать в виде банки (шара),  а вторую пластину поместить в центр её. Тогда внутренняя пластина в банке будет воздействовать своим полем на эту банку, накачивая туда заряды по количеству как в конденсаторе. А эта  внешняя банка, по правилу: -"Внутри проводящих материалов поля нет",  не будет создавать поле на внутреннюю пластину. И тогда эта внешняя банка накачается большим количеством заряда как в конденсаторе, но она будет вести себя как одиночная пластина. Поле у неё будет только с одной стороны, снаружи. Будет нужная  односторонняя поляризация, как в одиночной пластине которая нужна.
    • @stixo ,подсказать тут невозможно от слова вообще. Приборы-опыт в ремонте есть? Судя по написанному без огорчений дешевле и проще обратитесь к внятному специалисту,сэкономите время и дензнаки. Удачи! Дефект поддается ремонту
    • Прогар убирай,все верно. Непредсказуемые последствия 101% точно. Ну и секс с паяльником по закону подлости как только установишь это в авто
    • Жив еще курилка Тембр то? Это хорошо. Попробуйте тут ознакомиться http://rt22.ru/viewtopic.php?f=14&t=30195 https://rt20.getbb.ru/viewtopic.php?f=5&t=18401&start=50&st=0&sk=t&sd=a Может что отыщется. Навскидку сложно сказать,слишком много времени прошло с последнего Тембра  
×
×
  • Create New...