STM32 - STM32CubeMX и Atollic TrueStudio






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

В предыдущих статьях (раз, два, три) я описал простое программирование платы Blue Pill (STM32F103C8T6) в среде IDE Arduino, однако если вы хотите пойти дальше «мигания светодиодом» и задействовать весь потенциал микроконтроллеров stm32, нужно использовать соответствующие инструменты.



Итак, для разработки будем использовать…


STM32CubeMX — это программа для предварительной настройки МК и инициализации начального кода для различных сред разработки, в том числе и для Atollic TrueStudio.

В этой программе можно выбрать нужный МК, указать источники тактирования различных шин, инициализировать пины, включить таймеры, настроить прерывания и ещё кучу всего можно сделать. Всё это делается в графическом режиме, то есть всё то, что раньше нужно было прописывать вручную, можно сделать мышкой. При этом STM32CubeMX не позволит допустить ошибок и конфликтов в работе с железом. После этого созданный проект импортируется в среду разработки и программисту остаётся сосредоточится непосредственно на прикладной задаче.


Atollic TrueStudio — среда программирования (IDE) созданная на базе Eclipse. Atollic TrueStudio была выкуплена компанией ST и тем самым стала официальной средой для микроконтроллеров stm32.

Atollic TrueStudio и STM32CubeMX полностью бесплатные. Поддерживаемые операционные системы   и 


Подопытной железкой будет упомянутая выше плата Blue Pill…


Шикарная вещица, а стоит сущие копейки. Если планируете заказывать, то закажите две штуки, в дальнейшем одну из них мы превратим в программатор (об этом в следующих статьях).


Прошивать будем через USART, так что понадобится USB to UART конвертер…



… либо ардуина, из неё можно сделать конвертер (об этом ниже).





Установка


Atollic TrueStudio

Идём сюда atollic.com/resources/download/ выбираем нужную ОС, на следующей странице заполняем поля…


… и нажимаем на кнопку «Download installer...»



Для   будет скачан установочный exe-файл, который и следует запустить.


Для   будет скачан архив, который нужно распаковать в домашнюю папку, открыть терминал и перейдя в эту папку…

cd Atollic_TrueSTUDIO_for_STM32_9.0.1_installer


… запустить установочный скрипт из под root'а…

sudo ./install.sh


После установки в меню программ, в разделе «Разработка» появится ярлык

Это я делал на своей ubuntu 16.04, иные дистры не проверял.



STM32CubeMX

Идём сюда www.st.com/en/development-tools/stm32cubemx.html и регистрируемся. После регистрации находим в самом низу кнопку «Get Software»…



Скаченный архив распаковываем в домашнюю папку. После чего…

Для   запускаем файл SetupSTM32CubeMX-4.27.0.exe и следуем указаниям установщика.

Для   запускаем файл SetupSTM32CubeMX-4.27.0.linux (клацнув мышкой) и следуем указаниям установщика.

После установки появится папка STM32CubeMX, в которой будет исполняемый файл STM32CubeMX (запускать мышкой).





STM32CubeMX



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




Запускаем STM32CubeMX и жмакаем New Project…





В открывшемся окне выбираем вкладку MCU Selector и в левой колонке последовательно устанавливаем галочки (ядро, серия, линейка и корпус) соответствующие вашему МК, а внизу-справа выбираем строчку с соответствующим объёмом Flash памяти (или циферкам-буковкам на камне).






Для фирменных плат типа Discovery или Nucleo можно воспользоваться вкладкой Board Selector и просто ткнуть нужное. В этом случае инициализируются всякая разная периферия подключённая к МК (светодиоды, кнопки, акселерометр и т.п.), и настроен источник тактирования.



После этого станут активны кнопки Features и другие, поклацев которые можно посмотреть блок-схему МК, даташит и прочие доки.



Кнопка Start Project создаёт проект…

В меню ничего интересного нет кроме пункта Project, о котором поговорим позже.



Слева настройка системной частоты, таймеров и прочей периферии. В выпадающих списках представлены все возможные режимы и настройки. По центру сам МК с интерактивными выводами. Можно тыкать, перетаскивать и поворачивать.



Знакомство начнём с предупреждений и незаметно перейдём к функционалу…


Если что-то инициализировано, в данном случае инициализирован (по дефолту) системный счётчик (SysTick), то оно подсвечивается зелёненьким
SysTick
SysTick — это 24-битный вычитающий счетчик, который ведёт отсчёт от определённого значения (можно задавать самостоятельно) и при достижении нуля автоматически перегружается, после чего цикл повторяется. Каждый раз, когда счетчик достигает нуля вызывается прерывание, которое можно использовать в своих целях написав соответствующий обработчик.

easyelectronics.ru/arm-uchebnyj-kurs-systick-sistemnyj-tajmer.html





Если где-то появляется значёк , то в этом нет ничего страшного, это просто предупреждение…



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




Если же появится такой значёк , то это означает…



… что если я инициализирую РА2, например как аналоговый вход, то не смогу воспользоваться вторым USART'ом ибо конфликт.



Теперь обратим свой взор на картинку МК, как вы уже поняли, ножки у него интерактивные. Если клацнуть какую-нибудь ножку, то выскочит контекстное меню, в котором указаны все возможные режимы для данной ножки…




Если инициализированый пин клацнуть правой кнопкой мыши, то появиться ещё одно меню, в котором можно поменять название вывода (Enter User Label) или убрать булавку (Signal Unpinning), Pin Stacking — это что-то связанное с разведением многослойных плат.





В левой панели активируйте USART1 указав асинхронный режим.



Зажав Ctrl и тыкнув вывод уарта, вы увидите как система подсветит альтернативные ножки. Удерживая Ctrl их можно перетащить.

Теперь закройте этот проект — Меню ⇨ File ⇨ Close Project, и откройте новый — Меню ⇨ File ⇨ New Project.


Любой новый проект начинается с выбора источника тактирования. В левой панели находим регистр RCC



LSE — это кварц для встроенных часов. К работе МК отношения не имеет, поэтому рассмотрим его позже. Сейчас нужно разобраться с HSE, множителями, предделителями, мультиплексорами и тактированием периферии.

Откройте вкладку Clock Configuration




Если в регистре RCC оставить Disable, тогда МК будет работать от HSI RC.

HSI (High Speed Internal) — внутренний генератор частоты 8МГц (для STM32F103). Это не очень точный источник тактирования, его частота может «плавать» от перепада температуры. Внутренний генератор используется в том случае, когда нет возможности установить внешний и устройство не нуждается в высокой вычислительной точности.

Стоит заметить, что микроконтроллеры stm32 всегда стартуют от внутреннего кварца, а потом переходят на внешний. Это сделано для того, чтоб МК мог проверить, что внешний кварц исправен.

Режимы тактирования можно изменять в процессе работы программы, например для энергосбережения.



HSE (High Speed External) — внешний кварцевый резонатор от 4 до 16МГц, обеспечивающий стабильную частоту.

На моей плате установлен внешний кварц на 8МГц…


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

На платах Discovery и Nucleo может вообще отсутствовать внешний кварц (но место для него есть), в этом случае основной чип тактируется от чипа выполняющего роль программатора либо от внутреннего источника.



Для инициализации внешнего кварца нужно в RCC выбрать Crystal/Ceramic Resonator




BYPASS Clock Source — в этом режиме можно тактировать МК от какого-нибудь генератора частоты или для синхронизации нескольких микроконтроллеров (см. ниже).


Master Clock Output — выдаёт тактовую частоту на отдельную ножку.



Это может пригодится для тактирования какой-то внешней периферии или подцепиться осциллографом для проверки. Так же можно синхронизировать два и более МК, например на одном МК (будет ведущим) инициализируем этот вывод, а на другом (будет ведомым) устанавливаем RCC ⇨ High Speed Clock ⇨ BYPASS Clock Source и подключаем вывод ведущего к пину RCC_OSC_IN ведомого. Таким образом ведомый будет тактироваться от ведущего. Эта схема используется на некоторых платах Discovery и Nucleo.

Пример NUCLEO F030R8
У этой платы нету основного кварца. Черный прямоугольник — это кварц для часов (32.768).



Маленький чип (stm32f103), выполняющий роль программатора, тактируется от полноценного кварца на 8МГц и выдаёт импульсы на главный чип. В данном случае инженеры из ST не ставили задачу синхронизации микроконтроллеров, просто сэкономили один кварцевый резонатор.

Если возникнет желание разделить плату, то нужно либо впаять кварц (место специально оставлено), либо использовать внутренний резонатор.


Выше я писал, что фирменные платы могут тактироваться нестандартно, это как раз тот случай. Если при создании проекта выбрать эту плату через MCU Selector, тогда автоматически инициализируется тактирование от внешнего генератора…




Импульсы от маленького чипа поступают на ножку RCC_OSC_IN.
RCC_OSC_OUT находится в состоянии HiZ — отключён короче.


Вот иллюстрация из даташита…


External Clock это и есть режим BYPASS Clock Source.


Режимы работы устанавливаются перемычками R34 — R37…




Пояснения из даташита…





Теперь установите регистр RCC как на картинке выше и перейдите на вкладку Clock Configuration



Верхнюю часть схемы я отрезал, она касается часов, разберёмся с ней потом.

Трапеции с точечками это мультиплексоры (переключалки источников тактирования)System Clock Mux, PLL Source Mux и MCO source Mux.

System Clock Mux — переключает источники тактирования различных шин (AHB, APBx).

PLL Source Mux — самый главный мультиплексор, он позволяет выбирать источник тактирования для всего МК.

MCO source Mux — выбор источника для подачи импульсов на внешнюю периферию. Я специально предложил указать в регистре RCC пункт Master Clock Output, чтоб мультиплексор был активным и его можно было потыкать. В дальнейшем Master Clock Output включать не нужно.

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

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

Потыкайте мультиплексор MCO source Mux, выходная частота MCO будет меняться.


— а такие делители и множители можно устанавливать по своему усмотрению (если что-то настроите не так, то система ругнётся).

Потыкайте предделители на шинах (APB1,2 Prescaler), частота в голубеньких прямоугольничках будет меняться. ADC Prescaler станет активным только после инициализации пинов в регистрах ADC1 или ADC2.


Если что-то не активно, то оно либо не инициализировано, либо не может работать в данной конфигурации.


На верхней схеме настроено тактирование от внутреннего кварца. Чтобы перенастроить на внешний и установить максимальную частоту (72МГц) нужно переключить мультиплексор PLL Source Mux, множитель PLL выбрать х9, а мультиплексор System Clock Mux переключить на PLLCLK



… и вуаля, контроллер заработал на нужной частоте.


FLITFCLK — это тактирование интерфейса доступа к Flash-памяти. Она тактируется от внутреннего кварца и всегда на частоте 8МГц, видимо это связано с тем, что МК стартует на этом кварце.


Enable CSS (Clock Security System) — если нажать эту кнопочку, тогда включится детектор частоты, который при ее сбое сразу же отключает HSE, включает HSI, устанавливает его источником системной частоты, посылает сигнал ошибки системной частоты расширенным таймерам и генерирует прерывание, извещая программу о сбое. Почитать.


AHB Prescaler и APB1,2 Prescaler — это предделители системной шины (AHB) и шин периферии (APB). Их настройка зависит от того, что подключено к шине (имеется в виду и внутренняя периферия, и устройства подключаемые к МК).


На схеме показано какие выводы, интерфейсы и таймеры подключены к шинам APB1,2:




Для примера используем аналоговый вход. На вкладке Pinout активируйте какой-нибудь ADC-пин и вернитесь на вкладку Clock Configuration. Частота ADC покажет ошибку и выскочит окошко с предложением настроить всё автоматически (нажмите No)



Дело в том, что ADC должен тактироваться частотой не превышающей 12МГц, чтоб исправить ошибку нужно установить ADC Prescaler /6…




USB Prescaler при активации регистра USB тоже выдаст ошибку так как частота не должна превышать 48МГц. Чтоб исправить ошибку установите предделитель /1.5…




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


Разберёмся с часами. В регистре RCC укажите Low Speed Clock ⇨ Crystal/Ceramic Resonator, а в регистре RTC поставьте галочку Activate Clock Source




В мультиплексоре RTC Clock Mux нужно указать источник LSE



LSI (Low Speed Internal) — внутренний низкоскоростной генератор (40КГц). Это внутренний кварц для тактирования встроенных часов.

LSE (Low Speed External) — внешний низкоскоростной генератор (32.768КГц). Это внешний кварц для тактирования встроенных часов (присутствует на различных платках типа Discovery и т.п.).





И наконец про автоматическую настройку тактирования всего и вся…

Закройте этот проект и откройте новый (это можно сделать нажав кнопочку   не сохраняя предыдущий).

В регистре RCC выберите High Speed Clock ⇨ Crystal/Ceramic Resonator, больше ничего не трогайте и перейдите на вкладку Clock Configuration.

В синем прямоугольничке   HCLK (MHz) нужно вписать требуемую частоту и нажать Enter. Выскочит окошко, в котором надо нажать ОК…



После этого все мультиплексоры, предделители и частоты настроятся сами…



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


Перейдите на вкладку Pinout, активируйте таймер №1 (TIM1) и пин PC13 инициализируйте как выход (мышкой кликнуть вывод и выбрать GPIO_Output)



Clock Source ⇨ Internal Clock — означает что таймер тактируется от внутреннего источника (не в смысле от внутреннего кварца, а именно источника, так как источником может быть и какой-то внешний сигнал), если выбрать Clock Source ⇨ ETR2 (внешний источник), тогда подсветится пин PA12, на который нужно подавать тактирование для этого таймера. Зачем так делать — да мало ли зачем, например, синхронизировать таймер с каким-то устройством.


Теперь пришло время посмотреть вкладку Configuration




В левой колонке частично показана конфигурация из вкладки Pinout (если там что-то активировать, то оно появится здесь), справа кнопки с расширенными настройками выводов, интерфейсов, прерываний и т.д.


С DMA мы ничего не делаем, поэтому она и не зелёненькая.

Нажмите кнопку GPIO и кликните строчку…




GPIO output level — что подать на ножку при старте МК, 0 или 1.

GPIO Mode — работа вывода в обычном режиме (Push-pull), либо в режиме открытого стока (Open-drain).

GPIO Pull-up/Pull-down — внутренняя подтяжка к плюсу или минусу, либо без подтяжки.

Maximum output speed — частота, с которой тактируется вывод (Low — 2MHz, Medium — 10MHz, High — 50MHz).

User Label — можно указать своё имя для ножки (led13).


На вкладке RCC ничего интересног нет кроме возможности присвоить свои имена выводам кварца.

Нажмите Apply и OK.



NVIC — отвечает за всякие прерывания.

RCC — всякие настройки источника тактирования (кварца).

Я не буду описывать эти и большинство других настроек, так как для этого придётся написать книгу.



Поскольку мы будем мигать светиком с помощью таймера, то его нужно настроить, нажмите кнопку TIM1 и перейдите на вкладку NVIC Setting



Включите прерывание по переполнению как на картинке и перейдите на вкладку Parameter Setting




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

Делим системную частоту на 720 и получаем 100000 тиков в секунду, соответственно до переполнения (50000) таймер дотикает за 500мс.

Prescalerпредделитель системной частоты.

Counter Mode — режим счетчика, в данном случае он будет считать в верх (от нуля и до переполнения).

Counter Periodпереполнение.

Repetition Counter — счётчик повторений, этот счётчик позволяет генерировать прерывание не на каждое переполнение, а на каждые N переполнений.

Оставшиеся вкладки нам не интересны.

Нажмите Apply и OK.


Последняя вкладка — Power Consumption Calculator — калькулятор для расчёта энергопотребления, я в ней не разбирался.

Осталось сгенерировать проект. Нажимаем кнопку  …



Придумываем название проекта (Project Name), указываем путь до воркспейса (Project Location) и выбираем тулчеин (Toolchain/IDE). Размер кучи (Heap) и стека (Stack) трогать не стоит, во всяком случае пока.


На вкладке Advanced Settings можно выбрать библиотеку, на которой будет писаться код, оставьте HAL.

HAL (Hardware Acess Level) — библиотека для разработки, упрощающая создание программ и обеспечивающая переносимость кода. Появилась вместе с CubeMX.

LL (low-layer) — низкоуровневое API ориентированное на экспертов.



Нажмите Оk.

После первой сборки, это окно больше не будет показываться, если оно понадобится, тогда нужно нажать




Проект сгенерирован, нажмите Close...


STM32Cube-Presentation




Atollic TrueStudio


Описывать интерфейс я не буду, ничего особенно интересного тут нет, разве что справа-снизу можно видеть объём занимаемой памяти. С настройками компиляции, отладки и прочими умными словами разберётесь потихоньку сами, в любом случае это длительный процесс. Сейчас важно написать «Hello World» (помигать светиком).

Запускаем Atollic TrueStudio и открываем проект созданный в CubeMX — Меню ⇨ File ⇨ Open Project from File System…




Укажите папку с проектом (кнопка Directory...) и нажмите Finish.


В левой панеле разверните список и клацните файл main.c



Свой код нужно вписывать в специально сделанные блоки USER CODE…

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

Эти блоки расставлены везде где нужно.

Если написать что-либо вне этих блоков, то при повторной генерации кода в CubeMX (мало ли нужно что-то добавить/удалить) оно будет затёрто. Вы можете менять что-либо в CubeMX и эти изменеия будут автоматически происходить в TrueStudio.


Прежде чем вносить изменения, нажмите  чтоб проверить соберётся ли проект.


В коде уже всё инициализировано, например в функции static void MX_TIM1_Init(void) вы найдёте те самые циферки, которые мы указывали в CubeMX. Однако здесь не хватает обработчика прерываний от таймера.

В левой панели нужно найти заголовочный файл stm32f1xx_hal_tim.h (название файла намекает на его принадлежность) и открыть…



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

Откройте окно поиска (Ctrl + F) и найдите функцию HAL_TIM_PeriodElapsedCallback. Это колбек, который вызывается каждый раз когда случается прерывание. Создадим свою функцию и вставим её в main.c между тегами…

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM1) //проверяем какой таймер вызвал колбек
   {
     HAL_GPIO_TogglePin(led13_GPIO_Port, led13_Pin); // переключаем пин на противоположное состояние
   }
}
/* USER CODE END 0 */

Так как колбек один для всех таймеров, то надо проверить какой именно таймер вызвал прерывание.


И ещё надо стартануть таймер функцией HAL_TIM_Base_Start_IT() (её прототип тоже лежит в stm32f1xx_hal_tim.h).

/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1); // передаём в функцию указатель на структуру TIM1
/* USER CODE END 2 */




Заодно впишем в цикл while(1) немного кода, чтоб помигать тем же светиком, но без таймера, через delay(). Перед прошивкой что-нибудь одно закомментируете.

while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
	  HAL_GPIO_WritePin(led13_GPIO_Port, led13_Pin, GPIO_PIN_SET);
	  HAL_Delay(1000); // 1000ms (HAL_Delay останавливает программу)
	  HAL_GPIO_WritePin(led13_GPIO_Port, led13_Pin, GPIO_PIN_RESET);
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */

Помните о том, что у платы Blue Pill PC13 включается минусом.


Соберите проект кнопкой


Если внизу на вкладке Problems всё чисто, то значит пришло время прошивать плату. BIN-файл будет лежать там где и проект, в папке Debug (STM32_workspace_9.0/myled/Debug/myled.binary).

Если у Вас Windows, тогда нужно переименовать файл в myled.bin, если переименовывать лень, то можно заливать myled.hex. Они различаются размером так как в hex-файле содержится служебная информация. В Linux ничего переименовывать не нужно, что хотите то и прошивайте.



Про настройки...
Чтобы выбирать между Debug и Release, а заодно и настраивать кучу всего, нужно нажать на  , сделать всё как на картинке, нажать кнопку Manage Confogurations… и появившемся окне выбрать нужное и нажать Set Active.




Папка Release будет там же где и Debug.

Здесь же выбирается выходной формат файла.



Оставьте Binary.






Прошивка

Описанным способом можно загружать любые .bin или .hex файлы.

Для этого потребуется USB to UART конвертер…

Про работу с программатором будет отдельная статья.



Если такой штуковины нет, то есть два варианта превращения ардуины в конвертер…

превращение
1. Замкнуть RESET на GND (может не прокатить).
2. Загрузить в неё вот такой незамысловатый скетч:

void setup() 
 { 
   pinMode(0, INPUT); 
   pinMode(1, INPUT); 
 } 
 void loop() 
 {} 


Чтобы проверить работает ли ардуина в качестве конвертера, замкните RX и TX, откройте   и отправьте какие-нибудь символы. Если они вернулись, значит всё работает.


Далее переставляем джамперы на платке вот так:

Если плата самодельная, тогда пин BOOT0 надо подтянуть к плюсу.


Режим системного бутлоадера. Не поленитесь заглянуть по ссылке.



Соединяем конвертер и STM следующим образом…

картинка



Конвертер RX <-> PA9 STM
Конвертер TX <-> PA10 STM
Конвертер GND <-> GND STM

… и подключаем конвертер и STM к компьютеру.



Инструкция по прошивке для


Скачайте архив и распакуйте куда-нибудь. Если хотите, можете взять с сайта ST (в самом низу страницы).

Нажмите Reset на плате.

Перейдите в папку Flash Loader Demonstrator и запустите Flash Loader Demonstrator.exe


Выбираем СОМ-порт конвертера и жмем Next...

Warning
Такое сообщение…



… означает, что плата, залочена. Ничего страшного нет, просто снимите защиту кнопкой Remove protection и следом нажмите ОК.



Защита снята.

Если выдаёт ещё какие-то ошибки, то либо не нажали Reset, либо что-то с конвертером.




Если светофор даёт зеленый свет, то смело жмите Next...




Жмем Next...




В пункте Download to device указываем путь к файлу myled.bin (переименованому из myled.binary) или myled.hex и жмем Next...





Верните джампер в исходное положение и нажмите Reset. Светик начнёт мигать.






Инструкция по прошивке для


Скачайте архив и распакуйте куда-нибудь.

Из папки соответствующей вашей ОС скопируйте файл stm32flash в домашнюю папку.

Эта утилита есть в репах ubuntu, в других дистрах не знаю, поэтому выкладываю.

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

В терминале дайте команду:

./stm32flash -w /home/dima/Atollic/TrueSTUDIO/STM32_workspace_9.0/myled/Debug/myled.binary -v -g 0x0 /dev/ttyUSB0

Путь к файлу у вас будет свой. HEX-файлы тоже можно прошивать этой утилитой.

Если будет ругаться на права, тогда дайте команду…

sudo chmod 777 /dev/ttyUSB0


… или запускайте утилиту через sudo.


Если плата залочена…



… тогда дайте по очереди две команды:

./stm32flash -u /dev/ttyUSB0

./stm32flash -k /dev/ttyUSB0


Первая снимает защиту от записи, вторая от чтения.




Если у Вас стоял ардуиновский загрузчик, то он будет затёрт, чтоб его востановить просто залейте описанным выше способом этот файлик. И не забудте вот про это.



На этом наверно всё. Чтобы научиться писать программы для stm32, Вам придётся углубиться в изучение библиотеки HAL.


Телеграм-чат STM32


В следующей статье описано как из платы Blue Pill сделать программатор, и работать с ним в Atollic TrueStudio



  • 0
  • 1840
Telegram-канал istarik

Известит Вас о новых публикациях...


Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.