Как сделать программный сброс stm32

Обновлено: 06.07.2024

В статье описан способ программной эмуляции EEPROM в микроконтроллерах ARM Cortex-M4 производства STMicroelectronics. Рассматриваются преимущества и недостатки такого способа по сравнению с другими способами энергонезависимого хранения данных. Статья основана на документе Application note AN3969 “EEPROM emulation in STM32F40x/STM32F41x microcontrollers”. Описанный способ программной эмуляции EEPROM может быть использован и для других микроконтроллеров, в которых отсутствует встроенная EEPROM-память.

Введение

Ко многим электронным устройствам предъявляется требование сохранять свое состояние или какие-либо данные при выключенном питании. Для хранения таких данных служит класс энергонезависимой памяти. Этот класс очень обширен, тем не менее когда речь идет о встраиваемых системах и небольших объемах памяти, то одной из наиболее применяемых технологий является EEPROM-память.

Из преимуществ EEPROM следует отметить произвольный доступ и большой ресурс циклов запись/чтение — до миллиона раз. Память EEPROM может быть выполнена как в виде отдельной микросхемы (например, AT24C256 [1]), так и встроена в микроконтроллер (например, семейства микроконтроллеров AVR, PIC).

К сожалению, микроконтроллеры ARM Cortex-M4 компании STMicroelectronics (к которым относится семейство STM32F40x/STM32F41x) не содержат встроенной EEPROM. И если разработчик желает использовать EEPROM-память, то она должна быть представлена в виде внешней микросхемы, подключенной к микроконтроллеру по одному из последовательных или параллельных интерфейсов (I 2 C, SPI и др.)

Отдельная микросхема EEPROM увеличивает себестоимость устройства, поэтому для решений, где важна минимальная стоимость, внешнюю EEPROM можно заменить благодаря одной из следующих возможностей семейства STM32F40x/STM32F41x:

  • Расположенная на кристалле 4‑кбайтная резервная память SRAM с отдельным батарейным питанием.
  • Расположенная на кристалле flash-память плюс дополнительное программное обеспечение для эмуляции EEPROM.

В микроконтроллерах STM32F40x/STM32F41x можно задействовать 4 кбайт резервной памяти SRAM, которая может быть запитана от отдельного источника VBAT, когда основное питание VDD отключено. Резервная память SRAM может быть использована как внутренняя EEPROM без какого-либо дополнительного программного обеспечения так долго, пока на микроконтроллер подается напряжение VBAT (например, при питании от батарей). При этом достоинством является быстрый доступ к резервной памяти SRAM, так же, как и к обычной внутренней памяти SRAM.

Однако когда резервная SRAM используется для других целей и/или устройство не предусматривает применение автономного питания VBAT, то внутренняя flash-память может служить для эмуляции наличия внутренней EEPROM-памяти на кристалле (в этом случае необходимо реализовать алгоритм эмуляции EEPROM-памяти).

При эмуляции EEPROM задействуется как минимум два сектора flash-памяти. Алгоритм эмуляции записывает данные в один сектор, а другой остается чистым. Как только один из секторов заполняется данными, алгоритм обменивает содержимое этих секторов flash-памяти. Программное обеспечение для эмуляции EEPROM средствами встроенной flash-памяти будем называть драйвером EEPROM.

Основные черты драйвера EEPROM:

  • Легковесная реализация с простым интерфейсом API, который содержит всего три функции для инициализации, чтения и записи данных.
  • Минимальный износ flash-памяти: страница стирается только тогда, когда заполнена на 100%.
  • Очистка памяти и другие внутренние операции с flash-памятью прозрачны для программиста.
  • Очистка сектора в фоновом режиме: обработка прерываний не блокируется во время программирования/стирания сектора.

Конфигурируемый пользователем размер эмулируемой EEPROM. Задействовано как минимум два сектора, хотя можно задействовать больше. В этом случае следует следить за равномерностью использования секторов (технология выравнивания износа Wear Leveling).

Размер эмулируемой EEPROM-памяти можно увеличить, используя сектора flash-памяти большего размера и в большем количестве.

Основные отличия между внешней и эмулируемой EEPROM

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

Микроконтроллеры, используемые в таких системах, наиболее часто имеют встроенную flash-память. Для того чтобы уменьшить число внешних компонентов на печатной плате, размер самой платы, а также себестоимость устройства, flash-память микроконтроллеров STM32F40x/STM32F41x можно использовать одновременно для хранения кроме кода программы также энергонезависимых данных.

Основное отличие flash-памяти от памяти EEPROM в том, что flash-память не допускает стирания отдельных байтов или слов. Поэтому для повторной записи отдельного байта придется стереть весь сектор, размер которого составляет обычно несколько кбайт. EEPROM-память, напротив, позволяет индивидуально стирать и записывать каждый отдельный байт.

Особенность записи во flash-память и значительно меньший ресурс записи/стирания (10 3 против 10 6 у EEPROM) диктуют требование к алгоритму эмуляции, которое заключается в достижении минимально возможного количества стираний сектора. Поэтому для того чтобы сохранять данные во встроенной flash-памяти, необходимо наличие дополнительного программного обеспечения — драйвера для программной эмуляции EEPROM.

Реализация алгоритма эмуляции зависит от множества факторов, включая требования к надежности EEPROM, внутреннее устройство используемой flash-памяти и требования к конечному продукту.

Отличия между способами хранения энергонезависимых данных не зависят от конкретного семейства микроконтроллеров. Основные отличия сведены в таблицу 1.

Параметр

Внешняя память EEPROM (например, M24C64 —микросхема EEPROM-памяти с интерфейсом I 2 C)

Эмуляция EEPROM
во внутренней flash-памяти

Эмуляция EEPROM с помощью внутренней резервной SRAM

Запись по произвольному адресу:

запись байта — 5 мс;
запись 32-битного слова — 20 мс

Время записи полуслова из 16 бит:
от 30 мкс до 237,25 мс

Со скоростью работы
ядра микроконтроллера

запись страницы в 32 байта — 5 мс;
запись 32-битного слова — 625 мкс

Стирание сектора: от 1 до 3 с (зависит от размера сектора)

Единожды инициированный,
не требует участия процессора,
необходимо только
напряжение питания

Единожды инициированный,
задействует процессор. Аппаратный сброс останавливает запись, программный — нет.

Можно записывать байты (8 бит),
полуслова (16 бит) и слова (32 бит).

Можно записывать байты (8 бит), полуслова (16 бит) и слова (32 бит)

Запись прерывается программным сбросом

Последовательное чтение: сотни мкс

Полуслово: от 0,68 до 251 мкс (для тактовой частоты 168 МГц)

Со скоростью работы
ядра микроконтроллера

Случайное чтение слова: 92 мкс

Чтение страницы: 22,5 мкс на 1 байт

Количество циклов
записи/чтения

1×10 3 на сектор. Использование нескольких секторов увеличивает количество циклов

Не ограничено,
пока подается напряжение VBAT

Так как flash-память обладает меньшим временем доступа, то критические параметры могут быть сохранены быстрее в эмулированной EEPROM, чем во внешней EEPROM, подключенной по последовательному интерфейсу. Но это справедливо лишь тогда, когда не возникает необходимости в стирании сектора flash-памяти.

Разница во времени стирания — еще одно важное отличие внешней EEPROM по сравнению с эмулируемой. В отличие от flash-памяти технология EEPROM не требует операции стирания перед каждой операцией записи. Это означает, что для сохранения данных во flash-памяти необходимо дополнительное программное обслуживание процедур записи/чтения. Более того, процедура стирания страницы flash-памяти занимает продолжительное время, в течение которого не должно быть выключения питания, сброса процессора и других событий, которые могут прервать процесс стирания страницы. Эту особенность следует учитывать при проектировании программы, использующей эмуляцию EEPROM.

Что касается семейства STM32F40x/STM32F41x, то при программном сбросе процесс стирания страницы flash-памяти не прерывается.

Методы записи для эмулируемой и внешней EEPROM схожи. Для внешней EEPROM операция записи, будучи инициирована, не может быть остановлена сбросом микроконтроллера. Только спад напряжения питания может остановить процесс записи. Что касается эмулируемой EEPROM, лишь отсутствие питания может остановить процесс записи. Если при записи очередного слова во flash-память произойдет сброс микроконтроллера, то алгоритм эмуляции, естественно, остановится, но записываемое слово запишется во flash-память полностью.

Принцип работы алгоритма эмуляции EEPROM

Каждая переменная в эмулируемой EEPROM-памяти определяется ее виртуальным адресом и значением. В данной реализации и адрес переменной, и сама переменная заданы длиной 16 бит. Как адрес, так и значение переменной записывается во flash-память так, чтобы в дальнейшем по адресу переменной можно было получить ее значение, а также изменить значение переменной с заданным адресом.

Запись переменной

Когда необходимо присвоить переменной другое значение, новое значение переменной вместе с виртуальным адресом записываются в новое место flash-памяти (в новый элемент на рис. 1).

Формат хранения переменной в эмулируемой EEPROM

Рис. 1. Формат хранения переменной в эмулируемой EEPROM

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

Принцип модификации значения переменной

Рис. 2. Принцип модификации значения переменной

Чтение переменной

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

Поиск переменной при ее чтении

Рис. 3. Поиск переменной при ее чтении

Так как ячейки flash-памяти после стирания хранят значение 0xFFFF, то для переменной можно использовать диапазон виртуальных адресов от 0x0000 до 0xFFFE.

Смена страницы при ее заполнении

Чтобы реализовать этот принцип, каждой странице присваивается состояние. Каждая страница может находиться в одном из трех состояний:

В процессе модификации и записи переменных в эмулируемую EEPROM страницы поочередно меняют свои состояния так, как показано на рис. 4.

Переходы между состояниями страницы 0 и страницы 1

Рис. 4. Переходы между состояниями страницы 0 и страницы 1

Поле заголовка располагается по базовому адресу каждой страницы и предоставляет информацию о ее состоянии. Размер поля заголовка — 16 бит.

Следующий пример показывает процессы заполнения одной страницы и переход к записи на другую при работе с тремя переменными в эмулируемой EEPROM (Var1, Var2, Var3). Соответственно, каждая переменная имеет виртуальный адрес 0x5555, 0x6666, 0x7777 (рис. 5).

Принцип обновления данных во flash-памяти при эмуляции EEPROM

Рис. 5. Принцип обновления данных во flash-памяти при эмуляции EEPROM

Реализация драйвера EEPROM

Здесь описывается реализация драйвера для программной эмуляции EEPROM с использованием flash-памяти микроконтроллеров семейства STM32F40x/STM32F41x. Этот драйвер компания STMicroelectronics предоставляет бесплатно, загрузить его можно по адресу [2]. Демонстрационная программа также включена в состав драйвера.

Непосредственно драйвер EEPROM реализован внутри файлов eeprom.c и eeprom.h. Демонстрационный проект содержит также файл main.c.

Назначение этих файлов:

  • eeprom.c — содержит реализацию следующих API-функций: EE_Init(); EE_Format(); EE_FindValidPage(); EE_VerifyPageFullWriteVariable();EE_ReadVariable(); EE_PageTransfer(); EE_WriteVariable().
  • eeprom.h — содержит прототипы функций и конфигурационные макроопределения. Разработчику предлагается использовать этот файл, чтобы оптимизировать драйвер EEPROM для своего приложения.
  • main.c — демонстрационная прикладная программа, где показано, как использовать функции драйвера EEPROM.

Программный интерфейс (API) драйвера EEPROM

Имя API-функции

Краткое описание

Заголовок сектора может быть поврежден при пропадании напряжения питания во время обновления данных или очистки/копирования всего сектора. В этом случае функция EE_Init() может быть применена для попытки восстановления эмулируемой EEPROM до известного неповрежденного состояния.
Эту функцию необходимо вызывать перед доступом к эмулируемой EEPROM после каждого выключения питания. Функция не получает параметров и возвращает FLASH_COMPLETE при успешной инициализации, в противном случае — код ошибки

uint16_t EE_FindValidPage
(uint8_t Operation);

uint16_t EE_VerifyPageFullWriteVariable (uint16_t VirtAddress, uint16_t Data);

Эта функция реализует процесс записи, который должен также обновить или создать первый экземпляр переменной. Функция ищет первый пустой элемент в активной странице и заполняет его переданными в качестве аргументов функции виртуальным адресом переменной и ее значением.
В случае если активная страница заполнена, возвращается значение PAGE_FULL.

– VirtAddress — виртуальный адрес. Может быть любой из ранее определенных виртуальных адресов.

– Data — данные, значение записываемой в EEPROM переменной.

Функция возвращает FLASH_COMPLETE, если запись прошла успешно, PAGE_FULL, если недостаточно памяти или произошла ошибка, или код ошибки flash-памяти

uint16_t EE_ReadVariable
(uint16_t VirtAddress, uint16_t* Data);

uint16_t EE_PageTransfer
(uint16_t VirtAddress, uint16_t Data);

uint16_t EE_WriteVariable
(uint16_t VirtAddress, uint16_t Data);

Эта функция вызывается из программы пользователя для обновления значения переменной.
Функция использует вызовы EE_VerifyPageFullWriteVariable() и EE_PageTransfer()

Заметьте, что для работы с эмулируемой EEPROM пользовательской программе достаточно вызвать всего лишь три функции:
EE_Init(); EE_ReadVariable();
EE_WriteVariable(). Пример использования этих функций приведен в демонстрационной программе, которая включена в состав драйвера EEPROM [2]. Остальные функции являются служебными и вызываются из приведенных выше трех функций. Например, функция EE_WriteVariable(), которая модифицирует переменную в эмулируемой EEPROM, сводится к действиям (и соответственно, вызовам API-функций), показанным на рис. 6.

Алгоритм обновления значения переменной в эмулируемой EEPROM

Рис. 6. Алгоритм обновления значения переменной в эмулируемой EEPROM

Настройка драйвера EEPROM

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

Настройка осуществляется изменением значений макроопределений, содержащихся в файле eeprom.h. Кроме того, программист должен определить в своей программе массив, содержащий виртуальные адреса всех переменных в следующем виде:

Заметьте, что виртуальный адрес 0xFFFF применять нельзя, так как это число используется как признак пустой ячейки. (Дело в том, что после стирания сектора flash-памяти все двухбайтовые слова в нем будут содержать число 0xFFFF.)

Список конфигурационных макроопределений:

  1. PAGE0_ID и PAGE1_ID— номера используемых секторов (по умолчанию это сектора 2 и 3).
  2. PAGE_SIZE— размер сектора flash-памяти в байтах (по умолчанию 16 кбайт).
  3. EEPROM_START_ADDRESS— адрес начала страницы 0 во flash-памяти. Адрес начала страницы 1 получается как EEPROM_START_ADDRESS + PAGE_SIZE (по умолчанию адрес начала сектора 2 — 0x08008000).
  4. VOLTAGE_RANGE— диапазон питающих напряжений (по умолчанию VoltageRange_3). В демонстрационном проекте есть функция FLASH_ProgramHalfWord(). Она может быть использована, только если питание микроконтроллера составляет от 2,1 до 3,6 В. Если же диапазон от 1,8 до 2,1 В, то следует использовать функцию FLASH_ProgramByte(). (Далее будет подробнее описана эта особенность семейства STM32F40x/STM32F41x.)
  5. NB_OF_VAR— количество используемых переменных в эмулируемой EEPROM и, соответственно, размер массива VirtAddVarTab (по умолчанию 3).

Драйвер эмуляции EEPROM и его реализация, описанные здесь, используют два сектора flash-памяти по 16 кбайт каждый — сектора 2 и 3. Выбор в пользу секторов 2 и 3 сделан исходя из их наименьшего объема относительно других секторов flash-памяти в семействе STM32F40x/STM32F41x. Сектора большого размера можно использовать в зависимости от требований к приложению. Размеры других секторов flash-памяти для семейства STM32F40x/STM32F41x приведены в таблице 3.

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Последние посетители 0 пользователей онлайн

Железная схема. - охохо Значения резисторов неверные, так схема работать не будет(или схема неполная) - ток через резистор R2 не сможет открыть транзистор VT1 @Rede RED предложил решение - по моему оптимально предохранитель на 3 А и диод на 10 А чтоб запасом Если что то городить мудрое, то решений здесь на сайте хватает - из данного ЗУ можно использовать трансформатор, диодный мост - остальное нужно выполнить на новой элементной базе Удачи

grach

Чтобы паяльничек подержать, канифольку вкусную понюхать, проводульки разноцветные покрутить, на форумах с гурами поумничать. Много чего.

pacak7294

Огонёк

Ну как же? Портланд-цемент, шамотные глины - и температуру держат, и диэлектрики. Хороший припой, рекомендую!

drubtsow

На выходе Ланзара 2.7 В постоянки. Поработал минут 20, и такое. Есть предположения какой транзистор помер?

В этой части мы поговорим о том, с чем нам чаще всего придётся оперировать при работе с контроллером — о рабочих регистрах ядра Cortex-M3, о режимах его работы и о том, как контроллер включается.

Итак, в ядре Cortex-M3 имеется 13 регистров общего назначения — R0..R12, регистр, используемый для хранения указателя стека, — R13, регистр связи — R14, счётчик команд — R15 и 5 регистров специального назначения.

Регистры общего назначения разделяются на младшие регистры — R0..R7 и старшие регистры — R8..R12. Разница между ними в том, что некоторые 16-тибитные команды набора thumb-2 умеют работать только с младшими регистрами, а со старшими — не умеют.

Регистров R13 вообще-то говоря два, а не один. Первый называется MSP — указатель основного стека, а второй PSP — указатель стека процесса. Однако в каждый момент доступен только один из этих регистров. Какой именно — определяется в одном из регистров специального назначения. Зачем такое надо? Это сделано для возможности организации защиты операционной системы (ага, на этот контроллер можно поставить ОС, если хочется) от кривых прикладных программ. MSP используется обработчиками исключительных ситуаций и всеми программами, использующими привилегированный уровень выполнения (например ядро ОС), а PSP — используется программами, не требующими привилегированного уровня выполнения (например, прикладными программами от которых мы хотим защитить ядро ОС). Указатели стека всегда должны быть выровнены на границу 32-хбитного слова, т.е. два их младших бита всегда должны быть сброшены в ноль.

Регистр R14 называется LR (link register) — регистр связи и используется для запоминания адреса возврата при вызове подпрограмм.

Регистр R15 называется PC (program counter) — счётчик команд и используется для хранения адреса текущей выполняемой команды.

Теперь о специальных регистрах.

Флаги в регистре APSR стандартные:

  1. N (negative flag) — отрицательный результат операции
  2. Z (zero flag) — нулевой результат операции
  3. C (carry flag) — флаг переноса/займа
  4. V (overflow flag) — флаг переполнения
  5. Q (saturation flag) — флаг насыщения

В регистре PRIORITY MASK используется только нулевой бит (PRIMASK), который будучи установлен в единицу запрещает все прерывания с конфигурируемым приоритетом. После включения бит PRIMASK сброшен в ноль — все прерывания разрешены.

В регистре FAULT MASK также использует только нулевой бит (FAULTMASK), который будучи установлен в единицу запрещает все прерывания и исключения, кроме немаскируемого прерывания (NMI). После включения бит FAULTMASK сброшен в ноль — все прерывания разрешены.

Регистр BASEPRI используется для запрещения всех прерываний, значение приоритета которых больше или равно, чем записано в этом регистре. Тут надо сказать, что чем меньше значение — тем выше уровень приоритета. В регистре BASEPRI используются только младшие 8 бит.

Регистр CONTROL используется для управления одним из режимов процессора — режимом потока. Нулевой бит этого регистра (nPRIV) определяет уровень выполнения (привилегированный — Privilegied, или непривилегированный — Unprivilegied), а первый бит (SPSEL) — используемый указатель стека (MSP или PSP). Разница между привилегированным и непривилегированным уровнями выполнения состоит в том, что для привилегированного уровня доступны все области памяти и все команды процессора, а для непривилегированного уровня некоторые области памяти закрыты (например, регистры специального назначения, кроме APSR, системная область) и, соответственно, команды для доступа в эти обасти — запрещены. Попытка выполнения запрещённых команд, пытающихся обратиться в закрытые области памяти вызывает генерацию исключения отказа.

Теперь о режимах работы процессора.

Процессор Cortex-M3 имеет два режима работы: режим потока (Thread) и режим обработчика (Handle). Режим Handle используется для обработки исключительных ситуаций, а режим Thread — для выполнения всего остального кода. Переключение из одного режима в другой происходит автоматически. Как мы уже говорили, когда разбирались с регистром CONTROL, в режиме Thread процессор может использовать как привилегированный уровень выполнения, так и непривилегированный, в режиме Handle — только привилегированный. Аналогично, в режиме Thread может использоваться как основной стек (MSP), так и стек процесса (PSP), а в режиме Handle — только основной стек.

Важно понимать, что, например, переключившись в режиме Thread с привилегированного уровня в непривилегированный, мы потеряем доступ в регистр CONTROL и обратно сможем переключиться только в режиме Handle. В режиме Handle бит nPRIV регистра CONTROL доступен для чтения/записи, но не влияет на текущий режим выполнения. Это позволяет изменить уровень выполнения, который будет у программы, когда процессор выйдет из режима обработчика в режим потока. Бит SPSEL в режиме Handle для записи недоступен и всегда читается как ноль, а при выходе из режима обработчика в режим потока восстанавливается автоматически. Все варианты переходов между различными режимами и уровнями выполнения иллюстрирует ориентированный граф, представленный на рисунке ниже:

Далее поговорим о том, как контроллер стартует.

Стартует контроллер всегда на внутреннем генераторе, на частоте 8 Мгц. Откуда брать тактовый сигнал в дальнейшем, на сколько его умножать или делить — настраивается в программе. Если в программе этого не сделать, то хоть десять внешних кварцев повесьте, контроллер так и будет работать от внутреннего генератора 8 МГц.

При старте контроллер анализирует сочетание уровней на двух своих ногах — BOOT0, BOOT1, и, в зависимости от этого сочетания, начинает загрузку либо из flash-памяти, либо из ОЗУ, либо из системной области памяти. Это делается с помощью уже описанного нами ранее механизма псевдонимизации. По идее загрузка всегда начинается с нулевого адреса, просто в зависимости от
сочетания на ногах BOOT0, BOOT1 начальные адреса памяти назначаются псевдонимами одной из трёх областей: flash, встроенного ОЗУ или системной области. Справа приведена табличка, в которой указано, какая именно область проецируется в начальные адреса памяти в зависимости от сочетания ног BOOT0, BOOT1.

При этом в системной области производителем зашита специальная программа (bootloader), которая позволяет запрограммировать flash-память. Но об этом позже.

Первым делом контроллер считывает 32-х битное слово по адресу 0x00000000 и помещает его в регистр R13 (указатель стека). Далее он считывает 32-х битное слово по адресу 0x00000004 и помещает его в регистр R15 (счётчик команд). Последнее действие вызывает переход на начало программного кода и дальше начинается выполнение программы.

Надеюсь понятно, что если ногами BOOT0, BOOT1 начальная область памяти установлена псевдонимом, например, flash-памяти, то считывание по адресу 0x00000000 реально приведёт к считыванию адреса 0x08000000 (начало flash-памяти), а считывание адреса 0x00000004 — к считыванию адреса 0x08000004 и так далее.

Ну и в завершение скажу, что стартует контроллер всегда в режиме потока с привилегированным уровнем выполнения.

Микроконтроллеры STM32 приобретают все большую популярность благодаря своей мощности, достаточно разнородной периферии, и своей гибкости. Мы начнем изучать STM32F103C8T6, используя бюджетную тестовую плату, стоимость которой не превышает 2 $ (у китайцев). Еще нам понадобится ST-Link программатор, стоимость которого около 2.5 $ (у китайцев). Такие суммы расходов доступны и студентам и школьникам, поэтому именно с такого бюджетного варианта я и предлагаю начать.

STM32F103C8_01
STLine_01

Этот микроконтроллер не является самым мощным среди STM32, но и не самый слабый. Существуют различные платы с STM32, в томе числе Discovery которые по цене стоят около 20 $. На таких платах почти все то же, что и на нашей плате, плюс программатор. В нашем случае мы будем использовать программатор отдельно.

Микроконтроллер STM32F103C8. Характеристики

  • Ядро ARM 32-bit Cortex-M3
  • Максимальная частота 72МГц
  • 64Кб Флеш память для программ
  • 20Кб SRAM памяти
  • Питание 2.0 . 3.3В
  • 2 x 12-біт АЦП (0 . 3.6В)
  • DMA контролер
  • 37 входов / выходов толерантных к 5В
  • 4 16-розрядних таймера
  • 2 watchdog таймера
  • I2C - 2 шины
  • USART - 3 шины
  • SPI - 2 шины
  • CAN
  • USB 2.0 full-speed interface
  • RTC - встроенные часы

На плате STM32F103C8 доступны

  • Выводи портов A0-A12, B0-B1, B3-B15, C13-C15
  • Micro-USB через который можно питать плату. На плате присутствует стабилизатор напряжения на 3.3В. Питание 3.3В или 5В можно подавать на соответствующие выводы на плате.
  • Кнопка Reset
  • Две перемычки BOOT0 и BOOT1. Будем использовать во время прошивки через UART.
  • Два кварца 8Мгц и 32768 Гц. У микроконтроллера есть множитель частоты, поэтому на кварце 8 МГц мы сможем достичь максимальной частоты контроллера 72Мгц.
  • Два светодиода. PWR - сигнализирует о подачи питания. PC13 - подключен к выходу C13.
  • Коннектор для программатора ST-Link.

Прошивка STM32 с помощью USB-Uart переходника под Windows

Port_01
Port_02

Подключаем RX и TX выходы к соответствующим выводам USART1 микроконтроллера. RX переходника подключаем к TX микроконтроллера (A9). TX переходника подключаем к RX микроконтроллера (A10). Поскольку USART-USB имеет выходы питания 3.3В подадим питания на плату от него.

STM32F103C8_UART_PROG_02

Чтобы перевести микроконтроллер в режим программирования, надо установить выводы BOOT0 и BOOT1 в нужное состояние и перезагрузить его кнопкой Reset или выключить и включить питание микроконтроллера. Для этого у нас есть перемычки. Различные комбинации загоняют микроконтроллер в различные режимы. Нас интересует только один режим. Для этого у микроконтроллера на выводе BOOT0 должно быть логическая единица, а на выводе BOOT1 - логический ноль. На плате это следующее положение перемычек:

STM32F103C8_UART_PROG_01

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

Программное обеспечение для прошивки

После включения схемы с правильно выставленными перемычками контроллер готов к работе с Flash Loader Demonstrator.

Запускаем Flash Loader Demonstrator и выбираем порт с которым будем работать, и устанавливаем параметры порта.

FlashLoaderDemonstrator_01

FlashLoaderDemonstrator_02

Нажимаем Next,

FlashLoaderDemonstrator_03

На этой странице выбираем файл для загрузки в микроконтроллер. Файл может быть в формате bin или hex.

FlashLoaderDemonstrator_04

Нажимаем Next и ждем.

FlashLoaderDemonstrator_05
FlashLoaderDemonstrator_06

Чтобы вывести контроллер из режима программирования, возвращаем перемычки в исходное состояние и нажимаем кнопку Reset. Программа в микроконтроллере должен заработать.

Прошивка STM32 с помощью USB-Uart переходника под Linux (Ubuntu)

Устанавливаем stm32flash

Если используем USB-UART переходник, имя порта буде примерно такое /dev/ttyUSB0

Получить информацию о чипе

Читаем с чипа в файл dump.bin

Пишем в чип

Прошивка STM32 с помощью ST-Link программатора под Windows

При использовании программатора ST-Link выводы BOOT0 и BOOT1 не используются и должны стоять в стандартном положении для нормальной работы контроллера.

STLine_02

Запускаем программу STM32 ST-LINK Utility

STM32ST-LINKUtility_01

Выполняем пункт меню Target -> Connect

STM32ST-LINKUtility_02

Выполняем пункт меню Target -> Erase Chip

STM32ST-LINKUtility_03

Выполняем пункт меню File -> Open file. Выбираем файл для загрузки в микроконтроллер.

STM32ST-LINKUtility_04

Выполняем пункт меню Target -> Programm & Verify.

STM32ST-LINKUtility_05

После завершения прошивки и проверки, загруженная программа автоматически запустится.

STM32ST-LINKUtility_06

Прошивка STM32 с помощью ST-Link программатора под Linux (Ubuntu)

Устанавливаем софт для работы с ST-Link

Пришлось устанавливать autoconf и libusb-1.0:

Проверяем видно ли программатор и чип

Читаем с чипа в файл dump.bin

Программируем STM32

Памятка

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

Документация

Что можно почитать

Маркировка STM32

Device family Product type Device subfamily Pin count Flash memory size Package Temperature range
STM32 = ARM-based 32-bit microcontroller F = General-purpose L = Ultra-low-power TS = TouchScreen W = wireless system-on-chip 60 = multitouch resistive 103 = performance line F = 20 pins G = 28 pins K = 32 pins T = 36 pins H = 40 pins C = 48/49 pins R = 64 pins O = 90 pins V = 100 pins Z = 144 pins I = 176 pins B = 208 pins N = 216 pins 4 = 16 Kbytes of Flash memory 6 = 32 Kbytes of Flash memory 8 = 64 Kbytes of Flash memory B = 128 Kbytes of Flash memory Z = 192 Kbytes of Flash memory C = 256 Kbytes of Flash memory D = 384 Kbytes of Flash memory E = 512 Kbytes of Flash memory F = 768 Kbytes of Flash memory G = 1024 Kbytes of Flash memory I = 2048 Kbytes of Flash memory H = UFBGA N = TFBGA P = TSSOP T = LQFP U = V/UFQFPN Y = WLCSP 6 = Industrial temperature range, –40…+85 °C. 7 = Industrial temperature range, -40…+ 105 °C.
STM32 F 103 C 8 T 6
UPD:

Как снять защиту от записи / чтения?

Если вы получили плату с STM32F103, а программатор ее не видит, это означает, что китайцы защитили Флеш память микроконтроллера. Вопрос "зачем?" оставим без внимания. Чтобы снять блокировку, подключим UART переходник, будем программировать через него. Выставляем перемычки для программирования и поехали:

Читайте также: