URC220_Board_Win (Раздаточные материалы), страница 3
Описание файла
Файл "URC220_Board_Win" внутри архива находится в следующих папках: Раздаточные материалы, Документация. PDF-файл из архива "Раздаточные материалы", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "поук" в общих файлах.
Просмотр PDF-файла онлайн
Текст 3 страницы из PDF
биты BIT0..BIT31), типы данных1 и др.Cstartup.sИсходный код на ассемблере, производящий начальнуюнизкоуровневую инициализацию процессора: установка16векторов прерываний, инициализация стека, копированиеобластей постоянной памяти в оперативную и т.д.Cstartup_SAM7.cИсходный код на C, также как предыдущий файл,инициализируетпроцессор:включаетвнешнийкварцевый резонатор, устанавливает частоту ядрапроцессора и т.д.1Так как на процессорах разной разрядности тип данных “int” может иметь разныйразмер (например на 32-хразрядных процессорах – 4 байта, на 16-тиразрядных – 2байта), то для создания конвертируемого исходного кода используют типыданных, в названии которых явно указан размер переменной этого типа.Например, “int32” – это тип “int” на 32-хразрядной машине, а “uint16” – это тип“unsigned short int”.3.1 Создание нового проекта1.
Для начала нужно открыть IAR Embedded Workbench. На момент написанияданного документа последняя версия данной среды разработки – 5.10. Послеоткрытия будет создано новое рабочее пространство (Workspace). Также этоможно сделать самому: “File”->”New Workspace”.Рис.3.2 Пустое рабочее пространство2. Далее выбираем меню “Project”->”Create New Project”. В появившемся окненужно выбрать ядро, под которое пишется программа - “ARM”, а также шаблоннастроек проекта – “C++, main”.17После нажатия на кнопку “OK” нужно будет сохранить файл проекта (*.ewp).Сохраним его как “C:\Test\Test.ewp”.
После этого выбираем меню “File”->”Save All”и в появившемся диалоге выбираем имя файла для рабочего пространства(*.eww). Например “C:\Test\Test.eww”.Теперь у нас есть пустой Workspace, в составе которого находится проект с однимфайлом исходного кода – “main.cpp” (см. рис. 3.3).Рис.3.3 Пустой проект3. Далее копируем в папку с проектом (т.е. в “C:\Test\”) каталог “Resources”.4. Теперь нужно произвести настройку проекта.В окне инструментов “Workspace” (левая колонка) отображается список проектов ифайлов, содержащихся в них. Также сверху расположен раскрывающийся список,содержащий элементы “Release” и “Debug”.
Этот список используется дляпереключения между настройками проекта. Один и тот же проект можнонастраивать по-разному: одни настройки для тестовой версии программы, котораянаходится в процессе отладки, и другие настройки для окончательного релиза.Для этих двух режимов настроек уже добавлены две строки: “Debug” и “Release”соответственно.Выберем режим “Debug”. Далее в левом списке выбираем название проекта “Test Debug” и заходим в меню “Project”->”Options” (или просто нажимаем Alt+F7).Должно появиться диалоговое окно как на рис.
5.4.18Сначала необходимо выбрать процессор, под который пишется программа. Дляэтого во вкладке “Target” в рамке “Processor variant” выбираем пункт “Device”, адалее “Atmel”->”Atmel AT91SAM7S64”.Рис.3.4 Окно настроек проекта4. Выбираем в левой колонке “Category” поле “Linker”, далее во вкладке “Config” врамке “Linker configuration file” устанавливаем параметр “Override default” и втекстовое поле записываем строку “$PROJ_DIR$\Resource\at91SAM7S64_FLASH.icf”($PROJ_DIR$ обозначает, что поиск дальнейшего пути нужно производить вкаталоге с проектом, т.е.
в данном случае $PROJ_DIR$=”c:\Test”).Посмотреть и отредактировать содержимое этого “*.icf” файла можно нажав накнопку “Edit…”.5. Теперь нужно добавить к проекту файлы с исходным кодом для инициализациипроцессора и некоторой периферии. Для этого выбираем меню “Project”->”AddFiles…”, и в появившемся диалоге выбираем файлы “Resource\Cstartup_SAM7.c” и“Resource\Cstartup.s”6. После того, как файлы были добавлены, в левом меню (“Workspace”) выбираемфайл “Cstartup_SAM7.c” и заходим в меню “Project”->”Options” (или простонажимаем Alt+F7).
В появившемся окне выбираем категорию “C/C++ Compiler”.Устанавливаем параметр “Override inherited settings” и в рамке “Language”выбираем язык “C”.7. Изменяем файл “Main.cpp” следующим образом:#include "Resource\Common.h"int main(){return 0;19}8. Теперь у нас готов проект с минимальным числом файлов и количествомисходного кода, который можно скомпилировать и который будет корректновыполняться на процессоре.Чтобы скомпилировать программу нужно выбрать меню “Project”->”Make” (илипросто нажать F7). Результат приведен на рисунке 3.5.Рис.3.5 Минимальный проект3.2 Простейшая программаДля того, чтобы программа выполняла необходимые действия – миганиесветодиодом через равные промежутки времени – необходимо инициализироватьконтроллер портов ввода-вывода, а также таймер.Для начала напишем функции для работы с портами ввода-вывода.
Сначаланужно включить контроллер портов ввода-вывода (PIO), подав на него рабочуючастоту. Сделать это можно записав 1 в соответствующий бит регистра PCER(Peripheral Clock Enable Register) контроллера PMC (Power Management Controller):AT91C_BASE_PMC->PMC_PCER = AT91C_ID_PIOA;Здесь AT91C_BASE_PMC – указатель на массив регистров PMC контроллера, аAT91C_ID_PIOA – константа с необходимым битом (все константы объявлены в20файле “AT91SAM7S64.h”). В подключённом файле “lib_AT91SAM7S64.h” уже естьготовый макрос для этого, поэтому можно просто написать:AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);Далее настраиваем ножку, соответствующую светодиоду, на вывод:AT91C_BASE_PIOA->PIO_PER = OutputPins; // Set in PIO modeAT91C_BASE_PIOA->PIO_OER = OutputPins; // Configure in OutputЗдесь AT91C_BASE_PIOA – указатель на массив регистров PIO контроллера,OutputPins – сочетание (через логическое ИЛИ) бит, соответствующих выводампроцессора, которые должны быть установлены в режим вывода, PER и OER –регистры PIO контроллера.
Также можно воспользоваться готовым макросом:AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OutputPins);Аналогично и для настройки ножек на ввод. Таким образом, можно реализоватьфункцию для настройки портов ввода-вывода:// Инициализирует PIO// InputPins - сочетание (через ИЛИ) бит, соответствующих выводам//процессора, которые должны быть установления в режим ввода// OutputPins - сочетание (через ИЛИ) бит, соответствующих выводам//процессора, которые должны быть установления в режим вывода// Ножки процессора, не указанные в InputPins и OutputPins не меняют// своего состояния (т.е.
вызов PIO_Config(0, 0) не даст никакого эффекта)void PIO_Config(uint32 InputPins, uint32 OutputPins){// Инициализируем контроллер портов ввода-выводаAT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);// Инициализируем контакты для выводаif(OutputPins)AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OutputPins);// Инициализируем контакты для вводаif(InputPins)AT91F_PIO_CfgInput(AT91C_BASE_PIOA, InputPins);}Аналогичным образом, записывая и считывая значения из определённыхрегистров, которые расположены по фиксированным адресам памяти, можнонастраивать и работать со всем периферийными устройствами микроконтроллера.Общий алгоритм программы выглядит следующим образом:Начало_программы(){Инициализировать_таймер();Установить_ножку_на_вывод();Значение == 1;Повторять{Установить_уровень_на_ножке(Значение);Если (Значение == 1) Значение = 0;Иначе Значение = 1;Пауза(1_секунда);}}21Функция “PIO_Config” уже реализована, остальные функции пишутся аналогично.Ниже приведён прокомментированный исходный текст программы.//------------------------------------------------------#include "Resource\Common.h"//------------------------------------------------------// Тиков таймера в 1 с:// Т.к.
процессор работает на частоте 48 MHz, то// частота таймера - 48/16=3 MHz. Тогда за одну// секунду таймер делает тиков#define PIT_TICKS_PER_SEC((48000000 + 8) / 16)// Аналогично для 1 мс#define PIT_TICKS_PER_mSEC((48000000 + 8000) / 16000)//------------------------------------------------------// Прототипы функцийvoid PIO_Config(uint32 InputPins, uint32 OutputPins);void PIO_Set(uint32 Bit, uint32 Value);uint32 PIO_Get(uint32 Bit);void PIT_Init();uint32 PIT_GetCount();void PIT_Sleep(uint32 mSecs);//------------------------------------------------------// Инициализирует PIO// InputPins - сочетание (через ИЛИ) бит, соответствующих выводам//процессора, которые должны быть установления в режим ввода// OutputPins - сочетание (через ИЛИ) бит, соответствующих выводам//процессора, которые должны быть установления в режим вывода// Ножки процессора, не указанные в InputPins и OutputPins не меняют// своего состояния (т.е.
вызов PIO_Config(0, 0) не даст никакого эффекта)void PIO_Config(uint32 InputPins, uint32 OutputPins){// Инициализируем контроллер портов ввода-выводаAT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);// Инициализируем контакты для выводаif(OutputPins)AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OutputPins);// Инициализируем контакты для вводаif(InputPins)AT91F_PIO_CfgInput(AT91C_BASE_PIOA, InputPins);}//------------------------------------------------------// Устанавливает уровень на выводе процессора// Bit - сочетание (через ИЛИ) бит, соответствующих выводам//процессора, значения на которых должны быть изменены// Value - новое значение: 0 - низкий уровень, !0 - высокийvoid PIO_Set(uint32 Bit, uint32 Value){// Если нужно установить лог. 1, то пишем// соответствубщий бит в регистр SODR контроллера// портов ввода-выводаif((Value)) AT91C_BASE_PIOA->PIO_SODR = Bit;// Аналогично для установки лог.
0 (пишем в Clear-регистр)22else AT91C_BASE_PIOA->PIO_CODR = Bit;}//------------------------------------------------------// Определяет уровень на выводе процессора// Bit - сочетание (через ИЛИ) бит, соответствующих выводам//процессора, значения на которых должны быть определены//0 - низкий уровень, !0 - высокийuint32 PIO_Get(uint32 Bit){return (AT91C_BASE_PIOA->PIO_PDSR & (Bit));}//------------------------------------------------------// Функция инициализирует таймер для работы// на макс. частоте - MCK / 16// (если ядро процессора работает на 48 MHz, то// таймер работает на частоте 3 MHz)void PIT_Init(){// Включаем таймерAT91F_PITC_CfgPMC();// Устанаволиваем таймер: сначала целиком заполняется// 20-ти битная часть (0xFFFFF - предел заполнения),// затем она обнуляется и инкрементируется старшая// 12-ти битная часть.AT91PS_PITC pPITC = AT91C_BASE_PITC;pPITC->PITC_PIMR = 0xFFFFF | AT91C_PITC_PITEN;// Выключаем прерывание для таймераAT91F_PITDisableInt(AT91C_BASE_PITC);}//------------------------------------------------------// Текущий счётчик таймераuint32 PIT_GetCount(){// Находится в регистре PIIR контроллера таймераreturn AT91C_BASE_PITC->PITC_PIIR;}//------------------------------------------------------// Пауза, mSecs - время в мсvoid PIT_Sleep(uint32 mSecs){// Домножаем число милисекунд на количество// тиков таймера в 1 мс, чтобы получить величину// задержки не в мс, а в тиках таймераmSecs *= PIT_TICKS_PER_mSEC;// Запоминаем время начала ожиданияuint32 StartTime = PIT_GetCount();// Ждём, пока не пройдёт нужно число тиковwhile(PIT_GetCount() - StartTime < mSecs) ;}//------------------------------------------------------int32 main(){// Текущее состояние светодиода - горит (1)23int32 Value = 1;// Инициализируем таймерPIT_Init();// Устанавливаем ножку PA17 на выводPIO_Config(0, BIT17);// Начинаем бесконечный циклwhile(1){// Устанавливаем уровень на ножке PA17PIO_Set(BIT17, Value);// Если установили лог.
1, то текущий уровень// будет лог. 0if(Value == 1) Value = 0;// И наоборотelse Value = 1;// Ждём 1 секундуPIT_Sleep(1000);}}//-------------------------------------------------------3.3 Отладка программыДля того чтобы загрузить программу в контроллер и запустить отладчик,необходимо настроить параметры отладки.1. Для этого в настройках проекта в списке слева нужно выбрать “Debugger”, асправа выбрать вкладку “Setup”. Параметр “Driver” установить на “J-Link/J-Trace”.2.