Научно-образовательный портал ТУСУР | Безопасность автоматизированных систем в кредитно-финансовой сфере
Научно-образовательный портал ТУСУР | Безопасность автоматизированных систем в кредитно-финансовой сфере | Основы программирования микроконтроллеров10.05.03 – Информационная безопасность автоматизированных систем (Безопасность автоматизированных систем в кредитно-финансовой сфере)
Очная форма обучения, план набора 2021 г.
Изучается: 7 семестр
Цикл дисциплины: Б1. Дисциплины (модули)
Индекс дисциплины: Б1.О.03.24
Обеспечивающая кафедра: Кафедра комплексной информационной безопасности электронно-вычислительных систем
Рабочая программа
Основы программирования микроконтроллеров: Рабочая программа учебной дисциплины «Основы программирования микроконтроллеров»/ Пехов О. В. ‐ 2022
Основная литература
Методы и технологии разработки клиент-серверных приложений: Учебное пособие / Морозова Ю.
Организация ЭВМ и систем: учебное пособие / Замятин Н. В. — 2018. 214 с.
Дополнительная литература
Информатика. Ассемблер для процессора i8086: Учебное пособие / Коцубинский В. П., Потапова Е. А. — 2013. 93 с.
Учебно-методическое пособие
Системное программирование: Методические указания по лабораторным работам, практическим занятиям, самостоятельной и индивидуальной работе / Романов А. С. — 2018. 129 с.
Контрольные испытания
Вид контроля | Семестры |
---|---|
Зачет | 7 |
Объем дисциплины и виды учебной деятельности
Вид учебной деятельности | 1 семестр | 2 семестр | 3 семестр | 4 семестр | 5 семестр | 6 семестр | 7 семестр | 8 семестр | 9 семестр | 10 семестр | 11 семестр | Всего | Единицы |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Лекционные занятия | 18 | 18 | часов | ||||||||||
Лабораторные занятия | 32 | 32 | часов | ||||||||||
Самостоятельная работа | 58 | 58 | часов | ||||||||||
↳ из них практическая подготовка | 0 | часов | |||||||||||
Общая трудоемкость | 108 | 108 | часов | ||||||||||
3 | З. Е |
Компетенции
Код | Содержание |
---|---|
ОПК-7 | Способен создавать программы на языках общего назначения, применять методы и инструментальные средства программирования для решения профессиональных задач, осуществлять обоснованный выбор инструментария программирования и способов организации программ; |
Программирование микроконтроллеров
Продолжительность курса
Курс “Программирование микроконтроллеров” читается для студентов 2 курса в течение осеннего и весеннего семестров. Занятия проводятся один раз в неделю в течение 4 академических часов (5 и 6 пары). Учебная нагрузка – 60 часов/семестр. ОборудованиеОбучение производится на микроконтроллерах STM32F429. Курсовые и зачётные работы могут выполняться с использованием других микроконтроллеров STM32, а также на устройствах TI Stellaris или TI Tiva. |
STM32F429I-DISCOVERY |
Базовая часть
Тема 1. Введение. Программирование микроконтроллеров на языке С
Теория. Микроконтроллеры. Функции и применение микроконтроллеров. Основные параметры микроконтроллеров. Архитектура микроконтроллеров. Семейства микроконтроллеров ARM и их назначение. Устройство микроконтроллеров. Ядра Cortex-M0/M3/M4F. Периферийные блоки микроконтроллеров: ввод-вывод общего назначения, тактирование, таймеры, прерывания.
Язык С для микроконтроллеров ARM. Особенности разработки программ для микроконтроллеров по сравнению с программированием для ПК. Ввод и вывод. Адресация. Двоичное и шестнадцатеричное счисления. Среда программирования IAR EWARM. Возможности отладки программ.
Практика. Создание и настройка проекта в среде IAR. Создание прошивки, осуществляющей работу с блоком ввода-вывода общего назначения. Работа с технической документацией (поиск адресов аппаратных регистров, работа с принципиальной схемой тестовой платы).
Тема 2. Прерывания
Теория. Прерывания. Виды прерываний. Контроллер прерываний NVIC в ядре Cortex-M. Вектора прерываний. Приоритеты. Флаги прерываний в контроллерах STM. Рекомендации по написанию обработчиков прерываний.
Практика. Создание программы, реализующей асинхронный ввод-вывод сигналов. Освоение документации NVIC. Настройка прерываний блока ввода-вывода общего назначения.
Тема 3. Таймеры
Теория. Таймеры. Виды таймеров. Режимы работы таймеров. Измерение малых промежутков времени. Система тактирования микроконтроллера и методы её настройки.
Практика. Разработка программы для периодического вывода сигналов с использованием таймера и делителей частоты. Измерение параметров сигналов с помощью цифрового осциллографа.
Тема 4. Широтно-импульсная модуляция
Теория. Широтно-импульсная модуляция. Применение ШИМ для управления электронными устройствами. Особенности реализации ШИМ на микроконтроллере. Сглаживание. Специальные режимы работы таймеров.
Практика. Разработка программы для генерации ШИМ сигнала с заданными параметрами.
Тема 5. Цифро-аналоговые и аналого-цифровые преобразования
Теория. АЦП и ЦАП. Частота дискретизации и разрядность. Основные виды АЦП (АЦП прямого преобразования, АЦП последовательного приближения, сигма-дельта АЦП) и их характеристики. Режимы запуска АЦП. Дифференциальный режим измерения. Алгоритмы усреднения измеряемых величин: скользящее среднее и экспоненциальное усреднение. Библиотека для работы с периферийными блоками HAL Driver.
Практика. Разработка программы, осуществляющей измерение напряжения внешнего аналогового сигнала с помощью АЦП.
Тема 6. Обмен данными
Теория. Последовательные и параллельные интерфейсы. UART. Принцип работы шины UART, протокол передачи данных. События блока UART на микроконтроллерах STM32. Протоколы SPI и I2C, их принципы работы. Концепция ведущий-ведомые.
Практика. Разработка прошивки для микроконтроллера, осуществляющей приём и отправку данных по UART. Освоение программного обеспечения для работы с COM-портами на ПК.
Тема 7. Флеш-память
Теория. Принцип работы ячейки флеш-памяти (транзистор с плавающим затвором, чтение и запись данных). NOR и NAND конструкции флеш-памяти. Многоуровневые ячейки. Особенности работы с флеш-памятью из программ.
Практика. Разработка программы для подсчёта импульсов с использованием флеш-памяти для сохранения значения счётчика на случай перезагрузки или потери питания.
Дополнительные темы (читаются по усмотрению преподавателя)
Тема Д1. Дисплеи
Теория. Виды дисплеев. Электронно-лучевые трубки (принцип работы, развёртка). Жидкокристаллические дисплеи (принцип действия ЖК ячейки, устройство мониторов, адресация). Кодирование цветов, битность изображения. Плазменные дисплеи. Светодиодные дисплеи. Проекторы (3LCD, LC0S, DLP). Резистивные и ёмкостные сенсорные дисплеи. Перспективные виды дисплеев (OLED, интерференционные дисплеи, SED, PixelSense).
Практика. Написание программы, осуществляющей вывод графических примитивов и текста на TFT-LCD дисплей тестовой платы. Освоение высокоуровневых библиотек для работы с периферийными блоками и внешними устройствами.
Тема Д2. Система тактирования микроконтроллера
Теория. Классификация и принципы работы генераторов тактовой частоты. Кварцевые и RC-генераторы. Фазовая автоподстройка, делители и умножители частоты. Тактовые частоты шин данных и периферийных блоков микроконтроллера.
Практика. Настройка системы тактирования микроконтроллера, вывод тактового сигнала микроконтроллера. Измерение частоты тактирования с помощью осциллографа. Изучение зависимости формы сигнала от значения тактовой частоты.
Тема Д3. USB
Теория. Краткая история внедрения шины USB. Физический уровень (кабели и разъёмы, состояния шины, кодирование данных). Пакетный уровень (структура и виды пакетов). Транзакционный уровень (адреса, конечные точки). Логический уровень (виды каналов, передача данных по периодам). Дескрипторы и классы устройств. Краткий обзор спецификаций USB.
Практика. Передача данных с ПК на контроллер по USB c использованием CDC класса.
Тема Д4. Операционные системы реального времени
Теория. Операционные системы мягкого и жёсткого реального времени, а также их особенности. Диспетчеризация задач. Синхронизация задач. Операционная система FreeRTOS. Некоторые функции для управления задачами во FreeRTOS.
Практика. Настройка FreeRTOS и создание многозадачной программы для управления светодиодами.
Программа курса (весенний семестр)- Тематические лекции
- Дополнительные разделы программирования микроконтроллеров
- Выполнение курсовой работы по программированию
Осенний семестр – зачет
Весенний семестр – зачет с оценкой
– В конце осеннего семестра в течение 4 занятий выполняется зачетная работа.
Примеры тем зачетных работ:
- Измерение частоты внешнего сигнала с выводом результата на дисплей.
- Генерация ШИМ сигнала с регулировкой частоты и скважности.
- Измерение ёмкости конденсатора путём анализа формы отклика RC-цепи на периодический сигнал.
- Измерение индуктивности путём анализа формы отклика RL-цепи на периодический сигнал.
- Генерация гармонического сигнала путём модуляции одиночными импульсами.
- Измерение расстояния между акустическим излучателем и микрофоном с помощью измерения задержки распространения звука.
- Измерение скорости звука импульсным методом
- Стабилизация напряжения в RC цепи с обратной связью. Напряжение задаётся с компьютера и выводится на дисплей.
– В течение весеннего семестра выполняется курсовая работа.
По согласованию с научными руководителями курсовая работа по программированию может быть совмещена с курсовой работой по физике. Для этого нужно, чтобы работа в значительной мере была посвящена автоматизации эксперимента или другим задачам, подразумевающим программированию микроконтроллеров.
Курсовые работы прошлых лет можно посмотреть здесь.
Литература
- Конспекты первых 2 лекций: лекция 1, лекция 2.
- Мартин М. Инсайдерское руководство по STM32
- Брайан Керниган, Деннис Ритчи “Язык программирования С”
- Майоров С.А., Кириллов В.В., Приблуда А.А. “Введение в микро-ЭВМ”
- Тревор Мартин, “Микроконтроллеры фирмы STMicroelectronics на базе ядра Cortex-M3. Серия STM32”
- Фрунзе А.В. “Микроконтроллеры это же просто” (Том1, Том2, Том3)
- К. Хамахер, З. Вранешич, С. Заки “Организация ЭВМ”
- Paul Scherz. Practical electronics for inventors.
| Учебники по микроконтроллерам
Прежде чем мы погрузимся в программирование, нам нужно сначала изучить основы микроконтроллеров!
Содержание
- 1 Микроконтроллер Определенный
- 2 Внутри микроконтроллера
- 3 Микроконтроллер Программа
- 4 Загрузка программы на микроконтроллер
- 5 Powering
- 6 0008
Технически, компьютер — это любое устройство, которое выполняет математические или логические операции с помощью программ. Ваш компьютер и мой работают благодаря микропроцессору, который отличается от микроконтроллера. Для правильной работы микропроцессору нужны другие микросхемы — RAM, ROM и т. д. Между тем микроконтроллер уже имеет микропроцессор, ОЗУ и ПЗУ внутри.
Микроконтроллер — это компьютер, которым можно управлять с помощью программ. Но он не используется как ваш собственный компьютер, поскольку в основном используется для автоматического управления продуктами и устройствами. Они используются в медицинских устройствах, приборах, игрушках, автомобилях и многом другом! Низкая стоимость микроконтроллеров выгодна в этих областях по сравнению с микропроцессором (который уже сам по себе дорог), который все еще нуждается в других компонентах, называемых периферийными устройствами.
Внутри микроконтроллера
Микроконтроллеры бывают разных марок, и каждая марка имеет свой способ подключения внутренних частей микроконтроллера (это мы будем называть архитектурой). Типичный микроконтроллер содержит следующие части:
Центральный процессор или центральный процессор является ядром микроконтроллера. Это часть микроконтроллера, которая выполняет инструкции из пользовательской программы.
Память состоит из двух частей: программная память и оперативная память (ОЗУ) . Программа или флэш-память — это место, где хранится программа. Оперативная память — это местонахождение регистров, необходимых для создания приложений для микроконтроллера. В других микроконтроллерах ОЗУ является частью ЦП и называется регистровым файлом.
В устройствах CISC (компьютер со сложным набором команд, также называемый архитектурой фон Неймана ) программная память и ОЗУ находятся в одном месте. С другой стороны, RISC 9Устройство 0024 (компьютер с сокращенным набором команд, также называемое Гарвардской архитектурой ) отделяет программную память от ОЗУ. Микроконтроллеры в основном представляют собой RISC-устройства.
Другим типом памяти является постоянное запоминающее устройство (ПЗУ) , которое сохраняет данные, даже если на микроконтроллер не подается питание. Это отличается от оперативной памяти (ОЗУ) , где данные стираются при выключении микроконтроллера. Однако постоянная память не связана напрямую с ЦП и обычно является частью периферийного устройства.
Блок ввода/вывода представляет собой интерфейс между внешним миром и внутренними частями микроконтроллера. Блок ввода-вывода или порт могут принимать данные, отправлять данные или оставаться в состоянии ожидания. Вывод на порту также может иметь другие функции, назначаемые регистром в ОЗУ.
Все микроконтроллеры имеют таймера , которые могут служить ряду целей. Таймер микроконтроллера может быть автономным (работает независимо от программы) или сторожевым (сбрасывается через определенный интервал времени). Автономный таймер используется, например, для подсчета нажатий кнопок или создания тактового сигнала.
Периферийные устройства внутри микроконтроллера различаются от устройства к устройству. Большинство из них имеют аналого-цифровые преобразователи и последовательный приемник/передатчик . Периферийное устройство дает дополнительную функцию микроконтроллеру. Мы узнаем больше о периферийных устройствах по ходу дела.
Программа микроконтроллера
Программа представляет собой набор инструкций, которые должен выполнять ЦП. Это может быть низкий уровень (сборка) или высокий уровень (C/C++, Basic, Python) . Они преобразуются в комбинацию 1 и 0 или машинный код .
Низкоуровневая программа или программа на ассемблере использует мнемонику, удобочитаемую для человека. Ни один язык ассемблера не подходит для всех устройств: они созданы для конкретной машины.
Программа на ассемблере может быть напрямую преобразована в машинный код и поэтому занимает меньше места в программной памяти микроконтроллера. Критические по времени приложения также лучше кодируются на ассемблере из-за осведомленности о циклах команд.
Однако программирование на ассемблере намного сложнее для программиста, так как вы, по сути, работаете с числами. Программирование на языке ассемблера включает в себя перемещение чисел и применение арифметических и логических операций.
Программа высокого уровня менее утомительна для программиста и, как правило, является кроссплатформенной (может работать на нескольких устройствах). Наиболее популярным языком программирования высокого уровня является C/C++. Платформа Arduino использует C/C++ для своей IDE (интегрированной среды разработки). PIC также имеет среду программирования, использующую C. Большинство руководств на этом сайте будут использовать C/C++ в качестве языка программирования.
Загрузка программы в микроконтроллер
Программа пишется с использованием IDE, а затем ассемблируется (если язык ассемблера) или компилируется (если язык высокого уровня). Машинный код, сгенерированный после компиляции и сборки, закодирован в так называемый двоичный файл . HEX-файл — это ASCII-представление двоичных файлов. Некоторые микроконтроллеры используют файлы BIN вместо файлов HEX. Файл HEX или BIN читается и интерпретируется программным обеспечением. Затем декодированный машинный код записывается во флэш-память микроконтроллера.
Программатор необходим для загрузки программы во флэш-память микроконтроллера. Аппаратное обеспечение может использовать различные способы программирования устройства. Когда компьютеры были старше, программы загружались в микроконтроллер через параллельный порт. Размер параллельных портов является недостатком современных компьютеров, поэтому они были полностью удалены. В настоящее время микроконтроллеры программируются через USB с помощью внутрисхемных последовательных программаторов (ICSP). Для PIC аппаратное обеспечение ICSP называется PicKit. Для AVR это Atmel-ICE. Вы также можете создать собственную схему ICSP.
Загрузка — еще один метод программирования микроконтроллера. Загрузчик — это программа, загруженная в микроконтроллер, которая может изменять программу во флэш-памяти. С ним для обновления программы микроконтроллера не потребуется отдельный аппаратный программатор — персональный компьютер может отправить программу через последовательный порт (USB).
Arduino имеет загрузчик, который принимает программу, отправленную пользователем через USB. PIC и AVR также могут использовать загрузчики. ICSP по-прежнему необходим для загрузки загрузчика в первый раз.
Включение питания
Микроконтроллеры обычно не потребляют много энергии. Большинство устройств работают от 5 В, а некоторые от 3,3 В и потребляют около 200 мА. Обратите внимание, что микроконтроллеры должны работать при напряжении, указанном в их спецификациях. В противном случае это означает повреждение устройства.
Электропитание также должно быть плавным или регулируемым. Нерегулируемый источник питания создает скачки напряжения, которые могут повредить микроконтроллер. Сглаживающий конденсатор добавлен между клеммами + и – источника питания для фильтрации скачков напряжения.
Резюме
- Микроконтроллер — это устройство, которое может принимать программы для выполнения определенных задач
- Типичный микроконтроллер имеет ЦП, память, блок ввода/вывода, таймер и другие периферийные устройства
- Программа микроконтроллера может быть низкоуровневой или высокоуровневой. Для приложений, критичных к пространству и времени выполнения программы, предпочтительным является язык ассемблера низкого уровня. Языки высокого уровня, такие как C/C++, проще в использовании.
- Программа загружается в микроконтроллер через ICSP или через загрузчик
- Микроконтроллеры чувствительны к колебаниям напряжения и должны работать в соответствии со спецификацией .
Это основы микроконтроллера. Далее мы создадим нашу самую первую программу для микроконтроллера.
Далее >> PIC16F84A — микроконтроллер для начинающих
Введение в микроконтроллеры — для начинающих
Майк Сильва●20 августа 2013 г. ●Tweet
Добро пожаловать в серию руководств «Введение в программирование микроконтроллеров». Если вы хотите изучить основы встроенного программирования для микроконтроллеров (а также немного дизайна встроенного оборудования), я надеюсь, что эти учебные пособия помогут вам в этом путешествии. Это мои первые публикации здесь, и я пишу эту серию руководств, потому что на протяжении многих лет я видел бесчисленное количество новичков, задающих одни и те же вопросы и спотыкающихся о одни и те же камни преткновения, и я подумал, что смогу придумать что-то полезное в ответах. эти вопросы, и в избегании этих точек срабатывания.
- Часть 1. Введение в микроконтроллеры. Начало
- Часть 2. Введение в микроконтроллеры. Дальнейшее начало
- Часть 3. Введение в микроконтроллеры. Hello World
- Часть 4. Введение в микроконтроллеры. Введение в микроконтроллеры. Прерывания
- Часть 6. Введение в микроконтроллеры. Подробнее о прерываниях
- Часть 7. Введение в микроконтроллеры. Таймеры
- Часть 8. Введение в микроконтроллеры.0008
- Часть 9. Знакомство с микроконтроллерами — Дополнительные таймеры и дисплеи
- Часть 10. Знакомство с микроконтроллерами — кнопки и дребезг
- Часть 11. Знакомство с микроконтроллерами — матрица кнопок и автоматическое повторение
- Часть 12. Знакомство с микроконтроллерами — управление WS2812 Светодиоды RGB
- Часть 13. Введение в микроконтроллеры — 7-сегментные дисплеи и мультиплексирование
- Часть 14. Введение в микроконтроллеры — Ада — 7 сегментов и обнаружение ошибок
Целевая аудитория
Эта серия руководств предназначена для студентов, любителей, программистов и разработчиков оборудования, которые хотят изучить основы программирования микроконтроллеров или заполнить некоторые пробелы в своих знаниях в области программирования. Этот учебник не научит вас программированию в целом, хотя в нем будут обсуждаться методы программирования, представляющие особый интерес для микроконтроллеров. Этот учебник также не научит вас проектировать аппаратное обеспечение, хотя и проиллюстрирует аппаратные проблемы, с которыми обычно сталкиваются при использовании микроконтроллеров. Я надеюсь, что это поможет новичку понять, что такое микроконтроллер (μC), какими возможностями он обычно обладает и как использовать эти возможности. Он будет идти с самого начала — как подключить и запрограммировать микроконтроллер на мигание и светодиод (микроконтроллерная версия программы «Hello World»), через различные функции и периферийные устройства, обычно используемые в микроконтроллерах, такие как прерывания, таймеры / счетчики, UART, SPI, I2C, АЦП, ЦАП, ШИМ, сторожевой таймер и т.д. Также будут рассмотрены общие темы, такие как подавление дребезга входных сигналов, фильтрация значений АЦП, управление жидкокристаллическими дисплеями символов и другие подобные задачи.
Эта статья доступна в формате PDF для удобной печати. Это относится практически ко всему, что вы прочтете в этом уроке. Если вы прочтете здесь «Х», не думайте, что это означает «Х и только Х, во всех возможных ситуациях, без исключений или оговорок, сейчас и навсегда». Разработчики микроконтроллеров придумали много разных, интересных, а иногда и просто странных способов сделать что-то. И как пользователь микроконтроллера и программист, вы тоже можете придумать много разных и интересных способов сделать что-то. По моему опыту, для программы, состоящей из N шагов, вероятно, существует как минимум N-квадрат способов написания этой программы. Цель этого руководства состоит в том, чтобы попытаться дать вам прочную основу для программирования микроконтроллеров, а не в том, чтобы быть всеобъемлющей энциклопедией в этой области. Для каждого примера программы я постараюсь написать ее простым и понятным способом, а затем дам вам возможность найти свои собственные хитрые приемы.
Другой возможный источник путаницы — терминология. Разные производители довольно часто используют разную терминологию для одних и тех же или похожих функций, регистров и опций конфигурации/состояния. В этом руководстве иногда я буду использовать терминологию, используемую одним из семейств микроконтроллеров , используемых в руководстве, а в других случаях я буду использовать неспецифическую терминологию. Я буду использовать то, что кажется подходящим для каждой ситуации.
Что такое встроенное программирование?
Встроенное программирование — это термин, обозначающий компьютерное программирование, которое используется во множестве управляемых компьютером устройств, которые окружают нас в наших домах, автомобилях, на рабочих местах и в сообществах. Чтобы было ясно, все программирование микроконтроллеров является встроенным программированием, но не все встроенное программирование является программированием микроконтроллера. Об этом чуть подробнее будет сказано далее. Иногда эти термины используются взаимозаменяемо, но основное внимание в этой серии руководств всегда уделяется микроконтроллерам.
На каждый имеющийся у вас настольный компьютер, ноутбук или планшет приходится дюжина или более (возможно, намного больше) микроконтроллеров, тихо выполняющих свои встроенные функции, и с этими устройствами многие люди даже не осознают, что речь идет о крошечном компьютере. запуск программы. Но они есть, и они есть, и эти программы нужно было написать, и именно поэтому миру нужно встроенное программирование. Микроконтроллеры добавляют интеллект бесчисленным устройствам и системам, позволяя этим устройствам и системам работать лучше, быстрее, безопаснее, эффективнее, удобнее, с большей пользой, и во многих случаях допуская само существование устройств и систем, которые нельзя было бы построить иначе. . Потратьте некоторое время на то, чтобы осмотреться и попытаться понять, где работают микроконтроллеры, и вы начнете понимать, насколько они стали вездесущими с момента их изобретения более 40 лет назад.
Вдобавок ко всему, многие люди, включая меня, считают программирование микроконтроллеров особенно увлекательной и полезной ветвью дерева программирования, и мы просто как программируем встроенные системы. Способы, сильно отличающиеся от большинства программ для настольных компьютеров или мэйнфреймов, встроенные программы делают вещи делают вещи , и для встроенного программиста вещи, делающие вещи, бесконечно круты.
Что такое встроенная система?
На этот вопрос нет идеального ответа, так как каждый ответ будет иметь некоторые исключения. Однако для наших целей давайте объявим, что встроенная система — это система, в которой используется один или несколько микрокомпьютеров (то есть от маленьких до очень и очень маленьких компьютеров), на которых выполняются специальные специальные программы и которые подключены к специализированному оборудованию для выполнения определенного набора функций. . Это можно сравнить с компьютером общего назначения, таким как знакомый настольный компьютер или ноутбук, которые не предназначены для запуска только одной специальной программы с одним специализированным набором оборудования. Это не идеальное определение, но это начало.
Некоторые примеры встроенных систем:
• Сигнализация / система безопасности
• Автомобильный круиз-контроль
• Термостат отопления / кондиционирования воздуха
• Микроволновая печь
• Контроллер противоскольжения
• Контроллер светофора
• Торговый автомат
• Газовый насос
• Портативная игра-судоку
• Контроллер ирригационной системы
• Рыба-поющая стена (или эквивалент этого сезона подарков)
• Мультикоптер
• Осциллограф
• Марсоход
По большей части я перечислил примеры встроенных приложений на менее сложном конце спектра, так как это, в конце концов, начальное руководство. К концу этой серии руководств у вас должно быть хорошее общее представление о том, как будет запрограммировано большинство этих приложений, и в общих чертах, какие типы ввода-вывода, синхронизации, прерывания и аппаратного обеспечения и функций для них потребуются.
В приведенном выше списке есть несколько вещей, на которые стоит обратить внимание. В то время как многие встроенные системы используют довольно традиционные пользовательские устройства ввода-вывода (клавиатуры, дисплеи), многие другие этого не делают. Кроме того, многие встроенные системы взаимодействуют напрямую с людьми, а другие нет (и мы все еще ждем, будет ли марсоход напрямую взаимодействовать с какими-либо марсианами).
Чем отличается встроенное программирование?
Встроенные программы должны тесно взаимодействовать со специализированными компонентами и специальными схемами, составляющими аппаратное обеспечение. В отличие от программирования поверх полнофункциональной операционной системы, где детали аппаратного обеспечения максимально удалены от внимания и контроля программиста, большая часть встроенного программирования работает непосредственно с аппаратным обеспечением и на нем. Сюда входит не только аппаратное обеспечение ЦП, но и аппаратное обеспечение, из которого состоят все периферийные устройства (как встроенные, так и внешние) системы. Таким образом, встроенный программист должен иметь хорошие знания об оборудовании, по крайней мере, в том, что касается написания программного обеспечения, которое правильно взаимодействует с этим оборудованием и манипулирует им. Эти знания часто распространяются на определение ключевых компонентов аппаратного обеспечения (микроконтроллер, устройства памяти, устройства ввода-вывода и т. д.), а в небольших организациях иногда доходят до проектирования и компоновки (в виде печатной платы) аппаратного обеспечения. Встроенному программисту также необходимо хорошо разбираться в отладочном оборудовании, таком как мультиметры, осциллографы, логические анализаторы и тому подобное.
Другое отличие от компьютеров общего назначения состоит в том, что большинство (но не все) встраиваемых систем весьма ограничены по сравнению с первыми. Микрокомпьютеры, используемые во встроенных системах, могут иметь размер программной памяти от нескольких тысяч до нескольких сотен тысяч байт, а не гигабайты в настольном компьютере, и обычно имеют даже меньший объем памяти данных (ОЗУ), чем память программ. Кроме того, процессоры часто представляют собой 8- и 16-разрядные устройства меньшего размера, в отличие от 32-разрядных и более крупных устройств, используемых в настольных компьютерах (хотя небольшие 32-разрядные микроконтроллеры сейчас стоят менее доллара в умеренных количествах, что удивительно). Меньший размер слова ЦП означает, среди прочего, что программе потребуется больше инструкций (и, следовательно, больше тактовых циклов), чем эквивалентной программе, работающей на ЦП с большим размером слова. И, наконец, скорость, с которой работают микроконтроллеры меньшего размера, намного меньше, чем скорость, с которой работает ПК. Типичная тактовая частота микроконтроллера меньшего размера составляет от 1 до 200 МГц, а не тактовая частота ПК.
В чем разница между микрокомпьютером, микропроцессором и микроконтроллером?
Под микропроцессором обычно понимают однокристальный центральный процессор (ЦП), при этом ЦП является «мозгом» компьютера — частью компьютера, выполняющей программные инструкции. Микрокомпьютер — это любой компьютер, построенный на основе микропроцессора, вместе с памятью программ и данных, а также устройствами ввода-вывода и другими периферийными устройствами по мере необходимости. Микроконтроллер (часто сокращаемый до μC в этом руководстве) — это одночиповое устройство, в которое встроен не только микропроцессор, но и энергонезависимая память программ (ПЗУ) и энергозависимых данных (ОЗУ), а также полезные периферийные устройства. такие как ввод-вывод общего назначения (GPIO), таймеры и каналы последовательной связи. Отсюда следует, что все микроконтроллеры являются микрокомпьютерами, но не все микрокомпьютеры используют микроконтроллеры.
В небольших встраиваемых системах чаще всего используются микроконтроллеры, а не конструкции на основе микропроцессоров , поскольку микроконтроллеры обеспечивают наиболее компактную конструкцию и самую низкую стоимость оборудования. С другой стороны, более крупные встроенные системы могут использовать один или несколько микропроцессоров, если не удается найти микроконтроллер с подходящей скоростью и функциональностью. Это может распространяться на использование промышленных ПК и даже более мощного оборудования. Также возможно включать как микропроцессоры, так и микроконтроллеры в сложную встраиваемую систему. Единственными реальными правилами являются использование любых устройств, соответствующих задаче, с учетом ограничений по бюджету, доступности, времени, инструментам и т. д.
Следует также отметить, что к большинству микроконтроллеров можно добавить внешнюю память и периферийные устройства, если встроенный микс не позаботится обо всех потребностях системы. Когда имеет смысл добавлять такие внешние устройства, а не выбирать более крупный микроконтроллер с необходимыми ресурсами на борту, это выбор, который необходимо делать на индивидуальной проектной основе.
Что такое N-разрядный ЦП/микропроцессор/микроконтроллер?
Существует дискуссия о том, что значит называть устройство N-битным процессором, но в большинстве случаев это довольно очевидно. Если устройство может выполнять большинство своих инструкций по обработке данных со словами данных размером до N бит, то устройство является N-битным процессором. Например, устройство может иметь полный набор инструкций, которые могут работать с 8-битными данными, а также несколько инструкций, которые работают с 16-битными данными. Это устройство следует считать 8-битным, даже если отдел маркетинга утверждает обратное и называет его 16-битным чипом.
По объему 8-битные микроконтроллеры составляют самый большой сегмент рынка встраиваемых систем. Многие приложения просто не нуждаются в дополнительной мощности и никогда не будут нуждаться в ней. 16-разрядные устройства более мощные, но они занимают место между 8-разрядными устройствами младшего уровня и 32-разрядными устройствами высокого класса. 32-разрядные устройства находятся на верхнем уровне встраиваемого спектра для всех, кроме самых сложных или высокопроизводительных конструкций, но их цена постоянно снижается.
Какие семейства микроконтроллеров используются в этих руководствах?
Чтобы дать небольшой обзор различных разновидностей доступных микроконтроллеров, это руководство будет написано для одного 8-битного семейства (Atmel AVR) и одного 32-битного семейства (архитектура ARM Cortex M3 в форме семейство STM32). Эти два семейства были выбраны, чтобы дать довольно широкое представление об устройствах и подходах, используемых в мире микроконтроллеров. Первые несколько примеров программного обеспечения будут написаны на языке ассемблера для каждого из этих семейств, а также на языке C. После этого примеры будут написаны только на языке C.
Что еще нужно для этих уроков?
Хотя я полагаю, что вы могли бы проработать большую часть этого руководства, используя только симулятор микроконтроллера, я настоятельно рекомендую вам иметь либо плату для обучения/отработки микроконтроллера, либо даже просто микросхему микроконтроллера, набор компонентов и макетную плату с питанием. Кроме того, вам понадобится компилятор C, предназначенный для вашего устройства, и, возможно, ассемблер для вашего устройства. У вас не должно возникнуть проблем с поиском бесплатного ассемблера для вашего чипа, и вы также сможете найти бесплатный компилятор C, даже если это версия коммерческого компилятора с ограниченной функциональностью. Вам также понадобится способ загрузки ваших программ в ваш микроконтроллер. Детали этого процесса загрузки будут тесно зависеть от конкретного микроконтроллера и платы, на которой он установлен.
Что касается контрольно-измерительного оборудования, цифровые мультиметры очень дешевы, и нет никаких оправданий тому, чтобы их не иметь. Такие места, как Harbour Freight, иногда продают их по несколько долларов. Другой элемент оборудования, который должен быть у любого встроенного инженера, — это приличный осциллограф. Не паникуйте, для этих руководств не требуется прицел. Однако, если вы сможете заполучить один из них, вы узнаете больше и сэкономите себе немало времени в придачу. USB-прицелы дают хорошую отдачу, как и некоторые импортные прицелы (или, конечно, работающие бывшие в употреблении прицелы). В конце прошлого года я побаловал себя прекрасным осциллографом Agilent с огромным (для меня) экраном и каждый раз, когда использую его, радуюсь потраченным деньгам.
Что касается микроконтроллеров, используемых в этих учебных пособиях, вот подробная информация об аппаратном обеспечении, которое я буду использовать для каждого из семейств процессоров:
AVR
•Аппаратное обеспечение: плата Atmel STK-500 с установленным ATmega8515
•Инструменты: Atmel Studio 6 (бесплатно)
ARM Cortex M3
• Аппаратное обеспечение: STM32VLDiscovery Board, установленная на специальной стыковочной плате
• Инструменты: Rowley Crossworks (150 долларов США за персональную лицензию — рекомендуем IAR Embedded Workbench Kickstart Edition для получения бесплатного набора инструментов)
Какой язык программирования?
Самое время немного поговорить о различных языках программирования, которые можно использовать для написания встраиваемого программного обеспечения. В этом уроке я буду использовать два языка: C и ассемблер. Первое, на что я хочу обратить внимание, это то, что это , а не , единственные два языка, доступные программистам встраиваемых систем, и что во многих случаях другие языки могут быть лучшим выбором. При этом и Си, и язык ассемблера полезны не только для изучения программирования на микроСи, но и для фактического продуктивного программирования на микроСи. Они также широко распространены в том смысле, что независимо от того, какой микроконтроллер вы выберете, он почти наверняка будет иметь доступ как к ассемблеру (для обработки исходного кода на языке ассемблера), так и к компилятору C (для обработки исходного кода C). То же самое определенно не относится к другим языкам. Но я бы посоветовал вам рассмотреть другие языки, если вы так склонны, и, если они доступны для вашего семейства устройств.
Что касается языка ассемблера, даже если вы не планируете использовать язык ассемблера в своих встроенных программах, я настоятельно рекомендую вам хотя бы немного ознакомиться с концепциями и набором инструкций вашего микроконтроллера. Причина этого в том, что, даже если вы в конечном итоге не напишете какой-либо язык ассемблера (я почти никогда не напишу больше), в какой-то момент вы обнаружите, что вам нужно изучить вывод вашего компилятора и/или ваш компилятор. файлы запуска, написанные или выведенные на ассемблере.
Также обратите внимание, что термин «язык ассемблера» часто сокращается в этом руководстве и в других местах до «asm» или «ASM».
Как работает встроенная программа?
Прежде чем говорить о встроенном программировании, здесь уместно дать краткий обзор того, как запускается и работает встроенная программа. Если предположить, что вы сгенерировали программный файл и загрузили его в программную память микроконтроллера (все шаги, о которых мы поговорим более подробно позже), хорошие вещи происходят, когда вы либо включаете устройство, либо нажимаете кнопку RESET. Когда микроконтроллер выходит из состояния сброса в результате любого действия, он всегда переходит в определенное место в памяти, как определено производителем, чтобы начать выполнение любого кода, найденного там или указанного там. Иногда эта ячейка памяти содержит непосредственно код; например после выхода из сброса выполнение программы начинается с адреса программы 0. В других случаях фиксированная ячейка памяти представляет собой вектор, ячейку, которая содержит фактический адрес начала программы; например после выхода из состояния сброса контроллер загрузит в свой программный счетчик значение, найденное по программному адресу 0xFFFE, и, таким образом, начнет выполнение кода с адреса, найденного в ячейках 0xFFFE и 0xFFFF (при условии, что 16-битный программный адрес хранится в 2 байтах). В первом случае вам нужно будет убедиться, что ваша программа загрузилась по указанному стартовому адресу, а во втором случае вы загрузите свою программу везде, где память программы была помещена в адресное пространство контроллера, и вам нужно будет сделать убедитесь, что вы затем загрузите этот начальный адрес в вектор адреса сброса. Обратите внимание, что выбор метода запуска не зависит от вас, он будет встроен в конструкцию выбранного вами микроконтроллера. AVR использует первый метод, а Cortex M3 — второй.
Когда встроенная программа начинает выполняться, обычно необходимо выполнить достаточное количество операций по инициализации и обслуживанию, прежде чем начнется работа программы. Большая часть этой инициализации – это то, что средний программист настольных компьютеров никогда не увидит, поскольку он обрабатывается загрузочным кодом компьютера и операционной системой. Но во встроенной системе вполне вероятно, что нет операционной системы, и весь загрузочный код и другой код запуска должен быть предоставлен явно. Некоторое очень важное оборудование может потребоваться сначала инициализировать, например. оборудование, которое контролирует время доступа к памяти и карты адресов, а также аппаратное обеспечение системных часов. Затем может потребоваться некоторая инициализация программного обеспечения, например, установка указателя стека и, возможно, копирование данных из энергонезависимой памяти в энергозависимую память, где к ним можно получить доступ и, возможно, изменить. После этого обычно следует еще один этап аппаратной инициализации, настройки любых периферийных устройств, необходимых системе, и установки начальных состояний вывода. Наконец, может произойти еще один раунд инициализации программного обеспечения.
Эта инициализация обычно разбивается на две части: первые шаги аппаратной и программной инициализации часто выполняются в так называемом коде запуска, а последующие аппаратные и программные шаги выполняются в пользовательской программе. Это разграничение более отчетливо в программе C, где код запуска невидим для программы C, поскольку это код, который происходит до запуска main() и заканчивается переходом или вызовом main(), где начинается видимая программа C. . В программе на ассемблере все шаги инициализации могут быть одинаково видны в пользовательском коде, хотя даже в этом случае первые шаги могут находиться в отдельном исходном файле запуска.
Примечание к примерам программ
Каждый раздел учебника будет включать несколько коротких примеров программ.