New! Telegram канал про микроконтроллеры, SDR приемники, радиолюбительство и электронику в целом:

t.me/HighFrequency

На правах рекламы:

Создание проекта для STM32F103C8T6 в CubeMX и CooCox CoIDE с FreeRTOS 22 февраля 2017 г.

 

Статья описывает быстрый способ создания проекта для STM32F103C8T6 в среде разработки CooCox CoIDE с инициализацией базовой периферии и операционной системы реального времени FreeRTOS при помощи фирменной утилиты CubeMX для широко распространенного микроконтроллера STM32F103C8T6, доступного на отладочной плате по цене ниже Arduino Nano на Ebay и Aliexpress:

Данная статья подразумевает наличие у читателя опыта работы с микроконтроллерами, понимания их архитекторы и знания языков программирования. Она описывает работу в среде CooCox CoIDE1.7.8 не смотря на наличие второй версии. К сожалению, я не смог заставить работать свежую версию с моим программатором ST-Link, поэтому не стал тратить время и установил проверенную. Скачать CoIDE 1.7.8 можно с сайта разработчика по ссылке: http://www.coocox.org/download/Tools/CoIDE-1.7.8.exe Скачать CubeMX можно с сайта производителя микроконтроллеров STM по этой ссылке. На процессе установки и настройки этих программ я останавливаться не буду, в интернете достаточно информации по этой теме. Учтите, что у вас должен быть установлен компилятор ARM GCC, а в CoIDE прописан путь к нему. Весь процесс создания проекта занимает не более 5 минут.

 

Процесс создания проекта начинается в среде CoIDE.

Шаг 1.

Создаем проект для микроконтроллера STM32F103C8T6. На заглавном экране кликаем "New project" и вводим имя проекта, скажем, "new_project"

Далее выбираем тип микроконтроллера. На следующем экране выбираем "Chip" и далее ищем в списке наш STM32F103C8T6

Нажав "Finish", видим следующий экран, где предлагается выбрать из репозитория подключаемые модули для различной периферии, но нас интересует лишь загрузочная программа CMSIS_Boot. Выбираем ее, поставив галочку. При этом автоматически отметится компонент CMSIS Core. Он нам не нужен, убираем галочку. Нас предупредят, что от него зависит CMSIS_Boot, соглашаемся. Проект должен выглядеть примерно так:

Затем необходимо удалить некоторые файлы, которые впоследствии будут предоставлены генератором кода CubeMX. Это "main.c" и файлы, начинающиеся на "system_". Файл main.c, будет сгенерирован CubeMX и будет содержать код инициализации всех необходимых нам подсистем чипа, остальные файлы также будут находиться в папках проекта, и если их заранее не убрать, они будут конфликтовать с имеющимися файлами. А нам хочется, чтобы сборка скелета проекта с первого раза прошла без единой ошибки ;-)

Вид промежуточного проекта, подготовленного в CoIDE:

Шаг 2.

Создаем проект в CubeMX, CoIDE пока можно свернуть, она нам понадобится через одну минуту.

На заглавном экране STM32 CubeMX кликаем "New project", затем традиционно из общего списка выбираем наш STM32F103C8T6

Далее мы увидим экран с распиновкой микроконтроллера. Слева перечислены все его подсистемы. Пока нас интересует только FreeRTOS (многозадачная операционная система), RCC (система тактирования), SYS (отладка, необязательно, но пусть будет) и PC13, ножка, к которой подключен встроенный в плату отладки светодиод (как же без мигающего светодиода?!). Выбираем подсистемы:
FreeRTOS: просто поставим галочку.
RCC: выбирем источник тактирования, поставим в High Speed Clock Crystal/Ceramic Resonator. Эта опция активирует уставновленный кварц на 8МГц (на следующем шаге при помощи множителей и делителей мы установим штатную частоту тактиврования 72МГц)
SYS: выбираем Serial Wire. Это позволит производить отладку через дешевый программатор ST-Link

Получаем примерно следующее. Выбранные подсистемы тут же подсвечивают занимаемые ими ножки МК.

Далее выбираем ножку, на которой висит встроенный светодиод — PC13. Кликаем, и в выпадающем меню выбираем GPIO_Output, определяя роль ножки — только вывод. По-умолчанию режим ее выходного каскада "Push/Pull", т.е. логической "0" подтягивает ее к земле (светодиод горит, т.к. подключен через резистор к +3.3В), логическая "1" к +3.3В (светодиод не горит).

Далее переходим на вкладку "Clock Configuration" и видим схему тактирования микроконтроллера. Поначалу она может показаться ужасно сложной и запутанной, но со временем приходит ее понимание. Для нас сейчас важно выставить номинальную тактовую частоту, мы же не хотим ездить на первой передаче? Нас интересуют мультиплексор PLL Source Mux (опорный генератор с ФАПЧ и множителем до х16), который мы выставляем в HSE, что означает, что источником его тактирования служит кварц (на случай отсутствия кварца есть HSI, внутренний RC генератор, но это не наш случай). И мультиплексор System Clock Mux, который позволяет обойти PLL и тактировать ядро непосредственно от кварца для экономии энергии (ведь чем выше частота процессора, тем больший ток он потребляет), но нас интересует максимальная частота в 72МГц (на самом деле это не максимум, но об этом в следующей статье о разгоне STM32F103C8T6), поэтому переключаем его в положение PLLCLK. Затем в PLL ставим множитель х9, при этом SYSCLK (частота ядра) станет 72МГц, максимум для этой серии (якобы). Остается лишь установить в "/2" делитель APB1 для низкочастотной периферии, максимальная частота которой 36МГц. Частотный план тактирования в итоге должен выглядеть так (красным обведены вышеперечисленные места, где надо что-то менять и переключать):

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

Переходим к генерации кода проекта. Переходим в меню Project → Generate Code. В открывшемся окне вписываем название проекта, которое мы задали в CoIDE, "new_project". Путь к проекту должен совпадать с местоположением проекта в CoIDE, чтобы CubeMX сформировал файлы прямо в папке проекта. В качестве Toolchain выбираем TrueStudio.

Нажимаем ОК, код начинает генерироваться.

По окончании генерации CubeMX предлагает открыть папку проекта, воспользуемся предложением. При этом размещаем CoIDE под окном папки, нам необходимо выделить подпапки Inc, Scr, Drivers, Middlewares...

... и перетащить их в проект, бросив в корень (общая папка "new_project"), 

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

 

Шаг 3. 

Завершающий шаг по интеграции проектов двух программ. Для начала нам надо явно указать, для какого семейства процессоров мы создаем проект. Еще раз... Теперь для компилятора. Открываем настройки проекта, меню View → Configuration. И добавляем в список "Defined symbols" следующий: STM32F103xB Этот символ предназначен только для нашей платы, фото которой размещено в начале, либо для МК серий STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB и STM32F103VB. 

Также можно поставить оптимизацию компилятора, скажем, -O2. Остался один важный нюанс, во вкладке Download необходимо убедиться, что путь к драйверу содержит лишь сивмолы латиницы, поэтому если вдруг он по-умолчанию находится в папке "Пользователи", его необходимо перенести поближе к корню диска, примерно так, как сделано у меня:

 

На этом настройка проекта завершена, открываем main.c, находим процедуру StartDefaultTask, это дефолтный процесс FreeRTOS. Создать дополнительные процессы можно по аналогии с ним прямо в main.c, либо в утилите CuceMX (предпочтительнее), но нас сейчас это не интересует.

В бесконечный цикл добавляем ногодрыг для светодиода, вспоминаем, что он находится на PC13 (а необходимая инициалиция уже сгенерирована CubeMX и находится в MX_GPIO_Init):

osDelay(200);
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

Нажимаем F7, и проект собирается сразу без единой ошибки:

Заливаем, все работает:

 

Первый раз этот процесс может показаться очень сложным, особенно после Arduino с его мигалкой:

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}

Уверяю вас, после пары созданных проектов этот процесс будет проходить почти на автомате.

Возможно, наличие FreeRTOS в этом примере покажется излишеством, однако пара лишних килобайт прошивки и одна галочка в CubeMX, стоят всех ее преимуществ. Точнее, даже просто наличия функции osDelay(), которую мы использовали для мигалки. Это непаразитная задержка, которая не просто гоняет цикл со 100500 вызовами asm("nop"), а переключает ядро на заданное в миллисекундах время на выполнение других процессов.

 


comments powered by Disqus

 

Про радио 4

 

Про микроконтроллеры 1

 

Про фото 27

 

Блог 35

 

Про кино 8

 

Про WEB 6

 

 

New! Telegram канал про микроконтроллеры, SDR приемники и радиолюбительство в целом:

t.me/HighFrequency

 

Поток сознания тут — twitter.com/shtorkin

И тут — facebook.com/shtorkin

Сюда можно писать в ЛС — vk.com/shtorkin

Youtube — youtube.com/user/SemenShtorkin

Картинки — instagram.com/shtorkin


  © 2007 – 2017 Семен Шторкин (Семен Орлов)
Для связи:

Все права на представленные на сайте материалы принадлежат Семену Орлову, если не указано иного. При копировании материалов активная индексируемая ссылка на сайт «shtork.in» обязательна.