А.П.Евдокимов, Л.Л.Владимиров Программирование микроконтроллера К1986ВЕ92QI компании Миландр (1186478), страница 3
Текст из файла (страница 3)
Установки программаторапри записи программы во флэш-память программДля написания программы на языке Си создадим файл main.c,для чего на вкладке Project в списке Source Group 1 с помощью правой кнопки мыши выберем меню Add New Item to Group ’SourceGroup1’… (рисунок 2.13). В появившемся окне (рисунок 2.14) выберем C File (.c), запишем имя main и нажмем кнопку Add (добавить).22Рисунок 2.13 – Создание файла для написания программы на языке СиРисунок 2.14 – Присвоение имени файлуВ созданном файле и будем писать программу. Но для началаскопируем ее текст из настоящего лабораторного практикума и вставим в окно редактирования программ.23#include <MDR32F9Qx_port.h>#include <MDR32F9Qx_rst_clk.h>#define DELAY(T) for (i = T; i > 0; i--)int i;int main(){RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);PORT_InitTypeDef Nastroyka;Nastroyka.PORT_Pin= PORT_Pin_0;Nastroyka.PORT_OE= PORT_OE_OUT;Nastroyka.PORT_FUNC = PORT_FUNC_PORT;Nastroyka.PORT_MODE = PORT_MODE_DIGITAL;Nastroyka.PORT_SPEED = PORT_SPEED_SLOW;PORT_Init (MDR_PORTC, &Nastroyka);while (1){PORT_SetBits(MDR_PORTC, PORT_Pin_0);DELAY(100000);PORT_ResetBits(MDR_PORTC, PORT_Pin_0);DELAY(100000);}}Обратите внимание, что после последней фигурной скобки следует поставить одну пустую строку.Теперь нажмем кнопку Rebuild (перестроить) на панели инструментов (рисунок 2.15).Рисунок 2.15 – Присвоение имени файлуПри этом в окне Build Output, расположенном в нижней частиэкрана, появится текст:*** Using Compiler 'V5.06 update 5 (build 528)',folder: 'C:\Keil_v5\ARM\ARMCC\Bin'Rebuild target 'Target 1'assembling startup_MDR32F9Qx.scompiling system_MDR32F9Qx.ccompiling main.ccompiling MDR32F9Qx_port.ccompiling MDR32F9Qx_rst_clk.c24linking...Program Size: Code=1252 RO-data=224 RW-data=8 ZI-data=1632FromELF: creating hex file...".\Objects\BEGINNING.axf" - 0 Error(s), 0 Warning(s).Build Time Elapsed: 00:00:02Главное, что мы должны увидеть в этом тексте: 0 Error(s), 0Warning(s), то есть: ошибок нет, предостережений нет.Далее нажимаем кнопку LOAD (загрузить во флэш-память программ), – см.
рисунок 2.15.Здесь отчет в окне Build Output будет подлиннее. Пока для насглавное:Full Chip Erase Done.Programming Done.Verify OK.Application runningТо есть всё, что необходимо, исполнено; приложение работает.И в самом деле, светодиод VD3, расположенный на плате, сталмигать.Мы уже говорили о том, что микроконтроллер может работать иавтономно, без участия компьютера. Чтобы убедиться в этом, необходимо сначала отключить питание от отладочной платы, затем отсоединить разъем шлейфа JTAG-B от отладочной платы, а затем вновьподключить к плате источник питания. Но пока делать этого не будем.Сделаем первый шаг в программировании: заменим строки впрограмме DELAY(100000) на DELAY(10000), после чего вновь последовательно нажмем кнопки Rebuild и LOAD. Частота миганий светодиода изменилась. Вот так! Не сложно?КОНТРОЛЬНЫЕ ВОПРОСЫ1.
Каково назначение интегрированной среды разработки KeilμVision?2. Как создать проект в среде разработки Keil μVision?3. Как изменить частоту миганий светодиодов в приведенномпримере программы?25ЛАБОРАТОРНАЯ РАБОТА 3.УПРАВЛЕНИЕ ПОРТАМИ МИКРОКОНТРОЛЛЕРАЦЕЛЬ РАБОТЫУметь настраивать порты микроконтроллера.
Овладеть навыками записи программ в микроконтроллер.ТЕОРЕТИЧЕСКАЯ ЧАСТЬПорт микроконтроллера представляет собой параллельный регистр, через который микроконтроллер обменивается информацией свнешними устройствами. У микроконтроллера К1986ВЕ92QI имеется6 портов ввода/вывода: A, B, C, D, E, F. Порты имеют соответствующиеимена:MDR_PORTA,MDR_PORTB,MDR_PORTC,MDR_PORTD, MDR_PORTE, MDR_PORTF.Каждый порт является 16-разрядным, а его выводы (линии) могут использоваться различными функциональными блоками. Для тогочтобы выводы порта перешли под управление того или иного периферийного блока, необходимо задать для нужных выводов выполняемуюфункцию и настройки.
Поскольку микроконтроллер К1986ВЕ92QIразмещен в корпусе, имеющем 64 вывода, то не все разряды портовсвязаны с этими выводами (таблица 3.1). Всего задействовано 43 линии для подключения внешних устройств: порт А имеет 8 линий, портB – 11, порт С – 3, порт D – 8, порт E – 6, порт F – 7.Для настройки портов микроконтроллеров используют регистрыспециального назначения, и в зависимости от информации, помещаемой в них, порт будет работать в том или ином режиме.
Такой подходпредполагает скрупулезное изучение устройства микроконтроллера,что по мере роста сложности последних становится проблематичным.Разработчик предлагает более простой путь: работать не с регистрамимикроконтроллера, а с заранее подготовленными функциями, которыеим сведены в библиотеку.Для настройки порта воспользуемся библиотекой MDR32F9Qx.hи пошагово настроим порт.Порт не может работать без подключения к тактовому генератору, и это надо сделать в самом начале настройки порта. Подключениеосуществляется посредством специальной функции из другого библиотечного модуля – MDR32F9Qx_rst_clk.c:RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);26Отнеситесь к этой записи как к шаблону, в котором вы можетеменять только две вещи: выбрать порт (например, PORTC или PORTA) иразрешить тактирование порта (ENABLE). Если потребуется запретитьтактирование, вместо слова ENABLE в функции следует записатьDISABLE.Таблица 3.1 – Линии порта, связанные с выводами микросхемы40MDR_PORTDPC2ПортMDR_PORTEPA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7PB8PB9PB10PC0PC1Номер вывода микросхемы636261605958575643444546475051525352544241ЛинияпортаMDR_PORTFMDR_PORTCMDR_PORTBMDR_PORTAПортPD0PD1PD2PD3PD4PD5PD6PD7PE0PE1PE2PE3––PE6PE7PF0PF1PF2PF3PF4PF5Номервыводамикросхемы313233343035362926252221––1615234567PF68ЛинияпортаЕсли требуется подключить несколько портов, то используетсялогическая функция ИЛИ:RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTC |RST_CLK_PCLK_PORTD | RST_CLK_PCLK_PORTF,ENABLE);Знак « | » обозначает логическую функцию ИЛИ, он находитсяна верхнем регистре той же клавиши, что и слеш « / », но при английской раскладке клавиатуры.27Для инициализации порта потребуется структура следующеготипа: PORT_InitTypeDef.
После указания типа структуры необходимопридумать и указать имя, например, Nastroyka или, скажем, PortInit.Тогда описание структуры с именем будет выглядеть так:PORT_InitTypeDef Nastroyka;Теперь необходимо описать поля, входящие в структуру. Это ибудет настройкой порта.Сначала выберем линию порта, которую нужно настроить. Допустим, это линия 0. Тогда нужно сделать следующую запись:Nastroyka.PORT_Pin = PORT_Pin_0;То есть сначала имя структуры, затем – точка, следом – имянастраиваемого поля, знак равенства, значение поля.Если требуется настроить сразу несколько линий порта, скажем,первую, третью и пятую, то запись будет такой:Nastroyka.PORT_Pin = PORT_Pin_1 | PORT_Pin_3 | PORT_Pin_5;Если требуется настройка всех (по-английски – all) линий порта,то запись потребуется такая:Nastroyka.PORT_Pin = PORT_Pin_All;Мы уже знаем, что линиями порта могут воспользоваться различные периферийные блоки, и об этом тоже нужно сообщить микроконтроллеру. Пока мы хотим использовать порт как порт, т.е.
как параллельный регистр для хранения и выдачи информации. Описывается это так:Nastroyka.PORT_FUNC = PORT_FUNC_PORT;Информация, с которой имеет дело порт, может быть аналоговой (ANALOG) или цифровой (DIGITAL). Пусть – цифровой, тогда:Nastroyka.PORT_MODE = PORT_MODE_DIGITAL;У порта может быть два режима: передача информации (OUT) иее прием (IN):Nastroyka.PORT_OE = PORT_OE_OUT;28Значит, если к порту микроконтроллера нужно подключить индикаторный светодиод, то – OUT, а если кнопку для подачи логическихнулей и единиц в микроконтроллер, то – IN.Переход из логического нуля в логическую единицу и обратно влинии порта происходит не мгновенно.
Длительность фронта и срезаустановим самой большой, т.е. скорость переключения будет самойнизкой, медленной (SLOW):Nastroyka.PORT_SPEED = PORT_SPEED_SLOW;И, наконец, определимся с портом, к которому имеют отношение все указанные настройки, созданные нами с помощью структурыNastroyka. Пусть это будет порт С, который называется MDR_PORTC:PORT_Init(MDR_PORTC, &Nastroyka);Всё, настройка завершена.Теперь научимся работать с разрядами (битами) порта. Чтобызаписать логическую единицу в определенном разряде порта (установить бит) необходимо указать порт и линию порта (вывод, «пин»).Пусть это будет порт C, линия 0:PORT_SetBits(MDR_PORTC, PORT_Pin_0);Если требуется записать там же логический ноль (сбросить бит):PORT_ResetBits(MDR_PORTC, PORT_Pin_0);Чтобы прочитать информацию, по линии 0 порта C, используется следующая функция:PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0);Мы можем и сами создавать подобные программные элементы,используя директивы.Например, #define – это директива, которая определяет идентификатор и последовательность символов, которой будет замещатьсяданный идентификатор при его обнаружении в тексте программы.
Тоесть идентификатор – это макрос, который заменяет последовательность, часто очень большую, символов.Структура данной директивы имеет следующий вид:#define ИДЕНТИФИКАТОР последовательность_символов29Например,#define NOMER 25Таким образом, если компилятор обнаружит в тексте программыслово NOMER, он заменит его на 25. Количество символов для заменыне ограничено.Подобным образом можно определять функции, значения аргументов которых будут определяться в ходе выполнения программы.Например,#define DELAY(T) for (i = T; i > 0; i--)Теперь, если в программе встретится выражение DELAY(55), будут выполняться следующие действия.
Переменной i будет присвоенозначение 55, затем оно будет уменьшено на единицу, потом – вновь наединицу, и так до тех пор, пока i будет оставаться положительным.Как только i станет равным нулю, осуществится переход к следующей строке программы. На выполнение описанных действий будет затрачено время, поэтому описанный прием иногда применяют, чтобысоздать временную задержку. К сожалению, при этом тратится нетолько время: мы занимаем процессор рутинной процедурой, и он ужене может заниматься ничем другим, что, конечно же, неэффективно. Вдальнейшем мы найдем иные способы задавать интервалы времени, авремя – важнейший фактор в управлении технологическими процессами.Итак, вернемся к программе, которую в лабораторной работе№2 мы бездумно залили в микроконтроллер и наблюдали миганиесветодиода.
Ниже еще раз приведен текст программы, но теперь уже скраткими комментариями, смысл которых мы только что прояснили.// Мигание светодиода// Подключение заголовочных файлов необходимых библиотек#include <MDR32F9Qx_port.h>#include <MDR32F9Qx_rst_clk.h>// Определение функции задержки#define DELAY(T) for (i = T; i > 0; i--)// Глобальная переменная i счетчика для макроса DELAY()int i;// Объявление главной функции,// с которой начинается работа программыint main(){30// Включение тактирования порта CRST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);// Указание типа структуры и имени структурыPORT_InitTypeDef Nastroyka;// Объявление номера линии порта, которая// настраивается данной структуройNastroyka.PORT_Pin = PORT_Pin_0;// Конфигурация линии порта как выходаNastroyka.PORT_OE = PORT_OE_OUT;// Работа в режиме порта ввода-выводаNastroyka.PORT_FUNC = PORT_FUNC_PORT;// Цифровой режимNastroyka.PORT_MODE = PORT_MODE_DIGITAL;// Низкая скорость переключения (пологий фронт)Nastroyka.PORT_SPEED = PORT_SPEED_SLOW;// Инициализация порта C объявленной структуройPORT_Init(MDR_PORTC, & Nastroyka);// Главный циклwhile(1){// Установка единицы на линии PC0PORT_SetBits (MDR_PORTC, PORT_Pin_0);DELAY(100000); // Задержка// Установка нуля на PC0PORT_ResetBits (MDR_PORTC, PORT_Pin_0);DELAY(100000); // Задержка}}ПРАКТИЧЕСКАЯ ЧАСТЬ1.