artos5 Опубликовано 24 сентября, 2019 Поделиться Опубликовано 24 сентября, 2019 Доброй ночи всем! Нашел в интернете примеры. И решил себе тоже применить. Но вот засада , то ли сохраняется корректно , то ли не считывается. Кто подскажет где косяк? Скрытый текст //=== чтение и запись с/в флешь ===// //#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 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
andryxa Опубликовано 25 сентября, 2019 Поделиться Опубликовано 25 сентября, 2019 (изменено) Первое что бросается в глаза, у вас адреса не правельные, должны начинатся на 0х08.... Второе проверить правильно-ли записали в память можно с помощью куб программера, оч простая и удобная программа от ST. #define MEM_CRC 0x0801F800 // адрес переменной в памяти контроллера uint32_t crc = *(__IO uint32_t *)MEM_CRC; // чтение из памяти контроллера в переменную Мог-бы и с записью во флешь помочь, но у меня все на HAL Изменено 25 сентября, 2019 пользователем andryxa 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
andryxa Опубликовано 25 сентября, 2019 Поделиться Опубликовано 25 сентября, 2019 В другой теме вы про подсчет црц спрашивали в каждой строке, если это для записи в бутлоадер, то можно считать одну контрольную сумму для всего файла. Это можно делать автоматически самим компилятором при помощи этой программы http://srecord.sourceforge.net/man/man1/srec_info.html 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
artos5 Опубликовано 25 сентября, 2019 Автор Поделиться Опубликовано 25 сентября, 2019 1 минуту назад, andryxa сказал: В другой теме вы про подсчет црц спрашивали Нет , нужно именно в хекс файле строки править. Текст отображаемый на дисплее 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 25 сентября, 2019 Поделиться Опубликовано 25 сентября, 2019 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; } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 26 сентября, 2019 Автор Поделиться Опубликовано 26 сентября, 2019 В общем , я в замешательстве.... Написал кусок кода для отладки терминалом. Код такой: Скрытый текст 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 : ...НP.НP...... 93 4F 00 08 95 4F 00 08 CD 50 00 08 99 4F 00 08 :Н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 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..O.НPНP 04 4B 13 B1 04 48 AF F3 00 80 01 23 23 70 10 BD : НP.O.НµO.НP.НP.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.НµO.НP.P.... E4 01 00 20 8C 73 00 08 03 46 13 F8 01 2B 00 2A : НP.НP...... FB D1 18 1A 01 38 70 47 81 F0 00 41 02 E0 00 BF : PЌO.“OННPP.P.бOНP 83 F0 00 43 30 B5 4F EA 41 04 4F EA 43 05 94 EA :НP™O‘OНPPН™O. 05 0F 08 BF 90 EA 02 0F 1F BF 54 EA 00 0C 55 EA : ..НP.НPН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ЏO™OН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©НP‘OP.НP 4F EA 01 31 4F F4 80 1C 4C EA 11 31 02 D0 40 42 :НP.НPНPНP.O.НPН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..O.НP.. 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 : .PP.бOP.... 03 FA 0E FC 28 BF 4C F0 02 0C 43 FA 05 F3 C0 18 : .НPНP.™O.НPЌO 51 EB E3 71 01 F0 00 45 07 D5 4F F0 00 0E DC F1 :НPP..O.НP..Н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 : O.НOPЈO‘OНP•O. 04 F1 01 04 4F EA 44 52 12 F5 80 0F 80 F0 9A 80 : ..НP™O.НP.НPНP BC F1 00 4F 08 BF 5F EA 50 0C 50 F1 00 00 41 EB : НPНPНЈOНP.НP.. 04 51 41 EA 05 01 30 BD 5F EA 4C 0C 40 41 41 EB : .PP..‘OЈOНP.НPP 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 :™O‘OН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. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 27 сентября, 2019 Поделиться Опубликовано 27 сентября, 2019 Приведенный код нормально пишет в память. Значения после подключения/отключения питания в памяти сохраняются. Советую искать ошибку в алгоритме отладки. Проверить правильность записи можно и без дополнительных усилий. После записи и повторного подключения питания нужно просто подключится к МК с помощью ST-Link Utility и его средствами посмотреть что там по заданному адресу в памяти записалось. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 27 сентября, 2019 Автор Поделиться Опубликовано 27 сентября, 2019 1 час назад, Вуйко сказал: заданному адресу в памяти записалось. Да это я знаю. Читает некорректно . И при считывании терминалом , тоже иногда абракадабра считывается. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
snn_krs Опубликовано 27 сентября, 2019 Поделиться Опубликовано 27 сентября, 2019 В руководстве по программированию есть такое требование: For write and erase operations on the Flash memory (write/erase), the internal RC oscillator (HSI) must be ON Проверьте на всякий случай включен у вас HSI или нет. При запуске он всегда включен, но если работаете на внешнем кварце, то могли выключить. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 27 сентября, 2019 Автор Поделиться Опубликовано 27 сентября, 2019 проверил у себя . У меня запись не проходит... Ст линком не видно тестовых данных. 1 час назад, Вуйко сказал: заданному адресу в памяти записалось. Да это я знаю. Читает некорректно . И при считывании терминалом , тоже иногда абракадабра считывается. Кстати , у меня нет таких адресов... Последний адрес в памяти 0х08008710.... Неужто подделка чипа ? Стоп , вижу те адреса теперь. У меня неправильно был задан размер памяти . 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Вуйко Опубликовано 27 сентября, 2019 Поделиться Опубликовано 27 сентября, 2019 И что там по адресам? Записанные данные есть? Переменная FLASH_BASE правильно задана? Если данных нет, то только по шагам смотреть что в функции записи происходит отладчиком. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 27 сентября, 2019 Автор Поделиться Опубликовано 27 сентября, 2019 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]; 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 27 сентября, 2019 Автор Поделиться Опубликовано 27 сентября, 2019 Проверил более тщательно , копируется в ОЗУ . Но во флешь не записывается . 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 27 сентября, 2019 Автор Поделиться Опубликовано 27 сентября, 2019 Разобрался!!! Это ужас просто! Косяк такой простой , но оказывается незаметный )) В общем проблема была с адресацией памяти в буфере. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.