Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Ход работы. Задание: организовать переключение светодиодов по алгоритму заданному преподавателемЗадание: организовать переключение светодиодов по алгоритму заданному преподавателем. Особенности проекта: – инкремент переменной «counter» каждые 100 ms; – использование программной задержки для получения интервала в 100 ms; – отображение 4–х битов переменной на LED LD1(GPIO9), LD2(GPIO11), LD3(GPIO34) и LD4(GPIO49) периферийной платы. Файлы проекта: – C – исходный файл “Lab5_1.c”; – стартовый ассемблерный файл: “DSP2833x_CodeStartBranch.asm”; – файл определения регистров “DSP2833x_GlobalVariableDefs.c”; – командные файлы редактора связей “28335_RAM_lnk.cmd” и “DSP2833x_Headers_nonBIOS.cmd”; – библиотека реального времени “rts2800_fpu32.lib”. Файл «DSP2833x_GlobalVariableDefs.c». Определение глобальных переменных для всей памяти отображающей периферийные регистры, базирующееся на внутренней структуре. Основной файл заголовка “DSP2833x_Device.h”. Энергозависимая структура GPIO_DATA_REGS GpioDataRegs. Эта структурная переменная объединяет все регистры, которые принадлежат этой периферийной группе, напримерGpioDataRegs.GPADAT. Каждый регистр объявлен как union чтобы допустить 32–битный – («all») и побитный доступ («bit»), например:
GpioDataRegs.GPADAT.bit.GPIO9 = 1; GpioDataRegs.GPADAT.all = 0x0000FFFF
Шаги, которые должны быть сделаны: – добавить “DSP2833x_GlobalVariableDefs.c” в проект; – включить “DSP2833x_Device.h” в Вашу C–программу. Регистры лабораторной работы LAB 5_1: – регистры ЦП: 1) управление сторожевым таймером – WDCR; 2) PLL тактовый регистр – PLLCR; 3) делитель для высокой тактовой частоты – HISPCP; 4) делитель для низкой тактовой частоты – LOSPCP; 5) регистр управления тактами периферии – PCLKCRx; 6) системный регистр управления и статуса – SCSR; – доступ к LED‘s (GPIO9, GPIO11,GPIO34,GPIO49): 1) GPA и GPB Multiplex регистры: а) GPAMUX1, GPAMUX2, GPBMUX1, GPBMUX2; б) GPA и GPB управляющие регистры GPADIR и GPBDIR; 2) GPA и GPB Регистры данных: а) GPASET, GPACLEAR, GPBSET, GPBCLEAR. Выводы GPIO9, GPIO11, GPIO34 и GPIO49 подключаются к четырем светодиодам (LD1–4) в периферийной плате. Цифровая выходная величина «1» включит свет, а цифровой «0» выключит. Lab5_1 будет использовать регистры направлений GPAMUX1, GPBMUX1, GPADIR, GPBDIR и регистры данных GPADAT, GPBDAT, GPASET, GPACLEAR, GPBSET и GPBCLEAR. Программа Lab5_1 непрерывно увеличивает целую переменную "counter " и отображает текущее значение четырех младших битов на LD1 – LD4. В этой лабораторной работе мы не будем использовать прерывания. Модуль сторожевого таймера и основные регистры для установки тактовой частоты в этом упражнении используются. Порядок выполнения: – создайте файл проекта; – используя программу Code Composer Studio, создайте новый проект, названный Lab21.pjt в C:\DSP2833x_V4\Labs (или в другом каталоге, который доступен Вам); – определите размер системного стека C, в окне проекта, кликните правой кнопкой мыши на проекте «Lab21» и выберите «Properties», На вкладках «C/C++ Build», «C2000 Linker», «Basic Options» установите размер стека C в 0x400; – скопируйте предусмотренный файл исходной программы «Lab5_1.c» в папку проекта «C:\DSP2833x_V4\Labs\Lab21», этот шаг автоматически включит файл в проект «Lab21»; – затем, мы воспользуемся некоторыми полезными файлами, которые предусмотрительно созданы инженерами фирмы «Техas Instrument» и уже доступны на вашем жестком диске С как часть так называемого «Файла Заголовков» в пакете (sprc530.zip); – во вкладке C/C++, правый клик на проекте «Lab21» и выбор “Link Files to Project”; – откройте папку C:\tidcs\c28\dsp2833x\v131\DSP2833x_headers\ sou –rce» и добавьте DSP2833x_GlobalVariableDefs.c, этот файл определяет все глобальные переменные, чтобы иметь доступ к памяти, отображающей периферийные регистры; – повторите шаг «Link Files to Project». Из папки C:\tidcs\c28\dsp2833x\v131\DSP2833x_common\source добавьте DSP2833x_CodeStartBranch.asm, этот файл содержит единственную длинную сборочную инструкцию и должен устанавливаться в кодовый раздел «BEGIN» в программе, всё что будет делать Компоновщик базируется на файле, который будет добавлен на следующем шаге. – из C:\tidcs\c28\dsp2833x\v131\DSP2833x_headers\cmd, добавить в «Lab21» – DSP2833x_Headers_nonBIOS.cmd. этот файл команд компоновщика соединит все глобальные переменные и регистры с их соответствующими физическими адресами. Опции компиляции проекта. Мы также должны указать маршрут поиска файлов include для C–Компилятора. Правый клик на проекте «Lab21» и выбор «Properties». Выберите «C/C++ Build», «C2000 Compiler», «Include Options». В окне "Add dir to #include search path”, добавляем следующую строку: – C:\tidcs\C28\dsp2833x\v131\DSP2833x_headers\include Примечание. Используйте Иконку «Add», чтобы добавить новый маршрут как показано на рисунке 2.47.
Рисунок 2.47 – Добавление нового маршрута
Закройте окно нажав <OK>. Модифицируйте Исходную Программу. После того, как мы подготовили наш проект, необходимо проверить и изменить предусмотренный C–исходный файл программы "Lab5_1.c". Откройте Lab5_1.c и найдите локальную функцию «InitSystem()». Вы найдете различные вопросные маркеры в этом коде. Ваше задание – заменить все вопросные маркеры, чтобы завершить код. Установка Сторожевого Таймера (WDCR). Дезактивируйте сторожевой таймер и очистите Разряд WD признака. Установите SCSR, чтобы сгенерировать СБРОС по событию переполнения сторожевого таймера (WDENINT). Установите модуль PLL тактового генератора (PLLCR) – множитель на 10/2. Предположим, мы используем внешний 30 MHz генератор это установит DSP на 150 MHz внутренней частоты. Установите битовую область DIV в PLLCR в 10 и области DIVSEL в регистре PLLSTS на 2. Установите высокочастотный предделитель тактового генератора (HISPCP) на «divide 2», низкочастотный предделитель (LOSPCP) на «divide 4». Разрешите тактирование GPIO битом GPIOINENCLK в регистре PCLKCR3. Запретите тактирование всех других периферийных устройств в регистрах: PCLKCR0, PCLKCR1 и PCLKCR3. Найдите локальную функцию «Gpio_select()» и модифицируйте её код следующим образом: – установите все мультиплексные регистры на цифровой I/O; – установите GPADIR линии GPIO9 и GPIO11 на вывод, все другие линии на ввод; – установите GPВDIR линии GPIO34 и GPIO49 на вывод, все другие линии на ввод; – установите GPCDIR: все линии на цифровой ввод. Установка управляющего цикла В «Lab5_1.c» найдите бесконечный «while» (цикл 1). После инкремента переменной «counter» добавьте следующие инструкции, чтобы проанализировать текущую величину в «counter» (в примере последовательное включение четырех диодов)
If bit 0 of counter is 1, set GPIO9 to 1, otherwise clear GPIO9 to 0; If bit 1 of counter is 1, set GPIO11 to 1, otherwise clear GPIO11 to 0; If bit 2 of counter is 1, set GPIO34 to 1, otherwise clear GPIO34 to 0; If bit 3 of counter is 1, set GPIO49 to 1, otherwise clear GPIO49 to 0.
Примечание. GPIO регистры данных являются доступным для использования комплектом 4 регистров («x» заменяется на A, B или C): – GpioDataRegs.GPxDAT – доступ к регистрам данных; – GpioDataRegs.GPxSET – установка в единицу линий, которые выделяются как «1»; – GpioDataRegs.GPxCLEAR – установка в ноль линий, которые выделяются как «1»; – GpioDataRegs.GPxTOGGLE – инвертирование линий, которые выделяются как «1»; Например, чтобы установить линию GPIO5 в 1 GpioDataRegs.GPASET.bit.GPIO5 = 1;
Компиляция и загрузка. Нажмите «Rebuild Active Project» кнопку или выполните Project → Rebuild All (Alt +B) и наблюдайте работу компилятора в окне build. Если Вы получаете ошибки или предупреждения, необходима коррекция программы. Загрузите выходной файл для отладочной сессии Target → Debug Active Project и переключитесь на вкладку «Debug». Отладка. Проверьте в отладочном окне исходный код «Lab21» и, что синяя стрелка для текущего значения программного счетчика установлена под линией «void main(void)». Запустите выполнение в реальном времени Target → Run. Проверьте, включаются ли светодиоды как ожидается. Если включаются правильно, то Вы успешно завершили первую часть Lab21. Остановите устройство (Target → Halt). Включение Watchdog таймера. Теперь давайте приведем нашу Lab21 к более реалистичному сценарию. Хотя выключить сторожевой таймер было легко в первой части этого упражнения, это плохая практика для реального аппаратного проекта. Сторожевой таймер является аппаратными средствами устройства безопасности; это – внутренняя часть F2833x и она должна использоваться во всех проектах. Модифицируем наш код. Вернитесь назад в «C/C++»вкладку. В файле «Lab21.c» найдите функцию «InitSystem()» и измените WDCR – регистр. Теперь сторожевой таймер включен. Результат – если сторожевой таймер разрешен, наша программа остановит операции после нескольких миллисекунд где–нибудь в while(1) – цикле. В зависимости от выбранного загрузочного режима, сторожевой таймер заставит контроллер прейти аппаратно на стартовую команду, обычно в точку входа во FLASH. Поскольку наша программа загружена в RAM а не во FLASH, он не начнется снова. В результате, наша программа не будет больше работать. Примечание. Загрузочный режим F2833x выбирается четырьмя GPIOs (GPIO87, 86, 85 и 84), которые выбраны во время запуска. В случае F28335ControlCard все 4 вывода – подтянуты резисторами до 3.3 В, таким образом переход на начальный адрес FLASH выбран по умолчанию. На периферийном плате исследователя GPI084 может подключаться к GND перемычкой J3 («Boot–2») в модуле XDS100 («M1»); это выберет опцию «SCI– загрузчик». Все остальные комбинации загрузки не доступны для F28335ControlCard +. Нажмите кнопку «Rebuild All» или выполните Project → Rebuild Active Project Загрузите выходной файл для отладочной сессии Target → Debug Active Project и переключитесь на вкладку «Debug». Запустите выполнение в реальном времени Target → Run. Ваша программа не должна больше работать. Это – признак того, что F2833x сброшен переполнением сторожевого таймера. Обслуживание сторожевого таймера. Включение сторожевого таймера было только половиной задания, чтобы использовать его правильно. Теперь мы должны иметь дело с ним в нашем коде. Это означает, что если управляющий цикл работает как ожидается, сторожевой таймер, хотя он включен, никогда не должен запускать СБРОС. Мы должны, где–нибудь в управляющем цикле, сообщить сторожевому таймеру восстанавливающую ключевую последовательность. Ключевая последовательность состоит из двух инструкций записи в WDKEY–регистр, 0x55 и сопровождающей 0xAA. Вернитесь во вкладку «C/C++», просмотрите файл «Lab21.c». Найдите функцию «delay_loop()» и снимите знак «комментарий» с четырех строк:
EALLOW; SysCtrlRegs.WDKEY = 0x55; SysCtrlRegs.WDKEY = 0xAA; EDIS;
Примечание. C–Макрос «EALLOW» откроет доступ к определенной группе регистров CPU, включая регистры сторожевого таймера. Макрос «EDIS» закроет этот доступ. Нажмите кнопку «Rebuild All» или выполните roject → Rebuild Active Project. Загрузите выходной файл для отладочной сессии Target → Debug Active Project и переключитесь на вкладку «Debug». Запустите выполнение в реальном времени Target → Run. Теперь наш управляющий код должен работать снова как ожидается. Сторожевой таймер активен, но из–за ключевой последовательности он запустит СБРОС только если случится авария кода F2833x.
|