Обучение языку си для микроконтроллеров stm32. Быстрое освоение микроконтроллеров STM32. Почему стоит начинать изучение микроконтроллеров STM32 с использования платы Discovery

Курс поможет овладеть навыками программирования микроконтроллеров с нуля. В качестве примера для работы взята отладочная плата STM32F3Discovery с установленным микроконтроллером STM32F303VCT6 .

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

Урок 1: Введение

Введение в программирование микроконтроллеров. Выбор аппаратных средств. Первое знакомство с отладочной платой.

Урок 2: Установка IAR

Знакомство с фирмой-производителем ST Microelectronics. Установка программной среды разработки IAR.

Урок 3: Дополнительные инструменты

Установка программы-конфигуратора STM32Cube. Установка программы работы с памятью ST Visual Programmer.

Урок 4: Создание проекта

Создание конфигурации проекта в STM32Cube и генерация проекта для IAR Embedded Workbench.

Урок 5. FLASH-память

Урок 6. Порты ввода-вывода

Понятие портов и линий ввода-вывода. Загрузка программы в отладочную плату средствами среды разработки IAR. Включение светодиодов на плате.

Урок 7. Светодиоды и кнопка

Реализация «бегущего огня», а также переключения светодиодов по кнопке.

Урок 8. Сохранение данных

Сохранение энергонезависимых данных во FLASH-память микроконтроллера на примере запоминания светодиода, на котором закончилось переключение бегущего огня перед отключением питания

Урок 9. Таймеры-счетчики

Использование периферийного модуля таймера-счетчика для формирования задержки.

Урок 10. Прерывания

Использование прерывания по переполнению таймера-счетчика TIM6 для реализации задержки.

Урок 11. Внешние прерывания

Использование различных прерываний и их приоритетов.

Урок 12. Тактирование

Задание тактовой частоты ядра и периферийных модулей.

Урок 13. Широтно-импульсная модуляция

Конфигурация и использование широтно-импульсной модуляции на каналах таймера TIM1 с различной частотой.

Урок 14. Сторожевой таймер

Использование независимого и системного сторожевого таймера. Использование регистра окна.

Урок 15. Аналого-цифровой преобразователь

Использование аналого-цифрового преобразователя и внутреннего датчика температуры.

Урок 16. Основные и дополнительные каналы АЦП

Использование нескольких каналов единого модуля АЦП.

Урок 17. Прямой доступ к памяти

Использование прямого доступа к памяти для получения результатов аналого-цифрового преобразования.

Урок 18. Дискретизация

Использование таймера для синхронизации запусков АЦП с сохранением результатов через прямой доступ к памяти.

Урок 19. Цифро-аналоговый преобразователь

Использование цифро-аналогового преобразователя для генерации треугольного сигнала, сигнала шума или постоянного аналогового значения.

Урок 20. Пользовательский сигнал

Использование цифро-аналогового преобразователя для генерации сигнала произвольной формы.

В последние годы 32 разрядные микроконтроллеры (МК) на основе процессоров ARM стремительно завоёвывают мир электроники. Этот прорыв обусловлен их высокой производи тельностью, совершенной архитектурой, малым потреблением энергии, низкой стоимостью и развитыми средствами программирования.

КРАТКАЯ ИСТОРИЯ
Название ARM является аббревиатурой Advanced RISC Machines, где RISC (Reduced Instruction Set Computer) обозначает архитектуру процессоров с сокращённым набором команд. Подавляющее число популярных МК, а пример семейства PIC и AVR, также имеют архитектуру RISC, которая позволила увеличить быстродействие за счёт упрощения декодирования инструкций и ускорения их выполнения. Появление совершенных и производительных 32 разрядных ARMмикроконтроллеров позволяет перейти к решению более сложных задач, с которыми уже не справляются 8 и 16 разрядные МК. Микропроцессорная архитектура ARM с 32 разрядным ядром и набором команд RISC была разработана британской компанией ARM Ltd, которая занимается исключительно разработкой ядер, компиляторов и средств отладки. Компания не производит МК, а продаёт лицензии на их производство. МК ARM – один из быстро развивающихся сегментов рынка МК. Эти приборы используют технологии энергосбережения, поэтому находят широкое применение во встраиваемых системах и доминируют на рынке мобильных устройств, для которых важно низкое энергопотребление. Кроме того, ARM микроконтроллеры активно применяются в средствах связи, портативных и встраиваемых устройствах, где требуется высокая производительность. Особенностью архитектуры ARM является вычислительное ядро процессора, не оснащённое какими либо дополнительными элементами. Каждый разработчик процессоров должен самостоятельно до оснастить это ядро необходимыми блоками под свои конкретные задачи. Такой подход хорошо себя зарекомендовал для крупных производителей микросхем, хотя изначально был ориентирован на классические процессорные решения. Процессоры ARM уже прошли несколько этапов развития и хорошо известны семействами ARM7, ARM9, ARM11 и Cortex. Последнее делится на подсемейства классических процессоров CortexA, процессоров для систем реального времени CortexR и микропроцессорные ядра CortexM. Именно ядра CortexM стали основой для разработки большого класса 32 разрядных МК. От других вариантов архитектуры Cortex они отличаются, прежде всего, использованием 16разрядного набора инструкций Thumb2. Этот набор совмещал в себе производительность и компактность «классических» инструкций ARM и Thumb и разрабатывался специально для работы с языками С и С++, что существенно повышает качество кода. Большим достоинством МК, построенных на ядре CortexM, является их программная совместимость, что теоретически позволяет использовать программный код на языке высокого уровня в моделях разных производителей. Кроме обозначения области применения ядра, разработчики МК указывают производительность ядра CortexM по десятибалльной шкале. На сегодняшний день самыми популярными вариантами являются CortexM3 и CortexM4. МК с архитектурой ARM производят такие компании, как Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Миландр, HiSilicon и другие.
Благодаря оптимизированной архитектуре стоимость МК на основе ядра CortexM в некоторых случаях даже ни же, чем у многих 8разрядных приборов. «Младшие» модели в настоящее время можно приобрести по 30 руб. за корпус, что создаёт конкуренцию предыдущим поколениям МК. МИКРОКОНТРОЛЛЕРЫ STM32 Рассмотрим наиболее доступный и широко распространённый МК семейства STM32F100 от компании STMicroelectronics , которая является одним из ведущих мировых производителей МК. Недавно компания объявила о начале производства 32битного МК, использующего преимущества индустриального
ядра STM32 в недорогих приложениях. МК семейства STM32F100 Value line предназначены для устройств, где не хватает производительности 16разрядных МК, а богатый функционал «обычных» 32разрядных приборов является избыточным. Линейка МК STM32F100 базируется на современном ядре ARM CortexM3 с периферией, оптимизированной для применения в типичных приложениях, где использовались 16разрядные МК. Производительность МК STM32F100 на тактовой частоте 24 МГц превосходит большинство 16разрядных МК. Данная линейка включает приборы с различными параметрами:
● от 16 до 128 кбайт флэшпамяти программ;
● от 4 до 8 кбайт оперативной памяти;
● до 80 портов ввода вывода GPIO;
● до девяти 16разрядных таймеров с расширенными функциями;
● два сторожевых таймера;
● 16канальный высокоскоростной 12разрядный АЦП;
● два 12разрядных ЦАП со встроенными генераторами сигналов;
● до трёх интерфейсов UART с поддержкой режимов IrDA, LIN и ISO7816;
● до двух интерфейсов SPI;
● до двух интерфейсов I2С с поддержкой режимов SMBus и PMBus;
● 7канальный блок прямого доступа к памяти (DMA);
● интерфейс CEC (Consumer Electronics Control), включённый в стандарт HDMI;
● часы реального времени (RTC);
● контроллер вложенных прерываний NVIC.

Функциональная схема STM32F100 представлена на рисунке 1.

Рис. 1. Архитектура МК линейки STM32F100

Дополнительным удобством является совместимость приборов по выводам, что позволяет, при необходимости, использовать любой МК семейства с большей функциональностью и памятью без переработки печатной платы. Линейка контроллеров STM32F100 производится в трёх типах корпусов LQFP48, LQFP64 и LQFP100, имеющих, соответственно, 48, 64 и 100 выводов. Назначение выводов представлено на рисунках 2, 3 и 4. Такие корпуса можно устанавливать на печатные платы без применения специального оборудования, что является весомым фактором при мелкосерийном производстве.


Рис. 2. МК STM32 в корпусе LQFP48 Рис. 3. МК STM32 в корпусе LQFP64


Рис. 4. МК STM32 в корпусе LQFP100

STM32F100 – доступный и оптимизированный прибор, базирующийся на ядре CortexM3, поддерживается развитой средой разработки МК семейства STM32, которая содержит
бесплатные библиотеки для всей пе риферии, включая управление двига телями и сенсорными клавиатурами.

СХЕМА ВКЛЮЧЕНИЯ STM32F100C4
Рассмотрим практическое использование МК на примере самого простого прибора STM32F100C4, который, тем не менее, содержит все основные блоки линейки STM32F100. Принципиальная электрическая схема включения STM32F100C4 представлена на рисунке 5.


Рис. 5. Схема включения МК STM32F100C4

Конденсатор С1 обеспечивает сброс МК при включении питания, а конденсаторы С2-С6 фильтруют напряжение питания. Резисторы R1 и R2 ограничивают сигнальный ток выводов МК. В качестве источника тактовой частоты используется внутренний генератор, поэтому нет необходимости применять внешний кварцевый резонатор.


Входы BOOT0 и BOOT1 позволяют выбрать способ загрузки МК при включении питания в соответствии с таб лицей. Вход BOOT0 подключён к шине нулевого потенциала через резистор R2, который предохраняет вывод BOOT0 от короткого замыкания при его использовании в качестве выход ного порта PB2. С помощью соединителя J1 и одной перемычки можно из менять потенциал на входе BOOT0, определяя тем самым способ загрузки МК – из флэшпамяти или от встроенного загрузчика. При необходимости загрузки МК из оперативной памяти аналогичный соединитель с перемычкой можно подключить и к входу BOOT1.
Программирование МК осуществляется через последовательный порт UART1 или через специальные программаторы – отладчики JTAG или STLink. Последний входит в состав популярного отладочного устройства STM32VLDISCOVERY , изображённого на рисунке 6. На плате STM32VLDIS COVERY 4контактный разъём программатора – отладчика STLink – имеет обозначение SWD. Автор статьи предлагает программировать МК через последовательный порт UART1, поскольку это значительно проще, не требует специального оборудования и не уступает в скорости JTAG или ST Link. В качестве управляющего устройства, способного формировать команды и отображать результаты работы про граммы МК, а также в качестве программатора можно использовать любой персональный компьютер (ПК), имеющий последовательный COM порт или порт USB с преобразователем USBRS232.

Для сопряжения COMпорта ПК с МК подойдет любой преобразователь сиг налов RS232 в уровни логических сигналов от 0 до 3,3 В, например, микросхема ADM3232. Линия передачи TXD последовательного порта компьютера, после преобразователя уровней, должна подключаться к входу PA10 микроконтроллера, а линия приёмника RXD, через аналогичный преобразователь, – к выходу PA9.

При необходимости использования энергонезависимых часов МК, к нему следует подключить элемент питания типа CR2032 с напряжением 3 В и кварцевый резонатор на частоту 32768 Гц. Для этого МК оснащён выводами Vbat/GND и OSC32_IN/OSC32_OUT. Предварительно вывод Vbat необходимо отключить от шины питания 3,3 В.

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


Рис. 6. Отладочное устройство STM32VLDISCOVERY


Схема электрическая принципиальная STM32VLDISCOVERY.

Таким образом, в зависимости от назначения и способа применения МК, к нему можно подключать необходимые элементы, чтобы задействовать другие функциональные блоки и пор ты, например, ADC, DAC, SPI, I2C и т.п. В дальнейшем эти устройства будут рас смотрены подробнее.

ПРОГРАММИРОВАНИЕ
Сегодня многие компании предлагают средства для создания и отладки программ микроконтроллеров STM32. К их числу относятся Keil от ARM Ltd, IAR Embedded Workbench for ARM, Atol lic TrueStudio, CooCox IDE, GCC и Eclipse IDE. Разработчик может выбрать про граммные средства по своему пред почтению. Ниже будет описан инструментарий Keil uVision 4 от компании Keil , который поддерживает огромное число типов МК, имеет развитую систему отладочных средств и может быть использован бесплатно с ограничениями размера генерируемого кода 32 кбайт (что, фактически, максимально для рассматриваемых МК).

Простой и быстрый старт с CooCox CoIDE.

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

CooCox CoIDE — среда разработки, на базе Eclipse, которая помимо STM32 поддерживает кучу других семейств микроконтроллеров: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro и др. С каждой новой версией CoIDE список МК постоянно пополняется. После успешной установки CoIDE запускаем:

Появится стартовое окно Step 1, в котором необходимо выбрать производителя нашего микроконтроллера. Нажимаем ST и переходим к Step 2 (выбор микроконтроллера), в котором необходимо выбрать конкретную модель. У нас STM32F100RBT6B, поэтому нажимаем на соответствующую модель:

Справа, в окне Help отображаются краткие характеристики каждого чипа. После выбора нужного нам микроконтроллера переходим к третьему шагу Step 3 — к выбору необходимых библиотек для работы:

Давайте создадим простейший проект для мигания светодиодом, как это принято для изучения микроконтроллеров.

Для этого нам понадобится библиотека GPIO, при включении которой, CoIDE попросит создать новый проект. На это предложение нажимаем Yes, указываем папку где будет храниться наш проект и его название. При этом, CoIDE подключит к проекту 3 другие, необходимые для работы библиотеки, а также создаст всю необходимую структуру проекта:

Чем еще хорош CoIDE, это тем, что в нем есть возможность загружать примеры прямо в среду разработки. В вкладке Components вы можете видеть, что почти к каждой библиотеке есть примеры, нажимаем на GPIO (with 4 examples) и видим их:

Туда можно добавлять и свои примеры. Как видно на скриншоте выше, в примерах уже присутствует код для мигания светодиодом GPIO_Blink. Можно нажать кнопку add и он добавиться в проект, но как подключаемый файл, поэтому мы сделаем по другому просто скопируем весь код примера в файл main.c. Единственное, строку void GPIO_Blink(void) замените на int main(void). Итак, нажимаем F7 (или в меню выбираем Project->Build), чтобы скомпилировать проект и… не тут то было!

Среде нужен компилятор GCC, а у нас его нет. Поэтому идем на страничку GNU Tools for ARM Embedded Processors , справа выбираем тип вашей ОС и качаем последнюю версию тулчайна. Затем запускаем файл и инсталируем gcc toolchain. Далее, в настройках CoIDE укажем правильный путь к тулчайну:

Опять нажимаем F7 (Project->Build) и видим, что компиляция прошла успешно:

Осталось прошить микроконтроллер. Для этого при помощи USB подключаем нашу плату к компьютеру. Затем, в настройках дебаггера необходимо поставить ST-Link, для этого в меню выбираем Project->Configuration и открываем вкладку Debugger. В выпадающем списке выбираем ST-Link и закрываем окно:

Попробуем прошить МК. В меню выбираем Flash->Program Download (или на панели инструментов щелкаем по соответствующей иконке) и видим, что МК успешно прошит:

На плате наблюдаем мигающий светодиод, видео или фото я думаю приводить нет смысла, т.к. все это видели.

Также, в CoIDE работают различные режимы отладки, для этого нажимаем CTRL+F5 (или в меню Debug->Debug):

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

Вводная статья курса уроков по программированию микроконтроллеров STM32.

Этой статьей начинаю цикл уроков, посвященных программированию микроконтроллеров STM32.

Тема очень интересная, по популярности может превзойти ”Уроки Ардуино”. В принципе, это в какой-то степени продолжение или расширение ” ”. По крайней мере, я собираюсь постоянно ссылаться на статьи из этой рубрики, проводить аналогию между ними и уроками STM32.

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

Язык программирования в принципе один и тот же. Тем более одинаковы аппаратные компоненты, подключаемые к контроллеру: кнопки, светодиоды, дисплеи, модули проводных и беспроводных технологий связи и т.п.

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

Контроллеры STM32 значительно превосходят по техническим характеристикам платы Ардуино на 8 разрядных микроконтроллерах ATmega328, ATmega2560 и т.п. У них более высокая производительность, больше объем памяти, периферийные устройства разнообразнее по функциям, номенклатуре, количеству. STM32 позволяют реализовывать значительно более сложные задачи, чем платы Ардуино.

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

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

Буду преподносить оптимальный с моей точки зрения подход к программированию STM32. Кто-то может с ним не согласиться.

Итак. Я ставлю цель:

  • научить вас практическому программированию микроконтроллеров STM32;
  • расширить ваши знания в области программирования на языке C++, конечно у кого их не хватает;
  • представить строгую техническую информацию о контроллерах STM32 на русском языке;
  • какая-то часть уроков будет посвящена аппаратной части, подключаемой к микроконтроллеру.

Общие сведения о микроконтроллерах семейства STM32.

Возможности контроллеров STM32 потрясают! По крайней мере, меня.

Плата с микроконтроллером STM32F103C8T6 по стоимости сопоставима с ценой плат Ардуино на базе ATmega328 и значительно дешевле плат типа Arduino Mega2560.

По она стоит всего 175 руб.

Но по техническим характеристикам! Что стоит только сравнение разрядности обрабатываемых данных. 32 против 8!

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

Параметры STM32F103C8T6 Arduino Nano
Разрядность 32 бит 8 бит
Частота 72 мГц 16 мГц
Объем FLASH 64 кБайт 32 кБайт
Объем ОЗУ 20 кБайт 2 кБайт
Число выводов 37 22
Аппаратное умножение и деление Есть, 32 разряда Только умножение, 8 разрядов
АЦП 2 АЦП, 12 разрядов, 10 входов, 1 мкс время преобразования 10 разрядов, 8 входов, 100 мкс время преобразования
Контроллеры прямого доступа к памяти 7 каналов нет
Таймеры 7 3
UART 3 (выше скорость, больше режимов) 1
I2C 2 1
SPI 2 1
USB 1 нет
CAN 1 нет
Часы реального времени есть нет
Модуль аппаратного расчета CRC кода есть нет

К этому можно бесконечно добавлять с приставкой ”гораздо более мощные, совершенные, функциональные”: система прерываний, порты ввода-вывода, коммуникационные интерфейсы и т.п.

И это еще далеко не самый мощный вариант STM32. У меня есть плата STM32F407VET6 с частотой 210 мГц и АЦП со скоростью преобразования до 7,2 миллионов выборок в секунду. Собираюсь на ней сделать динамическую подсветку телевизора, т.е. обрабатывать видеосигнал.

Техническая документация.

Система тактирования STM32.

Сегодня речь пойдет о системе тактирования микроконтроллеров STM 32. Если вы ещё не знаете что такое такт, частота и вообще не затрагивали до этого системы тактирования, . Хоть по данной ссылке и рассматривается система тактирования микроконтроллера AVR , понятия определенные в уроке по ссылке, применимы и к системе тактирования микроконтроллеров STM 32.

Итак, приступим!

Рассматривать систему тактирования будем на примере микроконтроллера STM 32F 303VCT 6, который установлен в отладочной плате STM 32 F 3 DISCOVERY .

Взглянем на общую структуру системы тактирования:

Как мы видим, система тактирования STM 32, на порядок сложнее системы тактирования микроконтроллеров AVR, не смотря на то, что на рисунке отражена лишь основная её часть.

Давайте разбираться!

Рассматривать схему следует слева направо. Во-первых, мы должны выбрать основной источник тактирования контроллера. Выбирать будем между HSI и HSE.

HSE -Внешний высокочастотный генератор. Источником тактирования для него служит внешний тактовый сигнал (Input frequency ), который как мы видим по схеме, может быть от 4 до 32 МГц. Это может быть кварцевый резонатор, тактовый генератор и так далее.

HSI - Внутренний высокочастотный генератор. В микроконтроллерах STM 32 F 3 является RC цепочкой с частотой 8МГц. Точность значительно ниже внешнего генератора HSE.

Каждый из данных источников тактирования может быть соединен с PLL . Однако перед подачей на PLL сигнал с HSI будет уменьшен в 2 раза. Сигнал HSE в свою очередь, может подаваться на PLL без изменений, либо быть уменьшен в определенное количество раз, по желанию пользователя.

PLL Clock - Система Фазовой Автоподстройки Частоты (ФАПЧ). Позволяет умножить входной сигнал HSI или HSE в необходимое количество раз.

С PLL сигнал может быть подан на системную шину, максимальная частота которой 72МГц. Либо, на системную шину может быть подан сигнал HSE или HSI напрямую, то есть без преобразования PLL .

Системная тактовая частота SYSCLK , тактирует все основные шины микроконтроллера, через соответствующие делители, как мы видим на схеме выше. Следует учитывать, что максимальная тактовая частота некоторых шин ниже SYSCLK . Поэтому, перед подачей тактового сигнала SYSCLK на шину, следует поделить его соответствующим делителем. Если этого не сделать, микроконтроллер зависнет.

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

Настроим нашу отладочную плату STM 32 F 3 DISCOVERY на работу с тактовой частотой 72 МГц.

Создадим и настроим проект в Keil uVision . .

Добавим следующий код:

#include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" void InitRCC() { RCC_HSEConfig(RCC_HSE_ON); //Enable HSE while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) ; //Waiting for HSE //Set Flash latency FLASH->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)((uint8_t)0x02); RCC_PREDIV1Config(RCC_PREDIV1_Div1);//PREDIV 1 Divider = 1 RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9);//Set PREDIV1 as source for PLL,And set PLLMUL=9 RCC_PLLCmd(ENABLE);//Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;//Waiting for PLL RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//Set PLL as SYSCLK Soucre RCC_HSICmd(DISABLE);//Disable HSI } int main(void) { RCC_ClocksTypeDef RCC_Clocks; InitRCC(); RCC_GetClocksFreq (&RCC_Clocks); __NOP (); while (1) { } }

#include "stm32f30x_gpio.h"

#include "stm32f30x_rcc.h"

void InitRCC ()

RCC_HSEConfig (RCC_HSE_ON ) ; //Enable HSE

while (RCC_GetFlagStatus (RCC_FLAG_HSERDY ) == RESET ) ; //Waiting for HSE

//Set Flash latency

FLASH -> ACR |= FLASH_ACR_PRFTBE ;

FLASH -> ACR &= (uint32_t ) ((uint32_t ) ~ FLASH_ACR_LATENCY ) ;

FLASH -> ACR |= (uint32_t ) ((uint8_t ) 0x02 ) ;

RCC_PREDIV1Config (RCC_PREDIV1_Div1 ) ; //PREDIV 1 Divider = 1

RCC_PLLConfig (RCC_PLLSource_PREDIV1 , RCC_PLLMul_9 ) ; //Set PREDIV1 as source for PLL,And set PLLMUL=9

RCC_PLLCmd (ENABLE ) ; //Enable PLL

while (RCC_GetFlagStatus (RCC_FLAG_PLLRDY ) == RESET ) ; //Waiting for PLL

RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK ) ; //Set PLL as SYSCLK Soucre

RCC_HSICmd (DISABLE ) ; //Disable HSI

int main (void )

RCC_ClocksTypeDef RCC_Clocks ;

InitRCC () ;

RCC_GetClocksFreq (& RCC_Clocks ) ;

NOP () ;

while (1 )

В основной функции main , объявлена структура RCC _ ClocksTypeDef . Данная структура содержит в себе поля, отражающие текущую тактовую частоту определенных частей контроллера.

Затем в основной функции вызывается функция InitRCC ,которая настраивает тактирование контроллера. Рассмотрим её подробнее.

Командой RCC _ HSEConfig (RCC _ HSE _ ON ), мы включаем HSE .На его включение необходимо время, поэтому необходимо подождать пока не будет установлен флаг RCC _ FLAG _ HSERDY . Делаем мы это в цикле while (RCC _ GetFlagStatus (RCC _ FLAG _ HSERDY ) == RESET ) .

Затем мы производим настройку задержки флеш памяти. Это необходимо делать при работе системной шины на частотах свыше 36 МГц!

После настройки задержки выбираем предделитель PLL . Командой RCC _ PREDIV 1 Config (RCC _ PREDIV 1_ Div 1) мы устанавливаем предделитель на 1. Командой RCC _ PLLConfig (RCC _ PLLSource _ PREDIV 1, RCC _ PLLMul _9 ) выбирам HSE как источник частоты для PLL и выбираем умножение в 9 раз. Остается только влючить PLL командой RCC _ PLLCmd (ENABLE ), и ожидать установки флага RCC _ FLAG _ PLLRDY ,в цикле while . Тем самым мы обеспечиваем необходимую временную задержку для включения PLL . После этого выбираем PLL как источник системной частоты SYSCLK командой RCC _ SYSCLKConfig (RCC _ SYSCLKSource _ PLLCLK ). Предделители шин трогать не будем, поэтому шины AHB ,APB 1,APB 2 будут работать на частотах 72,36 и 72 МГц соответственно.

Остается лишь выключить внутреннюю RC цепочку командой RCC _ HSICmd (DISABLE ).

После выполнения функции InitRCC , в основном цикле прошивки заполним структуру RCC _ ClocksTypeDef , что позволит нам узнать, правильно ли мы настроили систему тактирования. Делаем мы это командой RCC_GetClocksFreq (&RCC_Clocks).

Посмотреть значения тактовых частот контроллера можно в режиме отладки, установив точку останова на команде __ NOP () что означает, пустую команду. Данную команду часто добавляют для удобства отладки.

Подключаем отладочную плату STM32 F3 DISCOVERY , собираем прошивку, прошиваем плату и наконец, заходим в режим отладки, нажав кнопку Start /Stop debug session (Ctrl +F 5). Установив точку останова на функции __ NOP ,и добавив структуру RCC _Clocks в Watch ,запускаем исполнение прошивки, нажав F 5. В результате видим:

Частоты настроены правильно, и микроконтроллер теперь работает на частоте 72 Мгц.

Итак, как Вы поняли из сегодняшнего урока, система тактирования STM 32 достаточно мощна и гибка для удовлетворения потребностей Ваших проектов. Потратив время на её настройку - Вы достигнете прекрасных результатов!

Спасибо за внимание! Ваши вопросы как обычно в комментариях!

Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG .RU . Незаконное копирование, цитирование, воспроизведение преследуется по закону!

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

Итак, для начала разберемся, что же нужно знать и уметь, чтобы начать изучать ARM’ы. А, в принципе, ничего супер сложного и фееричного 😉 Конечно, на контроллеры ARM люди обычно переходят, уже наигравшись с PIC’ами и AVR’ками, то есть в большинстве своем опытные разработчики. Но я постараюсь максимально подробно и понятно описывать все то, что мы будем разбирать, чтобы те, кто впервые решил попробовать себя в программировании микроконтроллеров, могли легко разобраться в материале. Кстати, если будут возникать какие-нибудь вопросы, или просто что-то будет работать не так, как задумывалось, пишите в комментарии, постараюсь разобраться и помочь.

Теперь перейдем к техническим вопросам) Несколько раз я уже упомянул название «Учебный курс ARM», но, по большому счету, это не совсем верно. Микроконтроллера ARM как такового не существует. Есть контроллер с ядром(!) ARM, а это, согласитесь, все-таки не одно и то же. Так вот, такие девайсы выпускает ряд фирм, среди которых особо выделяются, STMicroelectronics и NXP Semiconductors. Соответственно выпускают они контроллеры STM и LPC. Я остановил свой выбор на STM32, они мне просто больше понравились =) У STM очень подкупает, что разобравшись с любым МК из линейки STM32F10x, не возникнет никаких проблем и с любым другим. Одна линейка – один даташит. Кстати есть огромное количество как дорогих, так и не очень, отладочных плат с контроллерами STM32, что очень радует, хотя первое время будем отлаживать наши программы в симуляторе, чтобы оценить возможности контроллера, прежде чем покупать железо. Вот, на всякий случай, официальный сайт STMicroelectronics – .

Как то плавно выехали на тему компилятора, так что скажу пару слов об этом. Я, недолго думая, выбрал Keil, не в последнюю очередь из-за мощного встроенного симулятора. Можно и на UART там посмотреть, и на любой регистр, и даже логический анализатор имеется в наличии. Словом, у меня Keil оставил в основном только приятные впечатления, хотя есть и минусы, конечно, но не катастрофические. Так что можете смело качать Keil uvision4 с офф. сайта (). Правда есть одно НО – IDE платная, но доступен демо-режим с ограничением кода в 32кБ, которых нам пока с лихвой хватит. Кому этого мало есть огромное количество кряков для Keil’а 😉 Устанавливается все без проблем – пару раз тыкаем далее и все отлично ставится и работает без дополнительных танцев с бубном.

Собственно, вот и все, что я хотел тут рассказать, пора переходить от слов к делу, но это уже в следующей статье. Будем изучать программирование микроконтроллеров STM32 с нуля!