Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » CERGEI » Работа с FLASH памятью stm32f103c8t6


Работа с FLASH памятью stm32f103c8t6

Сообщений 1 страница 9 из 9

1

Эх хорошо выходные,можно заняться любимым делом хоть ))
Почитав Ссылка и разобравшись с флэш памятью для сохранения настроек и т д решил написать заметку.
Конечно не очень удобно для записи например 3 байт стирать все время одну страницу памяти,но как есть.
Решил записывать в последнюю страницу памяти начиная с 0х0801FC00 три переменные с помощью HAL , хотя легко можно было и на регистрах это сделать. Заодно подумал по изучать HAL навороченный.

Запись

Код:

	FLASH_EraseInitTypeDef Flash_erase;
	HAL_StatusTypeDef Return_erase=NULL;
	HAL_StatusTypeDef	flash_ok = HAL_ERROR;
	
	uint32_t Error=0;
	uint16_t Write_flash_yst=0,Write_flash_giz=0,Write_flash_on=0;
	
	Flash_erase.TypeErase=FLASH_TYPEERASE_PAGES;
	Flash_erase.PageAddress=0x0801FC00;
	Flash_erase.Banks=FLASH_BANK_1;
	Flash_erase.NbPages=1;

	// erase sector and write ystavok, bank 127 c adress
    // 0x0801FC00 - 0x0801FFFF
    flash_ok = HAL_ERROR;
    while(flash_ok != HAL_OK){
    	flash_ok = HAL_FLASH_Unlock();
    }
    
    if (HAL_FLASHEx_Erase(&Flash_erase, &Error) != HAL_OK) 
    {     
    	Return_erase=HAL_FLASH_Lock();
    }
    
    // write ystav
    flash_ok = HAL_ERROR;
    while(flash_ok != HAL_OK){
    	flash_ok = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x0801FC00, Write_flash_yst);
    }
    
    // write giz
    flash_ok = HAL_ERROR;
    while(flash_ok != HAL_OK){
    	flash_ok = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x0801FC02, Write_flash_giz);
    }
    
    // write on_off
    flash_ok = HAL_ERROR;
    while(flash_ok != HAL_OK){
    	flash_ok = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x0801FC04, Write_flash_on);
    }
    
    flash_ok = HAL_ERROR;
    while(flash_ok != HAL_OK){
    	flash_ok = HAL_FLASH_Lock();
    }


Чтение попроще
error_read_flash для того,что память не записанная 0xffff . Хотя ячейка же 32 битная,но пихая в переменную 16 бит я просто наверно обрезаю верхние 16 бит или поправите меня.
Но в отладчике проверял все нормально...

Код:
	
 
      uint16_t ystav_m,giz_m,on_m;

        // read ystav,giz,on_off
	 // adress
	 // ystav= 0x0801FC00
	 // giz  = 0x0801FC02
	 // on_off = 0x0801FC04
	 
        ystav_m = (*(__IO uint32_t*) 0x0801FC00);
        giz_m = (*(__IO uint32_t*) 0x0801FC02);
	 on_m = (*(__IO uint32_t*) 0x0801FC04);
	 if((ystav_m==0xffff)&&(giz_m==0xffff)&&(on_m==0xffff))
            error_read_flash=1;
	 else
            error_read_flash=0;


http://s3.uploads.ru/t/I8TKj.png

http://s5.uploads.ru/t/0eqmB.png

2

Для удобства можно из последней страницы сделать отдельную секцию, а данные представить в виде структуры. Так удобнее читать, ну еще юнион с этой структурой и массивом для записи. Это для того чтобы избавиться от абсолютных адресов в программе это же арм.

3

Можно пример ?

4

Попробую, наработки где-то были. Тоже на каникулах)

5

https://drive.google.com/open?id=1UoQ4D … IjnZRJziwX
Примерно так, не проверял, функции работы с флеш не проверены. Компилятор зараза оптимизирует код и вообще не создает переменные в моей секции, поэтому ввел еще указатель на структуру во флеш.

6

Хм иногда три мои ячейки затираются нулями. Пробовал отловить в дебаге, не попадает на запись по точкам останова. Странно.. Если дальше будет так, то вместо халовских напишу управление вручную ...

7

так в статье все готово я по ней как-то пробовал все нормально было. Какие-то плюсы есть при использовании HAL? не ради холивара спрашиваю просто интересно ты вроде и на CMSIS нормально пишешь. Попробую отладить свой проект, но обещать не буду скрутило меня долго сидеть не могу.

Отредактировано MasterElectric (2019-01-08 16:38:05)

8

Чуть по позже перепишу,если глюк будет,сейчас дописываю задачу еще одну и очередь сообщений. А то потом время мало мне на хобби среди работ своих :) Хал пробую ради самообразования,пробовать нужно все и потом выбирать самое удобное. Стерты были ячейки даже при установленном бите LOCK.
Посмотрю твой код обязательно,как проект добью. Выздоровления тебе,сам болел до нового года страшно. Кашель и простуда и потом почки,сейчас норм отпустило.

9

Спасибо!


Вы здесь » Микроконтроллеры » CERGEI » Работа с FLASH памятью stm32f103c8t6