А.С. Васильев, О.Ю. Лашманов, А.В. Пантюшин ОСНОВЫ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ Санкт-Петербург 2016
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ УНИВЕРСИТЕТ ИТМО А.С. Васильев, О.Ю. Лашманов А.В. Пантюшин ОСНОВЫ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ Учебно-методическое пособие Санкт-Петербург 2016
Васильев А.С., Лашманов О.Ю., Пантюшин А.В. Основы программирования микроконтроллеров. – СПб: Университет ИТМО, 2016. – 95с. В учебно-методическом пособии рассмотрены основные понятия и концепции программирования микроконтроллеров на примере микроконтроллеров серии 1986ВЕ9x производства ЗАО «ПКК МИЛАНДР» в среде разработки Keil uVision. Первый раздел пособия содержит техническое описание устройства микроконтроллера, теоретические сведения основ программирования на языке С в среде Keil uVision, второй раздел включает варианты индивидуальных заданий для выполнения студентами лабораторных работ по курсу «Основы программирования микроконтроллеров». Задания рассчитаны на освоение и понимания концепции и базового функционала микроконтроллеров серии 1986ВЕ9x. Учебно-методическое пособие предназначено для студентов по направлению подготовки 12.04.02 «Оптотехника», 27.04.05 «Инноватика» и специальности 12.05.01 «Электронные и оптико-электронные приборы и системы специального назначения» Рекомендовано к печати ученым советом факультета лазерной и световой инженерии, протокол № 9от 13.09.2016 Университет ИТМО – ведущий вуз России в области информационных и фотонных технологий, один из немногих российских вузов, получивших в 2009 году статус национального исследовательского университета. С 2013 года Университет ИТМО – участник программы повышения конкурентоспособности российских университетов среди ведущих мировых научно-образовательных центров, известной как проект «5 в 100». Цель Университета ИТМО– становление исследовательского университета мирового уровня, предпринимательского по типу, ориентированного на интернационализацию всех направлений деятельности. Университет ИТМО, 2016 Васильев А.С., Лашманов О.Ю., Пантюшин А.В. 2016
3 Введение Микроконтроллеры представляют собой мощный вычислительный инструмент и прекрасную основу для создания современных высокопроизводительных и экономичных встраиваемых систем многоцелевого назначения. В одной микросхеме микроконтроллер включает в себя микропроцессор, память программ (обычно на основе ПЗУ), память данных (обычно на основе ОЗУ), устройство ввода/вывода, генератор тактовых сигналов, аппаратную поддержку интерфейсов I2C, SPI и многое другое. Однокристальные микроконтроллеры находят широкое применение в самых разнообразных сферах: от измерительных приборов, фотоаппаратов и видеокамер, принтеров, сканеров и копировальных аппаратов до изделий электронных развлечений и всевозможной домашней техники. В рамках обучения принципам работы и архитектуры микроконтроллеров студентам будет предложено познакомиться с микроконтроллерами серии 1986ВЕ9x, основанных на ядре ARM архитектуре, производства одного из лидера разработки отечественной микроэлектронной элементной базы ЗАО «ПКК МИЛАНДР». На заре возникновения микропроцессоров разработка программного обеспечения происходила исключительно на том или ином языке ассемблера, ориентированном на конкретное устройство. По сути, такие языки представляли собой символьные мнемоники соответствующих машинных кодов, а перевод мнемоники в машинный код выполнялся транслятором. При этом главный недостаток ассемблерных языков заключался в том, что каждый из них был привязан к конкретному типу устройств и логике его работы. Кроме того, ассемблер сложен в освоении, что требует достаточно больших усилий для его изучения, но главное, если впоследствии потребуется перейти на использование микроконтроллеров других производителей, то они (усилия) окажутся потраченными впустую. Студентам, обучающимся по курсу «Основы программирования микроконтроллеров», будет предложено разрабатывать программное обеспечение микроконтроллера на языке С. Язык С, являясь языком высокого уровня, лишен недостатков ассемблера и может использоваться для программирования любого микропроцессора, для которого есть компилятор с языка С. В языке С все низкоуровневые операции, выполняемые компьютерами, представлены в виде абстрактных конструкций, позволяющих разработчикам сосредоточиться на программировании одной лишь логики, не заботясь о машинном коде. Изучив язык С, можно легко переходить от одного семейства микроконтроллеров к другому, тратя гораздо меньше времени на разработку. 4 Студентам в рамках данного курса будет предложено выполнять разработку программного обеспечения микроконтроллеров в интегрированной среде программирования Keil uVision фирмы Keil Elektronik. Данная среда предоставляет пользователю набор средств для написания и отладки кода программ для микроконтроллеров на основе ядра ARM7, ARM9, Cortex M3 и других. В бесплатный дистрибутив входят следующие средства: – интегрированная среда разработки; – С/С++ компилятор; – макроассемблер и линковщик; – дебаггер uVision; – дополнительные утилиты.
5 1 Архитектура микроконтроллеров серии 1986ВЕ9x Микроконтроллеры серии 1986ВЕ9x, К1986ВЕ9х и К1986ВЕ92QI, К1986ВЕ92QC (далее 1986ВЕ9x), построенные на базе высокопроизводительного процессорного RISC ядра ARM Cortex-M3, содержат встроенную 128 Кбайт Flash-память программ и 32 Кбайта ОЗУ. Микроконтроллеры работают на тактовой частоте до 80 МГц. Периферия микроконтроллера включает контроллер USB интерфейса со встроенным аналоговым приемопередатчиком со скоростями передачи 12 Мбит/с (Full Speed) и 1.5 Мбит/с (Low Speed), стандартные интерфейсы UART, SPI и I2C, контроллер внешней системной шины, что позволяет работать с внешними микросхемами статического ОЗУ и ПЗУ, NAND Flash-памятью и другими внешними устройствами. Микроконтроллеры содержат три 16-разрядных таймера с 4 каналами схем захвата и ШИМ с функциями формирования «мертвой зоны» и аппаратной блокировки, а также системный 24-х разрядный таймер и два сторожевых таймера. Кроме того, в состав микроконтроллеров входят: два 12-разрядных высокоскоростных (до 0,5М выборок в сек) АЦП с возможностью оцифровки информации от 16 внешних каналов и от встроенных датчиков температуры и опорного напряжения; два 12-разрядных ЦАП; встроенный компаратор с тремя входами и внутренней шкалой напряжений. Встроенные RC генераторы HSI (8 МГц) и LSI (40 кГц) и внешние генераторы HSE (2…16 МГц) и LSE (32 кГц) и две схемы умножения тактовой частоты PLL для ядра и USB интерфейса позволяют гибко настраивать скорость работы микроконтроллеров. Архитектура системы памяти за счет матрицы системных шин позволяет минимизировать возможные конфликты при работе системы и повысить общую производительность. Контроллер DMA позволяет ускорить обмен информацией между ОЗУ и периферией без участи процессорного ядра. Встроенный регулятор предназначенный для формирования питания внутренний цифровой части формирует напряжения 1,8В и не требует дополнительных внешних элементов. Таким образом, для работы микроконтроллера достаточно одного внешнего напряжения питания в диапазоне от 2,2 до 3,6В. Так же в микроконтроллерах реализован батарейный домен, работающий от внешней батареи при отсутствии основного питания. В батарейном домене могут быть сохранены специальные флаги, а также работают часы реального времени. Встроенные детекторы напряжения питания могут отслеживать уровень внешнего основного питания, уровень напряжения питания на батареи. Аппаратные схемы сброса при просадке питания позволяют исключить сбойную работу микросхемы при выходе уровня напряжения питания за допустимые приделы. 6 Основные технические характеристики микроконтроллеров серии 1986ВЕ9x приведены в таблице 1. Таблица1 – Основные характеристики микроконтроллеров серии 1986ВЕ9x 1986ВЕ91T 1986ВЕ94T К1986ВЕ91Н4 1986ВЕ92У К1986ВЕ92QI К1986ВЕ92QC 1986ВЕ93У Корпус 132 вывода бескорпусная 64 вывода 48 выводов Ядро ARM Cortex-M3 ПЗУ 128 Кбайт Flash ОЗУ 32 Кбайт Питание 2,2…3,6 В Частота 80 МГц USER IO 96 96 43 30 USB Device и Host FS (до 12 Мбит/с) встроенный PHY UART 2 2 2 2 CAN 2 2 2 2 SPI 2 2 2 1 I2C 1 1 1 - 2 х 12- разрядных АЦП 16 каналов 16 каналов 8 каналов 4 канала ЦАП 12 разрядов 2 2 1 1 Компаратор 3 входа 3 входа 2 входа 2 входа Внешняя шина 32 разряда 32 разряда 8 разряда - На рисунке1 показана структурная блок-схема микроконтроллера серии 1986ВЕ9x.
7 Рисунок 1 – Структурная блок-схема микроконтроллера серии 1986ВЕ9x. Память микроконтроллера реализована с единым адресным пространством, которая имеет максимальный объем 4 Гбайта. В данное адресное пространство отображаются различные модули памяти и периферии. AMBA AHB Арбитр шины ARM Cortex-M3 RISC CORE Контроллер прямого доступа в память, DMA Контроллер прерываний 1хСистемный таймер JTAG/SW отладчик ППЗУ (Flash) Память программ 4х8Kх32 ОЗУ Память программ 8Kх32 ПЗУ 256х32 Внешняя системная шина AHBAPB мост К он трол л ер U A R T 2 к ан ал а К он трол л ер I2C К он трол л ер си ст ем н ой ч ас тот ы К он трол л ер S P I 2 к ан ал а К он трол л ер B K P Д ет ек тор н ап ряж ен и й П орт ы в в од а/ в ы в од а 3х16 та й м ер А Ц П Ц А П U S B
8 Адрес Размер Блок Примечание Память программ 0x0000_0000 1 Кбайт BOOT ROM Загрузочная программа 0x0800_0000 128 Кбайт EEPROM Область Flash-памяти программ с пользовательской программой 0x1000_0000 256 Мбайт EXTERNAL BUS Область доступа к внешней системной шине Память данных 0x2000_0000 32Кбайт SYSTEM RAM Область внутреннего ОЗУ 0x2200_0000 16 Мбайт SYSTEM RAM Bit Band Region Область битового доступа внутреннего ОЗУ 0x3000_0000 256 Мбайт EXTERNAL BUS Область доступа к внешней системной шине Периферия 0x4000_0000 1536 байт 0 CAN1 Регистры контроллера интерфейса CAN1 0x4000_8000 1536 байт 1 CAN2 Регистры контроллера интерфейса CAN2 0x4001_0000 904 байт 2 USB Регистры контроллера интерфейса USB 0x4001_8000 20 байт 3 EEPROM_CNTRL Регистры контроллера Flash-памяти программ 0x4002_0000 48 байт 4 RST_CLK Регистры контроллера сигналов тактовой частоты 0x4002_8000 80 байт 5 DMA Регистры контроллера прямого доступа в память 0x4003_0000 72 байт 6 UART1 Регистры контроллера интерфейса UART1 0x4003_8000 72 байт 7 UART2 Регистры контроллера интерфейса UART2 0x4004_0000 36 байт 8 SPI1 Регистры контроллера интерфейса SSP1 0x4005_0000 28 байт 10 I2C1 Регистры контроллера интерфейса I2C1 0x4005_8000 4 байт 11 POWER Регистры детектора напряжения питания 0x4006_0000 12 байт 12 WWDT Регистры контроллера сторожевого таймера WWDT 0x4006_8000 16 байт 13 IWDT Регистры контроллера сторожевого таймера IWDT 0x4007_0000 128 байт 14 TIMER1 Регистры управления
9 После включения питания и снятия внутренних и внешних сигналов сброса микроконтроллер начинает выполнять программу из загрузочной Таймер 1 0x4007_8000 128 байт 15 TIMER2 Регистры управления Таймер 2 0x4008_0000 128 байт 16 TIMER3 Регистры управления Таймер 3 0x4008_8000 48 байт 17 ADC Регистры управления АЦП 0x4009_0000 12 байт 18 DAC Регистры управления ЦАП 0x4009_8000 12 байт 19 COMP Регистры управления Компаратора 0x400A_0000 36 байт 20 SPI2 Регистры контроллера интерфейса SSP1 0x400A_8000 32 байт 21 PORTA Регистры управления порта А 0x400B_0000 32 байт 22 PORTB Регистры управления порта B 0x400B_8000 32 байт 23 PORTC Регистры управления порта C 0x400C_0000 32 байт 24 PORTD Регистры управления порта D 0x400C_8000 32 байт 25 PORTE Регистры управления порта E 0x400D_8000 84 байт 27 BKP Регистры доступа и управления батарейным доменом 0x400E_8000 32 байт 29 PORTF Регистры управления порта F 0x400F_0000 88 байт 30 EXT_BUS_CNTRL Область доступа к внешней системной шине 0x4200_0000 16 Мбайт PERIPHERAL Bit Band Region Область битового доступа к регистрам периферии 0x5000_0000 256 Мбайт EXTERNAL BUS Область доступа к внешней системной шине Внешняя системная шина 0x6000_0000 1 Гбайт EXTERNAL BUS Область доступа к внешней системной шине 0xA000_0000 1 Гбайт EXTERNAL BUS Область доступа к внешней системной шине SYSTEM REGION 0xE000_0000 256 Мбайт Системные регистры процессора ARM Cortex-M3
10 области ПЗУ BOOT ROM. В загрузочной программе микроконтроллер определяет, в каком из режимов он будет функционировать, и переходит в этот режим. 1.1 Описание основных регистров микроконтроллера 1.1.1 Порты ввода/вывод Микроконтроллер имеет 6 портов ввода/вывода. Порты 16-разрядные, и их выводы мультиплексируются между различными функциональными блоками, управление для каждого вывода отдельное. Для того, чтобы выводы порта перешли под управление того или иного периферийного блока, необходимо задать для нужных выводов выполняемую функцию и настройки. Для работы с портами ввода/вывода используются библиотека MDR32F9Qx_port.h, которая описывает следующие регистры: – MDR_PORTA – MDR_PORTB – MDR_PORTC – MDR_PORTD – MDR_PORTE – MDR_PORTF Для инициализации используется структура типа PORT_InitTypeDef с полями: – PORT_OE – направление передачи данных – PORT_FUNC – режим работы вывода порта – PORT_MODE – режим работы контроллера – PORT_SPEED – скорость фронта вывода – PORT_Pin – выбор выводов для инициализации Функциональное назначение портов приведено в таблице 120 и 121 стр.184 спецификации микроконтроллеров серии 1986ВЕ9х. 1.1.2 Контроллер АЦП. В микроконтроллере реализовано два 12-разрядных АЦП. С помощью АЦП можно оцифровать сигнал от 16 внешних аналоговых выводов порта D и от двух внутренних каналов, на которые выводятся датчик температуры и источник опорного напряжения. Скорость выборки составляет до 512 тысяч преобразований в секунду для каждого АЦП. В качестве опорного напряжения преобразования могут выступать: – питание АЦП с выводов AUCC и AGND – внешние сигналы с выводов ADC0_REF+ и ADC_REF- Контроллер АЦП позволяет: – оцифровать один из 16 внешних каналов; 11 – оцифровать значение встроенного датчика температуры; – оцифровать значение встроенного источника опорного напряжения; – осуществить автоматический опрос заданных каналов; – выработать прерывание при выходе оцифрованного значения за заданные пределы; – запускать два АЦП синхронно для увеличения скорости выборки. Для осуществления преобразования требуется не менее 28 тактов синхронизации CLK. В качестве синхросигнала может выступать частота процессора CPU_CLK, либо частота ADC_CLK, формируемая в блоке «Сигналы тактовой частоты». Для работы с портами ввода/вывода используются библиотека MDR32F9Qx_adc.h , которая описывает регистры АЦП с помощью задания структур ADC_InitTypeDef для настройки преобразователя и ADCx_InitTypeDef для настройки канала преобразователя. Структура ADC_InitTypeDef имеет следующие поля: – ADC_SynchronousMode – выбор режима работы двух преобразователей; – ADC_StartDelay – определяет задержку начала преобразований от старта системы [0:15]; – ADC_TempSensor – включение/выключение температурного датчика; – ADC_TempSensorAmplifier – включение/выключение усилителя температурного датчика; – ADC_TempSensorConversion – включение/выключение преобразования показаний от температурного датчика; – ADC_IntVRefConversion – включение/выключение преобразования показаний опорного напряжения; – ADC_IntVRefTrimming – определяет интервал считывания значений опорного напряжения; Структура ADCx_InitTypeDef имеет следующие поля: – ADC_ClockSource – указывает источник тактирующего сигнала; – ADC_SamplingMode – задает режим считывания показаний; – ADC_ChannelSwitching – включение/выключение возможности переключения каналов АЦП; – ADC_ChannelNumber – номер канала; – ADC_Channels – маска номеров каналов; – ADC_LevelControl – включение/выключение слежения за уровнем АЦП; – ADC_LowLevel – значение нижнего уровня АЦП; – ADC_HighLevel – значение верхнего уровня АЦП; – ADC_VRefSource – определяет источник питания АЦП; 12 – ADC_IntVRefSource – определяет тип напряжения источника питания АЦП; – ADC_Prescaler – задает параметры предусилителя; – ADC_DelayGo – задержка начала преобразований в последовательном режиме; Подробное описание регистров блока контроллера АЦП приведено в таблице 292 стр.318 спецификации микроконтроллеров серии 1986ВЕ9х. 1.1.3 Контроллер ЦАП. В микроконтроллере реализовано два ЦАП. Для включения ЦАП необходимо чтобы бит Cfg_ON_DACx был установлен в 1, используемые выводы ЦАП порта Е были сконфигурированы как аналоговые и были отключены какие-либо внутренние подтяжки. Оба ЦАП могут работать независимо или совместно. При независимой работе ЦАП (бит Cfg_SYNC_A=0 ) после записи данных в регистр данных DACx_DATA на выходе DACx_OUT формируется уровень напряжения, соответствующий записанному значению. При синхронной работе (бит Cfg_SYNC_A=1) данные обоих ЦАП могут быть обновлены одной записью в один из регистров DACx_DATA. ЦАП может работать от внутренней опоры Cfg_M_REFx=0 , тогда ЦАП формирует выходной сигнал в диапазоне от 0 до напряжения питания AUCC. В режиме работы с внешней опорой Cfg_M_REFx=1 ЦАП формирует выходное напряжение в диапазоне от 0 до значения DACx_REF. Для работы с аналоговыми портами ввода/вывода используется библиотека MDR32F9Qx_dac.h Для работы ЦАП достаточно сконфигурировать соответствующий вывод на работу в аналоговом режиме и использовать функцию DAC1_Init или DAC2_Init для указания источника опорного напряжения. Описание регистров блока контроллера АЦП приведено в таблице 307 стр.326 спецификации микроконтроллеров серии 1986ВЕ9х.
перейти в каталог файлов
|