Первая программа
CooCox
Выполняем пункт меню Project -> New
Указываем имя проекта:
Выбираем Чип:
В репозитории выбираем какие именно модули мы будем использовать:
Открываем main.c і набираем следующий код программы:
Компилируем (Project->Build)
При первой компиляции IDE может запросить указать местонахождение компилятора.
Надо корректно указать место, куда был установлен GCC.
После удачной компиляции заливаем программу в микроконтроллер. Эта программа будет мигать светодиодом на плате. Как залить программу в микроконтроллер мы рассматривали в предыдущей статье.
Если Вы будете заливать прошивку через UART с помощью UART-USB переходника, файл для заливки найдете в директории:
C:\CooCox\CoIDE\workspace\Example_GPIO\Example_GPIO\Debug\bin\Example_GPIO.bin
Если у Вас есть установленный ST-Link программатор, программу в микроконтроллер можно залить прямо с IDE (Flash -> Program Download).
Если при этом возникла ошибка «Error: Flash driver function execute error» Рекомендуется:
- Запустить STM32 ST-LINK Utility и выполнить Frimware update.
-
Скопировать файл STLinkUSBDriver.dll из папки
C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility
в папку
C:\CooCox\CoIDE\bin
после чего перезапустить CooCox IDE
Первый проект в Keil 5 + STM32 CubeMX
- Details
- Автор Super User
В статье описано, каким образом можно создать проект с помощью программы STM32CubeMX (да, именно так она теперь называется) и библиотеки HAL. В проекте используется микроконтроллер STM32F407VGT6, но для других моделей действия будут аналогичны.
Для работы нам понадобятся:
- Keil uVision 5;
- STM32CubeMX;
- микроконтроллер;
- программатор.
Шаг 0. Если на вашем компьютере не установлен STM32CubeMX или Keil uVision 5, скачайте и установите их. При установке STM32CubeMX может потребоваться установка Java-платформы.
Шаг 1. Запускаем STM32CubeMX, выбираем «New project». В появившемся окне выставляем фильтр на требуемый микроконтроллер, выбираем его и жмем «ОК».
Шаг 2. Попробуем создать проект, в котором контроллер будет управлять работой светодиода. На моей отладочной плате светодиод подключен к выводу «PORTD.12» (узнать это можно из документации к плате). Выбираем нужный вывод микроконтроллера на схеме и кликаем по нему левой кнопкой мыши и из предложенных настроек вывода выбираем «GPIO_Output», т.е. назначаем его на вывод. Контроллер настроен!
Шаг 3. Настройка генерации проекта. Нажимаем «Project» -> «Settings».
В открывшемся окне на вкладке «Project» в первое поле вводим название проекта, в следующее поле — путь к папке, где будет храниться проект, ниже в выпадающем списке выбираем IDE, для которой создается проект, и нажимаем кнопку «ОК». Про оставшиеся настройки расскажу в следующих статьях.
Шаг 4. Генерация проекта. Для того, чтобы запустилась генерация проекта, необходимо нажать на кнопку с шестеренкой и в открывшемся окне нажать кнопку «Open project».
Шаг 5. Проверка созданного проекта. После нажатия на кнопку начнет запускаться Keil.
Переходим в Keil, в обозревателе проекта раскрываем группу «Application/User», открываем файл «Main.c», ищем в нем цикл «while(1)» и вписываем пару строк кода.
В первой строке кода вызывается процедура, которая меняет состояние вывода на противоположное (т.е. если светодиод светился, то должен погаснуть и наоборот). Вторая строка кода — это пауза.
Далее нажимаем на кнопку постройки проекта.
Пока проект собирается, подключаем отладочную плату к компьютеру. Как только проект будет скомпилирован, нажимаем на кнопку загрузки кода в микроконтроллер. После загрузки необходимо перезагрузить микроконтроллер. По умолчанию STM32CubeMX в настройках проекта устанавливает программатор «St-Link», если используется другой программатор, необходимо зайти в настройки проекта и установить нужный программатор.
Если все сделано правильно, светодиод на плате вам поморгает 😉
1) Installing prerequisite STM32 Keil software pack
If already installed, you can SKIP this.
Step A. Download latest Keil MDK uVision5 from Keil’s website.
Step B. Install Keil uVision 5 to default path.
STEP C. Open Keil 5 and click on “Pack Installer” icon as shown below:
STEP D. On the left half on the window, under “Devices” type “STM3F103C8”
(or other device name depending on the device present on your development board) in search box and select the MCU in the list below. Now, on the right half of the window click on the “install” button which is towards to the right of “Keil:STM32F1xxx_DFP” and “Keil:STM32NUCLEO_B”. Repeat this step if want to add support for other device family. After this, wait until pack installer finishes downloading the required pack files for selected MCU.
Alternatively, you can manually download the software pack and install it directly from MDK5 Software Packs. It will be present Under “KEIL-> STMicroelectronics STM32F1 Series Device Support, Drivers”. In general for STM32Fx Devices.
STEP E. After installing from Pack Installer you will get a confirmation to reload packs. Click “Yes” as shown below:
Некоторые настройки IDE и параметры компилятора
Repository
View -> Repository
Здесь мы выбираем библиотеки, которые необходимы для нашего проекта. При этом IDE копирует в папку stm_lib вашего проекта нужные файлы.
Закладка Compile
в этой закладке устанавливаются ключи компилятора
Мы сюда еще будем возвращаться, а пока обратим внимание на поле Optimization. Это поле задает параметр оптимизации для компилятора
Об оптимизации будет отдельный разговор, пока Вам нужно усвоить, что оптимизация Optimizate Size (-Os) максимально уменьшает объем скомпилированных программ. Но при этом компилятор может выбросить (оптимизировать) некоторые операции, и программа может работать не так, как Вам бы хотелось. Поэтому, на первых этапах, я не рекомендую использовать этот метод оптимизации. Установите Optimizate (-O1).
Закладка Link
В этой закладке пока нас интересует только поле Library и Linked Libraries. Если Вы будете использовать стандартные библиотеки С, например библиотеку математических функций math Вам нужно будет выбрать «Use base C Library». Если этого не сделать, то компилятор выдаст ошибку.
Здесь указываются куда складывать скомпилированные файлы и в каких форматах.
Пока в ней мы ничего делать не будем.
Закладка Debugger
В этой закладке устанавливаются параметры дебаггера. Поскольку мы будем использовать ST-Link, здесь ничего менять не придется.
Универсальный код HelloWorld
RTOS2
Рассмотрим процесс запуска RTOS2. После конфигурации структуры входных параметров для будущего потока в функции main() необходимо произвести инициализацию RTOS и создать поток, который описывается, как обычная функция в Си. После же запустить планировщик ядра ОСРВ функцией osKernelStart (), который и начнёт запускать созданный поток.
При вызове функции osDelay() поток, вызывающий функцию, переводится в режим ожидания Wait на указанное время, и запускается поток ожидания osRtxIdleThread, в составе которого находится бесконечный цикл. При желании в него можно прописать свою функцию. Приоритет у этого потока наименьший — osPriorityIdle, поэтому после его запуска при следующем тике таймера системы (его частота по умолчанию 1000 Гц) запускается поток с наибольшим приоритетом, находящийся в состоянии готовности «Ready». Это очень удобно, так как пока запустивший функцию задержки поток находится в режиме ожидания, будут выполняться другие потоки
При этом важно понимать, что задержки, которые формируются функцией osDelay(), а также другие времена для отсчётов в ОСРВ, высчитываются на основе тиков системного таймера SysTick
В текущем универсальном примере вывод микроконтроллера будет переключать своё состояние каждые 500 тиков таймера операционной системы (один тик связан с параметром «Kernel Tick Frequency « (freq) при конфигурировании файла RTX_Config.h — см. рисунок 2). На основе этих данных можно очень точно разграничивать время выполнения каждого потока, если, например, их используется много. Умение системы разделять процессорное время и является преимуществом использования ОСРВ на практике. В свою очередь, можно регулировать время выполнения каждого потока. Для этого в файле «RTX_Config.h» необходимо задать параметр «Round-Robin Thread switching», который также измеряется в тиках таймера системы. По умолчанию, если опция включена, выставляется 5 тиков таймера системы на выполнение каждого потока, но это значение можно и увеличивать, тем самым, задавая верхнюю границу выполнения каждой структурной части программного обеспечения
Работа с ОСРВ RTOS 2 на микроконтроллерах 1986ВЕ1Т/1986ВЕ3Т
В микроконтроллерах 1986ВЕ1Т/1986ВЕ3Т присутствует неустранимая ошибка системного таймера, который используется системой реального времени. Системный таймер работает правильно только при частоте ядра до 25 МГц. При более высоких частотах времена растягиваются. Подробнее в файле Errata, ошибка «0011»
RTOS2RTOS2 OS Tick APIстранице API официального сайта KeilOS Tick APIosKernelStart () SysTickSysTickOS Tick APIosKernelStart ()SysTick HandlerRTOS21986ВЕ1Т 1986ВЕ3Т«Файлы для скачивания»api_os_tick.cOS Tick API1986ВЕ1Т 1986ВЕ3Т
Функции OS Tick API, предназначенные для мониторинга: OS_Tick_GetInterval (void), OS_Tick_GetCount (void) и OS_Tick_GetOverflow (void) — не описаны в библиотечном файле, их описанием при необходимости занимается разработчик.
OS Tick APIvoid OS_Tick_AcknowledgeIRQ (void)ARRfreq«Configuration Wizard»OS Tick API int32_t OS_Tick_Setup (uint32_t freq, IRQHandler_t handler). RTOS2 SysTick Handlerstartup_*.sTIMER1_IRQHandlerSysTick_Handlerstartup_*.sHelloWorldOS Tick API,1986ВЕ1Т
Создание проекта
Создаем новый проект1986ВЕ92
- Startup_MDR1986BE9x;
- PORT;
- RST_CLK.
Настройки проекта для 1986ВЕ9х
Теперь подключим в проект саму ОСРВ RTOS2. Ниже будут рассмотрены два варианта подключения: автоматическое и ручное.
Автоматическое подключение ОСРВ RTOS2 к программному проекту
RTOS2«Manage Run-Time Environment»
- CMSIS > CORE;
- CMSIS > RTOS2 (API) > Keil RTX5 (вариант Library);
- Device > Startup.
«Manage Run-Time Environment»RTOS2 CMSISRTX_CMx.librtx_lib.cRTX_Config.cRTX_Config.h.
Стоит отметить, что RTX_CMx.lib для ядра Cortex-M1 такой же, как и для ядра Cortex-M0, поэтому, например, для микроконтроллеров 1986ВЕ1Т/1986ВЕ3Т (RISC-ядро, которое схоже с Cortex-M1) подключится файл RTX_CM0.lib. Связано это с тем, что ядра Cortex-M0 и Cortex-M1 имеют одну архитектуру ARMv6-M, а также одинаковый набор инструкций. Убедиться в этом можно здесь ARM Cortex-M instruction variations. Кроме этого, применимость RTX_CM0.lib для ядра Cortex-М1 обозначена в документации к RTOS CMSIS-RTOS RTX Library Files.
rtx_os.h#includeRTX_Config.h«Configuration Wizard»
Ручное подключение ОСРВ RTOS2 к программному проекту
Программное обеспечение МиландрIDE Keil1.5.3RTOS2 «Manage Run-Time Environment»IDE Keil
- C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Source\rtx_lib.c
- C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Library\ARM\RTX_CM0.lib
- C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Config
- RTX_Config.c
- RTX_Config.h
RTX_Config.cRTX_Config.h
При этом важно для корректной сборки не забыть указать компилятору пути до основных файлов RTOS2 во вкладке «C/C++» настроек проекта, как это показано на рисунке 4:
2) Step by step Tutorial
Okay, so now we have the necessary packs installed to create our first STM32 project in Keil 5. Just follow the steps mentioned below to create a new project in Keil uV 5 or if your project is not working properly:
Step 1.
Open the Keil IDE, under main menu goto “Project->New uVision Project…” and a window prompt will open asking to save the new project. Type your desired project name and save.
Step 2.
After that, a new window will appear as shown below. Make sure “Software Packs” is selected for the 1st drop down. In the search box below it, type “STM32F103C8” and then select the device from list below. For e.g.: STM32F103C8 for STM32 Blue Pill, STM32F103RB for Nucleo-F103RB, STM32F030R8 for Nucleo-F030R8 and so on.
Finally click “OK”.
Step 3.
A. For CMSIS:
Inside the “Manage Run-Time Environment Window” select the check boxes for “CORE” under “CMSIS” and “Startup” under “Device”. If you want to select any other libraries you can do so by selecting the respective checkboxes. Selecting “Startup” will automatically add all the necessary startup/boot files required for STM32F1xx device, so we don’t have to import them from external sources. The selection of libraries can be changed any time later.
B. For Standard Peripheral Library (SPL):
If you want to use SPL, the select the required peripheral library components as required. Note that some components have dependencies as well, so you will also need to include dependent components. For. E.g. GPIO needs RCC to enable clocks.
Now click on “Options for Target” button as shown below:
Make sure the settings match as shown below.
Step 5.
Now, click on the “Output” tab. If you want to generate hex file then you can check “Create HEX File”. You also enter a suitable name for the executable output file.
Step 6.
Then click on the “Linker” tab and Under that tab check the checkbox option which says “Use Memory Layout from Target Dialog”.
Step 7.
Now, under the “Debug” tab, select ST-LINK as debugger since its the most common for debugging and programming STM32. Finally to click “OK” to apply settings and close window.
Step 8.
Now, in the source navigation pane on the left area, right click on “Source Group 1” and select “Add New Item to Group ‘Source Group 1′”.
Step 9.
A new window will pop-up to add an item as shown below. Select “C File (.c)” or C++ File (.cpp) , then enter the name of the file in the text box to the right of “Name:” and click “Add”.
Step 10.
Now you can write your code in the editor. To compile your program Press “F7” key or in the main menu goto “Project->Build Target”. To check for any compilation errors you can have a look at the build output at the bottom of main window. Two screenshots of the Keil MDK uVision 5 are given below.
A. For CMSIS Core Project:
B. For Standard Peripheral Library based Project:
Перечень проектов
Example_First_Programm — GPIO. Первая программа. Мигание светодиодом
Example_GPIO — GPIO. Пример работы с входами и выходами
Example_StepMotor — GPIO. Пример работы с шаговым двигателем 28BYJ-48
Example_Nokia5110 — GPIO. Remap. Пример работы с выходами
Example_WG12864A — GPIO. Пример работы с LCD дисплеем WG12864A (KS0108/KS0107)
Example_ADC — ADC. Простой пример работы с АЦП
Example_ADC_DMA — ADC. Работа с АЦП с использованием DMA
Example_ADC_Injected — ADC. Работа с АЦП с настройкой Injected каналов
Example_ADC_Temperature — ADC. Использование встроенного термометра
Example_ADC_Watchdog — ADC. Аналоговый Watchdog
Example_Sonar — EXTI. Пример работы с сонаром HC-SR04
Example_USART1 — USART. Пример простого терминала
Example_USART_DMA — USART. Отправка данных через последовательный порт с помощью DMA
Example_DFPlayerMini — USART. Пример работы с MP3 плеером DFPlayer Mini. Функция произнесения числа
Example_SysTick — Таймер. Системный таймер SysTick. Задержка на SysTick
Example_TIM_CLK — Таймер. Генерирование прерывания через равные промежутки времени
Example_TIM_Time — Таймер. Измерение времени между двумя событиями
Example_PPM — Таймер. Захват сигнала
Example_Encoder — Таймер. Работа с энкодером
Example_Encoder_IT — Таймер. Работа с энкодером
Example_PWM_LED — Таймер. PWM. Управление яркостью светодиода
Example_PWM_RGB — Таймер. PWM. Управление цветом RGB светодиода
Example_PWM_Servo — Таймер. PWM. Управление сервоприводом
Example_PWM_Sound — Таймер. PWM. Генерирование звука
Example_RTC — RTC. Пример работы с часами реального времени
Example_BKP — BKP. Пример работы с регистрами Backup registers
Example_FLASH — FLASH. Пример сохранения настроек во FLASH память
Example_Watchdog — Watchdogs. Пример использование IWDG и WWDG
Example_I2C_Master — I2C. Работа с шиной I2C на примере датчика атмосферного давления BMP280
Example_I2C_Slave — I2C. Работа с шиной I2C в качестве Slave устройства
Example_BMP280 — I2C. Пример работы с датчиком атмосферного давления BMP280
Example_MS5611 — I2C. Пример работы с датчиком атмосферного давление MS5611
Example_USB_Virtual_Com_Port — USB. Пример работы с USB. Виртуальный последовательный порт
Example_USB_Keyboard — USB. Пример работы с USB. Эмуляция клавиатуры и мышки
Example_USB_Mass_Storage — USB. Пример работы с USB. STM32F103 в качестве Mass Storage Device
Example_PWR_Sleep — PWR. Использование энергосберегающего режима SLEEP
Example_PWR_Stop — PWR. Использование энергосберегающего режима STOP
Example_PWR_Standby — PWR. Энергосберегающий режим Standby. Пробуждение от Wake Up Pin
Example_PWR_Standby_RTC — PWR. Энергосберегающий режим Standby. Пробуждение от RTC
Example_Bootloader — Bootloader. Пример собственного загрузчика
Example_BLDC — Управление бесколлекторным двигателем с датчиками Холла (Sensored Brushless)
Example_PMSM — Управление PMSM с датчиками Холла с помощью STM32
Смотри также:
- 1. STM32. Программирование STM32F103. Тестовая плата. Прошивка через последовательный порт и через ST-Link программатор
- 2. STM32. Программирование. IDE для STM32
- 3. STM32. Программирование STM32F103. GPIO
- 4. STM32. Программирование STM32F103. Тактирование
- 5. STM32. Программирование STM32F103. USART
- 6. STM32. Программирование STM32F103. NVIC
- 7. STM32. Программирование STM32F103. ADC
- 8. STM32. Программирование STM32F103. DMA
- 9. STM32. Программирование STM32F103. TIMER
- 10. STM32. Программирование STM32F103. TIMER. Захват сигнала
- 11. STM32. Программирование STM32F103. TIMER. Encoder
- 12. STM32. Программирование STM32F103. TIMER. PWM
- 13. STM32. Программирование STM32F103. EXTI
- 14. STM32. Программирование STM32F103. RTC
- 15. STM32. Программирование STM32F103. BKP
- 16. STM32. Программирование STM32F103. Flash
- 17. STM32. Программирование STM32F103. Watchdog
- 18. STM32. Программирование STM32F103. Remap
- 19. STM32. Программирование STM32F103. I2C Master
- 20. STM32. Программирование STM32F103. I2C Slave
- 21. STM32. Программирование STM32F103. USB
- 22. STM32. Программирование STM32F103. PWR
- 23. STM32. Программирование STM32F103. Option bytes
- 24. STM32. Программирование STM32F103. Bootloader
- STM32. Скачать примеры
- System Workbench for STM32 Установка на Ubuntu
- Keil uVision5 – IDE для STM32
- IAR Workbench – IDE для STM32
- Управление бесколлекторным двигателем постоянного тока (BLDC) с помощью STM32
- Управление PMSM с помощью STM32
PackInstaller
KeilPackInstaller
Праворуч на вкладці Devices знаходимо наш контролер. У моєму випадку це STM32F103C8, після чого у вкладці Packs зліва по черзі інсталюємо всі пакети.
Після того, як встановимо всі пакети, закриваємо PackInstaller і створюємо проект за допомогою меню
Project -> New mVision Project…
Оибираємо папку та ім`я проекту.
Після чого буде запропоновано вказати мікроконтролер.
Далі з`явиться вікно, у якому потрібно обрати компоненти які будуть використовуватися у проекті.
Обов`язково обрати:
- CMSIS-CORE — підтримка основного ядра ARM
- System Startup — основний конфігураційний системний файл
- Standard Peripherals Drivers Framework — стандартні драйвери периферії
- GPIO — управління ногами мікроконтролера
- RCC — управління тактуванням периферії
ResolveОК
Тепер створюємо основний файл програми. Правою кнопкою миші натискаємо на Sourcegroup 1, далі Add New Irem to Group Source Group 1…
Вказуємо тип та ім`я файлу:
Після чого буде створено і відкрито файл main.c. Наберіть в ньому наступний код програми:
Перед тим як компілювати програму потрібно зробити деякі налаштуваня проекту. Натискаємо на Options for Targe…. Відкриється вікно налаштувань проекту.
На Вкладці «Target» потрібно вказати тактову частоту мікроконтролера.
На вкладці «Output» вказуємо формат вихідного файлу.
На вкладці «C/C++» у полі Define: вказуємо такі опції:
USE_STDPERIPH_DRIVER, STM32F10X_CL
Без цих опцій проект не буде нормально компілюватися. Можна вибрати рівень оптимізації.
Тепер можна закрити вікно налаштувань і спробувати зібрати проект за допомогою меню Project->Build target
Після вдалої збірки маємо побачити таку картину:
Успіхів.
Дивись також:
- 1. STM32. Програмування STM32F103. Тестова плата. Прошивка через UART та через ST-Link
- 2. STM32. Програмування. IDE для STM32
- 3. STM32. Програмування STM32F103. GPIO
- 4. STM32. Програмування STM32F103. Тактування
- 5. STM32. Програмування STM32F103. USART
- 6. STM32. Програмування STM32F103. NVIC
- 7. STM32. Програмування STM32F103. ADC
- 8. STM32. Програмування STM32F103. DMA
- 9. STM32. Програмування STM32F103. TIMER
- 10. STM32. Програмування STM32F103. TIMER. Захоплення сигналу
- 11. STM32. Програмування STM32F103. TIMER. Encoder
- 12. STM32. Програмування STM32F103. TIMER. PWM
- 13. STM32. Програмування STM32F103. EXTI
- 14. STM32. Програмування STM32F103. RTC
- 15. STM32. Програмування STM32F103. BKP
- 16. STM32. Програмування STM32F103. Flash
- 17. STM32. Програмування STM32F103. Watchdog
- 18. STM32. Програмування STM32F103. Remap
- 19. STM32. Програмування STM32F103. I2C Master
- 20. STM32. Програмування STM32F103. I2C Slave
- 21. STM32. Програмування STM32F103. USB
- 22. STM32. Програмування STM32F103. PWR
- 23. STM32. Програмування STM32F103. Option bytes
- 24. STM32. Програмування STM32F103. Bootloader
- STM32. Скачати приклади
- System Workbench for STM32 Інсталяція на Ubuntu
- Keil uVision5 – IDE для STM32
- IAR Workbench – IDE для STM32
- Керування безколекторним двигуном постійного струму (BLDC) за допомогою STM32
- Керування PMSM за допомогою STM32