Датчики температуры DS18B20 снискали славу среди разработчиков электроники благодаря их точности (погрешность до полуградуса) и невысокой цене (0.2$ на алике). Кроме того, несколько датчиков можно запараллелить в одну шину и измерять последовательно разные температуры, используя только один порт 1-Wire, ведь у каждого датчика есть уникальный ID записанный изготовителем.

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

Алгоритм написан на языке программирования Си.

В микроконтроллерах серии STM32F1x3 (например, STM32F103C8T6 из популярной BluePill) есть часы реального времени, они "тикают" от батарейки после того, как пропадает основное питание. Но в этих RTC нет аппаратного календаря. Это значит, что дата "не идёт". Даже если вы в своем HAL проекте установили галочку "activate calendar", это значит, что дата будет "идти" при наличии основного питания, но после прекращения питания ДАТА СОБЬЕТСЯ до 01.01.2000. Это плохая новость... Хорошая новость. В STM32F1x3 есть BackupSRAM - резервная память, питающаяся от батарейки. Она будет хранить информацию до тех пор, пока не сядет батарейка-таблетка (например, срок службы CR2032 3-5 лет). В эту память можно сохранять какие-нибудь настройки, да хоть саму дату.

Tags: ,

В такой нагруженной системе важна аккуратность. У меня на столе STM32F407VET6 со 128 кБ SRAM и 512 кБ FLASH. И на ней реализован Modbus TCP/IP, Modbus RTU RS485, Modbus RTU RS232, +CAN шлюз. Под FreeRTOS работают LwIP, FATFS. Для начальной "завязки" необходимо выделить память

  • Под кучу FreeRTOS 32-48 kB
  • Под стек LwIP 2048 B

Со временем постепенно можно увеличивать или оптимизировать эти значения, менять количество PBUF'ов, NETCONN'ов, размер стека задач и т.д. Но я привел значения, при которых минимальный объем задач FreeRTOS с остальными стеками, работающими одновременно, будет выполняться без глюков.

Принципы чтения и записи FLASH памяти в STM32F0 мало чем отличаются от подобных принципов для других семейств. Описываемый далее метод так же неплохо работает и в STM32F1 (проверено на STM32F103C6T6A). Библиотека HAL позволит унифицировать знания, то есть пользоваться функцией стирания/записи можно аналогично, независимо от модели микроконтроллера.

Первое, что стоит хорошо понять:

  1. память FLASH всегда начинается с адреса 0x08000000
  2. память FLASH всегда разбита на страницы и стирать данные мы можем только страницами (это 1 килобайт или 2 килобайта, читайте datasheet), а не по одному байту или слову.
  3. нельзя записать новые данные поверх старых данных. Перед записью новых данных необходимо сделать стирание нужной страницы.
  4. адрес страницы это не 1,2,3,4,5.. это абсолютный адрес в адресном пространстве, пример 0x08000000, 0x08000400, 0x08000800 и т.д. (внимание, адреса в примере актуальны для страниц размером 1 кБ).
  5. Исполняемая программа записывается в первую страницу, начиная с адреса 0x08000000 и занимает ровно столько страниц, сколько ей требуется, остальные страницы не записываются при прошивке (и не стираются тоже). Конфигурацию записывайте в неиспользуемые страницы. Например, в STM32F030F4P6 всего 16 страниц памяти по 1 кБ и если размер прошивки меньше 15 кБ, то смело пишите настройки в последний (16-ый) сектор.
  6. Не записывайте данные на флешку слишком часто, у нее ограниченное количество циклов стирания/записи (как правило, 10000 циклов). Флешкой нельзя пользоваться так же как EEPROM.