admin

Запись Данных По Flash Память Напрямую С Coide

14 сообщений в этой теме

admin    2 304

Вопрос такой, известно, что у большинства STM32 нет EEPROM памяти и данные нужно хранить в Flash памяти. С чтением и записью данных я разобрался, данные (настройки) храню в последней 127 странице памяти. Эти самые настройки я передаю по UART, только вот проблема такая, что мне нужно при прошивке МК и первом запуске программы, эти настройки напрямую записать в память, т.е. дефолтные. В CooCox CoIDE я такого не нашел. Возможно вообще такое?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hd44780    189

Здравствуйте.

Если ещё актуально ..

С STM32 пока дел не имел, но можно просто при каждом запуске прошивки проверять, есть ли там данные (например, если все ячейки равны FF, то ничего там нет).

Если там пусто - прошивать умолчания.

Насчёт прошивки - в разных средах есть файлики, которые говорят линкеру, куда чего писать. Я пользуюсь IAR-ом, у него есть файлы .icf, там сидят эти адреса. Хотя никогда не пользовался. Знаю лишь теоретически :) .

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
admin    2 304
С STM32 пока дел не имел, но можно просто при каждом запуске прошивки проверять, есть ли там данные (например, если все ячейки равны FF, то ничего там нет).

Если там пусто - прошивать умолчания.

Да, я так и сделал, просто было интересно именно насчет CoIDE, но по видимому там такое не предусмотрено

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Bokopor    0

Эти самые настройки я передаю по UART, только вот проблема такая, что мне нужно при прошивке МК и первом запуске программы, эти настройки напрямую записать в память, т.е. дефолтные.

Здравствуйте! Создайте массив во флэш памяти нужного Вам размера, и загоните значения которые Вам надо. Это если Вам не нужно будет их в дальнейшем изменять.

Если нужно будет изменять данные, а на борту ЧИПа нету еепром - придется прикручивать внешнюю память 24Схх

Посмотрите в хелпе к компилятору как объявить массив.

Изменено пользователем Bokopor

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
admin    2 304

Изменять данные в последствии нужно. Как загонять туда данные я знаю. EEPROM на борту присутствует у STM32.

Вопрос тут в другом

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    558

При резервировании области flash под еепром, скорее всего объявляется массив с необходимым размером. Если это так, то можно при объявлении прописывать дефолтные значения, типа:

const flash   ee_flash_arr[1024]={0x00, 0x01, 0x02,... };

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Загрузка...
artos5    285

А разве в программе можно флэш перезаписывать? :unknw:

Она-же вроде только раз может записаться.. при прошивке.

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

Самое маленькое и простое это 24Схх или 93Схх соответственно I2C и SPI . Скорость работы у 93 серии выше чем у 24.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
admin    2 304

У STM32 есть энергонезависимая флэш, просто она совмещенная. Данные там нормально можно хранить, записывать и считывать, вот рабочий код: http://forum.cxem.ne...3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IVM    0
В 27.11.2012 в 10:31, admin сказал:

нужно при прошивке МК и первом запуске программы, эти настройки напрямую записать в память, т.е. дефолтные. В CooCox CoIDE я такого не нашел. Возможно вообще такое?

-- У меня тот же вопрос: Кто нибудь уже решил проблему ? 

Использую stm32f103с8 память 64К, нужно разместить дефолтные калибровки на 64 странице(FLASH_PAGE_63   0x800FC00) в CooCox CoIDE. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IVM    0
В 07.07.2017 в 12:15, Zhuk72 сказал:

Второе сообщение. Пробуйте.

-- Спасибо! Пока ничего не получилось. 

С указанием адреса там только последний пример (е). Вставляю код:

const unsigned long const Table[200] __attribute__ ((section(".Table")))={ 0 } ;//;

//linkscript add the like this:
?rom(rx): ORIGIN = 0x0800FC00, LENGTH = 0x00000100
.Table : { (0,0) } //> rom

на строке со знаком вопроса(перед rom(rx)) пишет:

Цитата

Multiple markers at this line
    - Syntax error
    - Missing ;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Zhuk72    12

Так ведь второе надо не в код добавлять, а куда-нибудь в настройку линкера.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
oops13    0

Форумчане, коллеги! Подскажите, пожалуйста. CoIDE выдает вот такую ошибку при записи во флешпамять:  Error: Connect failed, check config and cable connection. Со шнуром USB всё в порядке, ST-Link Utility установил. Но в диспетчере устройств драйвер STM32 почему-то именно в разделе дисковых устройствах отображается(в контроллерах USB его нет). На отладочной плате Discovery горит Красный светодиод. Настройки дебаггера в CoIDE прилагаю. Спасибо.

Настройки дебаггера.

stm32_debugger_settings.JPG

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Arduino Master
      Всем доброго дня,
      Начинаю изучать STM32. Запустил пример http://www.avislab.com/blog/stm32-timer-pwm/ в котором при нажатии двух кнопок увеличивается и уменьшается яркость на ножке PB6 все работает.
      Хотел переключить ШИМ на другую ножку в 28 строке поменял GPIO_Pin_6 на GPIO_Pin_7 переключил светодиод на PB7 код не работает.
      Подскажите что я не правильно делаю?


       
       
       
    • Гость иван79
      Автор: Гость иван79
      Добрый день. Начал изучать микроконтроллеры, уроков в интернете на Си достаточно, на ассемблере не так много, может быть кто—то использует ассемблер, и поможет с ответами. Установил keil, в нем пытаюсь что—то писать.
      Вопрос первый у меня такой, как мне отслеживать бит в конфигурационном регистре, например в RCC, в регистре должен установиться флаг, как мне его отследить в цикле? Если конкретнее как прочитать значение этого бита, 0 там или уже 1. Бит бандинг работает только для установки бита или и прочитать можно? Как проще отследить значение бита?
      Или вот второй вопрос, с помощью директивы EQU я дал имя адресу конфигурационного регистра, а как задать имя битам этого регистра?
      Спасибо за помощь
    • Автор: Arseniy Popov
      Добрый день! Необходимо подобрать микроконтроллер, который будет получать команды по serial от esp8266 и димировать RGBW светодиод по следующему алгоритму: 
      https://docs.google.com/document/d/1FkPLiIgxleuDQn8pjihICQGRrMPXbwFzqCt6StQZjhU/edit?usp=sharing
      а также написать для него прошивку на си.
      Отвечать можете в телеграм arsenicum32 или сюда.
      Пишите цену / сроки, находитесь ли в МСК и/или в области.
    • Автор: Zhuk72
      Доброго дня всем.
      Такое вот дело, нужно сделать некую железку, функционал сейчас не важен. Имеется на руках плата Nucleo-F401RE и дисплей.
      Поскольку сделан он под Ардуину, а платы Nucleo имеют (в том числе) совместимую с ним разводку разъемов под периферию, дисплей втыкается без переделки, как есть. Все это и красиво и удобно, но вот шина данных, а в данной реализации дисплея используется 8-битная шина, не попадают пин-в-пин с портами МК. Переделка не планируется, надо исходить из то, что есть. Следовательно имеем такую картину:
      LCD_D7 - PA8 LCD_D6 - PB10 LCD_D5 - PB4 LCD_D4 - PB5 LCD_D3 - PB3 LCD_D2 - PA10 LCD_D1 - PC7 LCD_D0 - PA9 Чтобы отправить байт в дисплей, нужно его раскидать побитно. Моя реализация работает, вот так она выглядит:
      void lcd35_setData(unsigned char lcd35_data) { // Share data between data bus pins. unsigned int d7, d6, d5, d4, d3, d2, d1, d0; // Clear data bus pins. GPIOA->BSRR = (GPIO_BSRR_BR10 | GPIO_BSRR_BR9 | GPIO_BSRR_BR8); GPIOB->BSRR = (GPIO_BSRR_BR10 | GPIO_BSRR_BR5 | GPIO_BSRR_BR4 | GPIO_BSRR_BR3); GPIOC->BSRR = GPIO_BSRR_BR7; // Split bits d7 = (unsigned int)((lcd35_data & 0x80) << 1); d6 = (unsigned int)((lcd35_data & 0x40) << 4); d5 = (unsigned int)((lcd35_data & 0x20) >> 1); d4 = (unsigned int)((lcd35_data & 0x10) << 1); d3 = (unsigned int)(lcd35_data & 0x08); d2 = (unsigned int)((lcd35_data & 0x04) << 8); d1 = (unsigned int)((lcd35_data & 0x02) << 6); d0 = (unsigned int)((lcd35_data & 0x01) << 9); // Set data GPIOA->ODR |= (d7 | d2 | d0); GPIOB->ODR |= (d6 | d5 | d4 | d3); GPIOC->ODR |= d1; } Может можно сделать оптимальнее? Это прилично замедляет вывод изображения, особенно если выводить картинку целиком (480*320 по 2 байта на пиксель). Я всегда подстраивал железо под удобство написания кода, а тут вот вынужден извращаться.
      Кстати, гугление по данному экрану (Renesas R61581) выводило только на ардуинистов, неужели никто не подключал его к другим железкам?! Он, говорят, почти совместим с ILI9488. Я бегло прошелся по протоколу оного, да, есть такое, но в команды не углублялся. Вроде все отличие кроется в инициализации.
      P.S. Сейчас вот подумал, может сперва стоило привести lcd35_data к соответствующему типу, а потом уже применять маску и сдвиг.
    • Автор: Holm
      Приветствую!
      Собираю пульсоксиметр на MAX30100. Нашел на просторах интернета готовый код,но под STM32,но на винду хп драйвера не идут.
      Может кто-нибудь помочь переделать код под Ардуино Уно. Отблагодарю))