Программирование stm32 cube ide

Программирование STM32 в CubeIDE

В предыдущей статье мы рассмотрели, какие существуют STM32 IDE. Сегодня поговорим про программирование Stm32 в Cube IDE. В одной статье не разобрать столь обширную область, но мы расскажем вам как сделать первый запуск программы и создать свой первый проект в данной IDE.

Скачать Cube IDE можно с официального сайта или без ограничений по IP с сервера нашего сайта.

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

STM32 Cube IDE:

Установив галку в поле “Use this as the default and do not ask again” указанная папка установиться по умолчанию и сообщение больше не будет показываться. Далее STM32 CubeIDE покажет главное окно для создания проекта.

STM32 CubeIDE: Создание нового проекта

STM32 Cube IDE:

Создадим новый проект, нажав на ссылку “Create a New STM32 project”. В появившемся окне мы можем выбрать несколько вариантов проекта:

  • Новый проект STM32 указав используемый микроконтроллер STM;
  • Новый проект скомпонованный под отладочную плату STM32;
  • Новый проект с примером работы периферии микроконтроллера STM32 или отладочной платы.

STM32 Cube IDE:

Для дальнейшего создания проекта stm32 cubeide предложит выбрать язык программирования С или С++, имя проекта и тип проекта.

STM32 Cube IDE:

Если выбрать тип проекта STM32Cube, то после нажатия кнопки Finish, будет создан проект с функцией main , а так же ioc файл для настройки периферии, через CubeMX.

STM32 CubeIDE:

Вот и все проект создан. Функция main находится в Core/Src.

ВАЖНО! Если вы используете CubeMX, то программный код можно писать в местах отмеченных следующими комментариями. Иначе во время следующей генерации кода, все что не в данных блоках, будет удалено.

/* USER CODE BEGIN */ /* USER CODE END */

В следующих статьях поговорим как настроить stm32 cubeide для работы с отладчиком и программатором. Если у вас возникли вопросы по статье, задавайте в комментариях.

Загрузки

Источник

Как создать проект на ассемблере в STM32CubeIDE

Доброго времени суток, сегодня я хотел бы поделиться своим опытом создания шаблона проекта в CubeIDE для программирование на Ассемблере.

Так как CubeIDE использует средства GNU то и синтаксис ассемблера у нас будет советующий. Для начала откроем CubeIDE и создадим новый проект. В качестве испытуемого микроконтроллера возьму STM32G030F6P6 уж очень мне они нравятся. А так данный способ работает и с другими сериями микроконтроллера STM32.

Далее необходимо дать название проекту и выбрать пустой проект и жмем завершить.

Теперь необходимо удалить лишние файлы и переименовать main.c в main.s.

Очищаем main.s и удаляем syscall.c и sysmem.c. , но startup файл мы оставим обязательно, так как там прописаны первоначальная настройка стека и таблицы векторов после чего вызывается main, в рамках данной статьи автор рассчитывает на новичков которые только познают азы ассемблера. Должно получиться примерно так.

Теперь нам необходимо открыть файл startup_stm32. s и скопировать директивы среды. Находим данные строки ниже и копируем в наш main.s

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

Теперь давайте напишем небольшой код, в самых лучших традициях помигаем светодиодом) , для этого нам понадобиться два адреса RCC и GPIO. Можно взять из datasheet их, но мне лень поэтому немного схитрим. Необходимо войти в режим отладки.

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

В правом окне нам необходимо найти раздел SFRs и выбрать нам интересную периферию. Тут мы находим наш начальный адрес, для RCC он находиться 0x40021000 а для GPIOB 0x50000400. Желтым подсвечивается изменение содержимого регистра. Так как мы только что открыли их, для нас все эти значения новые.

В этом разделе можно посмотреть текущее состояние битов периферии. Так же нам понадобиться раздел Registers в котором находиться регистры общего назначения.

После чего напишем простой скетч.

.syntax unified .cpu cortex-m0plus .fpu softvfp .thumb .equ RCC_BASE, 0x40021000 .equ GPIOB_BASE, 0x50000400 .global delay .global main main: //Включения тактирования GPIOB ldr r0, =RCC_BASE ldr r1, [r0, #0x34] movs r2, #0b10 adds r1, r2 str r1, [R0, #0x34] //Настройка GPIOB_PIN_0 как выход ldr r0, =GPIOB_BASE ldr r1, [r0, #0x0] movs r2, #0b11 bics r1, r2 adds r1, #1 str r1, [r0, #0x0] Loop: //Установка PIN_0 в лог. ед. ldr r1, [r0, #0x18] movs r2, #1 orrs r1, r2 str r1, [r0, #0x18] bl delay //Установка PIN_0 в лог. ноль ldr r1, [r0, #0x18] movs r2, #1 lsls r2, #16 orrs r1, r2 str r1, [r0, #0x18] bl delay b Loop //задержка delay: push ldr r3, =#0x00100000; delay_loop: subs r3, #1 bne delay_loop pop bx lr

Скомпилируем наш код и зашьем его. В качестве примера использую китайскую плату. У данной платы к ножке 0 порта В подлечен светодиод катодом т.е. когда мы подаем лог. ед. на вывод светодиод не горит, когда подаем лог. ноль то светодиод загорается.

Подключаемся в режиме отладки и начинаем идти по коду. Сначала отработает код startup файла. В нем процессор сначала вызывает обработчик сброса в котором формирует стек и векторы прерываний а после вызывает наш main. В первом блоке кода происходит включение тактирования GPIOB.

Команда LDR загружает в R0 базовый адрес RCC который объявлен у нас константой. как можно видеть после выполнения команды в регистр был положен адрес. Так же можно будет заметить что счетчик команд постоянно смещается. Если перейти в окно disassembly можно сопоставить данные адреса.

после чего следующей командой LDR мы загружаем значение в регистр R1 находящееся по адресу R0 смешенное на 0x34. Для проверки сравним считанное значение и посмотренное через средства отладки. Для этого откроем окно SFRs и посмотрим значения регистра RCC_IOPENB.

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

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

Команда STR обратная LDR, т.е. она выгружает значения из регистра общего назначения в регистр памяти по адресу R0 + смещение. Значит наше число которое должно будет оказаться в регистре RCC_IOPENB, жмем далее и убеждаемся в этом.

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

Теперь шагами проходим и устанавливаем вывод в лог. ед. и можем убедиться наглядно.

Теперь у нас вызывается подпрограмма задержки, нажимаем на следящий шаг и переходим в подпрограмму, как можно заметить у нас изменился регистр LR, он сохранил адрес возврата из подпрограммы, т.е. адрес следующей команды после bl delay. Тут мы впервые используем команды для работы с стеком, условно PUSH загружает значения регистров в стек а POP выгружает, но нам это в данной программе не особо и нужно, но в качестве примера.

Задержка работает следующим образом. Загружается некоторое число в регистр R3, после чего из него вычитается единица, если результат вычета не равен нулю то переходим по метке иначе выполняем следующую команду. Можно в отладке потыкать и посмотреть как он отнимает число. Но смотреть как число отнимается несколько миллионов раз не интересно) поэтому можно пойти двумя путями, поставить точку останова на следующей команде или же изменить значения регистра R3 на удобное нам. Как использовать отладку и точки остановки есть куча информации в интернете, поэтому я на этом не особо заостряю внимание. А вот изменения значения регистров мало можно встретить поэтому попробуем второй вариант.

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

После чего мы просто делаем два шага и выходим из цикла, после чего загружаем значения из стека обратно в регистр R3 и командой BX выходим из подпрограммы, обратим внимание что в качестве метки используем регистр LR. Можно сказать что метка это и есть адрес, удобный для нашего восприятия. На ,а далее все циклично думаю разобраться можно.

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

  1. Джозеф Ю: Ядро Cortex-M3 компании ARM. Полное руководство
  2. Харрис, Харрис: Цифровая схемотехника и архитектура компьютера
  3. Харрис, Харрис: Цифровая схемотехника и архитектура компьютера. Дополнение по архитектуре ARM

Источник

Создание проекта в среде STM32CubeIDE

Скачать версию STM32CubeIDE 1.9.0 без регистрации и смс для Windows или Linux можно в телеграм-канале:

При первом запуске программа предложит обозначить папку, где будут хранится проекты, указываем. Далее жмём Start new STM32 project либо через ( File -> New -> STM32 Project )

Выбираем необходимый микроконтроллер, у меня это всем известный STM32F103C8T6 и жмём Next :

Называем проект и жмём Finish

Включаю последовательную отладку (по SWDSerial Wire Debug), чтоб использовать ST-LINK

Тактирование от внешнего кварцевого резонатора

RCC -> HSE (High Speed Clock) -> Crystal/Ceramic Resonator

Во вкладке настройки тактовой системы вводим 72 МГц и жмём ввод, подтверждаем предложенное решение

Настраиваем вывод PC13 (к нему подключен зеленый светодиод) как двухтактный выход ПКМ на выводе -> GPIO_Output

Далее слева в дереве проекта в папке Src двойной щелчок по главному файлу main.c

Написан простейший код мигания светодиодом (он подключен в выводу PC13 ).

Значение в регистре ODR (Output Data Register) меняется каждый раз благодаря логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Ну, а со стандартной функцией задержки всё и так понятно.

GPIOC->ODR ^= GPIO_ODR_ODR13; // same: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); // delay 0.5s

Собираем проект (Ctrl + B) либо щелчок по молоточку. Ошибок и предупреждений нет.

Запускаем отладку ( F11 либо Run -> Debug ). Переключаемся в пространство отладки.

Возможно придется обновить прошивку программатора-отладчика ST-LINK (делается это в два клика) и далее в настройках можно будет его лицезреть.

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

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

В этой программе это регистр выходных данных ODR, бит ODR13, когда там нуль, то СИД светится, когда единица, то нет (т.к. светодиод подключен к плюсу на отладочной плате).

Ну а в железе это вот этот изменяющийся бит выглядит как мигание светодиода:

Скачать версию STM32CubeIDE 1.7 без регистрации и смс:

Источник

Читайте также:  Тренажер программирования станков чпу
Оцените статью