URC220 (Раздаточный материал по URC220), страница 3
Описание файла
Файл "URC220" внутри архива находится в следующих папках: Раздаточный материал по URC220, Documents, URC220 Documentation. Документ из архива "Раздаточный материал по URC220", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "программное обеспечение управляющих комплексов (поук)" в общих файлах.
Онлайн просмотр документа "URC220"
Текст 3 страницы из документа "URC220"
2.7.3 JTAG
Интерфейс предназначен для программирования микропроцессора.
2.8 Разъёмы питания
Рис 2.8.1. Разъёмы питания. |
3. Программирование микроконтроллера
Рис.3.1 Внешний вид устройства MT-Link |
Далее рассмотрим пример написания простейшей программы для мигания светодиодом на плате. Для этого понадобится среда разработки IAR Embedded Workbench, а также некоторые файлы, необходимые для компилирования исходного кода.
Ниже приведён список необходимых файлов и их краткое описание:
Имя файла | Описание |
at91SAM7S64_FLASH.icf | Содержит адреса расположения и размеры участков памяти контроллера, необходимые для правильной компиляции исходного кода |
at91SAM7S64_RAM.icf | Аналогичен предыдущему файлу, но используется для отладки программы из оперативной памяти контроллера, без записи её в постоянную память. |
SAM7.mac | Макрос для отладки программы |
SAM7_RAM.mac | Аналогичен предыдущему файлу, но используется для отладки программы из оперативной памяти контроллера, без записи её в постоянную память. |
AT91SAM7S64.h AT91SAM7S64_inc.h AT91SAM7S64.inc | Содержат набор констант, определяющих все параметры процессора и его периферии |
lib_AT91SAM7S64.h | Содержит набор макросов для упрощённой работы с контроллерами периферийных устройств |
Common.h | Подключает файлы AT91SAM7S64.h и lib_AT91SAM7S64.h, определяет некоторые константы (в т.ч. биты - BIT0..BIT31), типы данных1 и др. |
Cstartup.s | Исходный код на ассемблере, производящий начальную низкоуровневую инициализацию процессора: установка векторов прерываний, инициализация стека, копирование областей постоянной памяти в оперативную и т.д. |
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”.
После нажатия на кнопку “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.
Сначала необходимо выбрать процессор, под который пишется программа. Для этого во вкладке “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”->”Add Files…”, и в появившемся диалоге выбираем файлы “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;
}
8. Теперь у нас готов проект с минимальным числом файлов и количеством исходного кода, который можно скомпилировать и который будет корректно выполняться на процессоре.
Чтобы скомпилировать программу нужно выбрать меню “Project”->”Make” (или просто нажать F7). Результат приведен на рисунке 3.5.
Рис.3.5 Минимальный проект
3.2 Простейшая программа
Для того, чтобы программа выполняла необходимые действия – мигание светодиодом через равные промежутки времени – необходимо инициализировать контроллер портов ввода-вывода, а также таймер.
Для начала напишем функции для работы с портами ввода-вывода. Сначала нужно включить контроллер портов ввода-вывода (PIO), подав на него рабочую частоту. Сделать это можно записав 1 в соответствующий бит регистра PCER (Peripheral Clock Enable Register) контроллера PWM (Power Management Controller):
AT91C_BASE_PMC->PMC_PCER = AT91C_ID_PIOA;
Здесь AT91C_BASE_PMC – указатель на массив регистров PMC контроллера, а AT91C_ID_PIOA – константа с необходимым битом (все константы объявлены в файле “AT91SAM7S64.h”). В подключённом файле “lib_AT91SAM7S64.h” уже есть готовый макрос для этого, поэтому можно просто написать:
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);
Далее настраиваем ножку, соответствующую светодиоду, на вывод:
AT91C_BASE_PIOA->PIO_PER = OutputPins; // Set in PIO mode
AT91C_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_секунда);
}
}
Функция “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)
//-------------------------------------------------------