uzluga.ru
добавить свой файл
1

ЛАБОРАТОРНАЯ РАБОТА №5

«РАБОТА С ПЕРИФЕРИЕЙ ПРОЦЕССОРА.

ОПИСАНИЕ РЕГИСТРОВ В ЗАГОЛОВОЧНЫХ ФАЙЛАХ»


Цель работы:

  • Обучение программированию периферийных регистров

  • Использование заголовочных файлов

  • Изучение вопроса описания периферии в командном файле компоновщика

  • Использование стандартных средств обращения к регистрам

  • Получение навыков работы с дискретными портами ввода/вывода

  • Получение навыков программирования прерывания от таймера


1. Откроем проект lab5 и рассмотрим его подробно:

Во вкладке include хранятся заголовочные файлы, а во вкладке source – исходные. Каждый файл описывает отдельное устройство. Заголовочные Си-файлы F281x являются частью библиотеки и состоят из Си-функций, макросов, периферийных структур и определений переменных.


2. Ознакомимся с различными подходами программирования в СИ:

1) Традиционный – при этом регистры целиком записываются непосредственно в команде.


#define ADCTRL1 (volatile unsigned int *)0x00007100

#define ADCTRL2 (volatile unsigned int *)0x00007101

//Прим. volatile - запрет оптимизации доступа к переменной


void main(void)

{

*ADCTRL1 = 0x1234; // Запись регистра целиком

*ADCTRL2 |= 0x4000; // Сброс первого секвенсера

// Прим. |= операция ИЛИ

}


2) Структурный – при этом имеются группы регистров, в которых выделяются отдельные регистры, вплоть до отдельных битов.


void main(void)

{

AdcRegs.ADCTRL1.all = 0x1234; // Запись регистра целиком

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Сброс первого секвенсера

}


Общие правила доступа к элементам структур:


PeripheralName.RegisterName.all // Доступ к 16 или 32-разрядному регистру целиком

PeripheralName.RegisterName.half.LSW // Доступ к младшим 16 разрядам 32-разрядного регистра

PeripheralName.RegisterName.half.MSW // Доступ к старшим 16 разрядам 32-разрядного регистра

PeripheralName.RegisterName.bit.FieldName // Доступ к определенному битовому полю


3. Ознакомимся со структурой файла определения глобальных переменных DSP281x_Device.h:

Его объявление в других модулях имеет вид:


#include “DSP281x_Device.h”


В нем содержатся: общие для всего 28xx семейства определения, определение масок прерываний, определение дополнительных типов (typedef int int16, …), подключение всех файлов, описывающих периферию и систему (#include "DSP28_Gpio.h", …), объявлены ассемблерные макросы (#define EINT asm(" clrc INTM",…).


4. Рассмотрим процедуру включение и выключения светодиода:

Для определения функции вывода процессора, с которым связан второй светодиод, используются регистры GPIO. Выбор режима осуществляется через регистры GPxMUX. Для управления направлением цифрового ввода/вывода предназначены регистры GPxDIR.


EALLOW; // разрешить изменение данных регистров

GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=1; // настроим регистр направления на вывод

EDIS; // восстановим защиту

while(1)

{

asm(" setc xf"); // установить флаг xf

asm(" clrc xf"); // сбросить флаг xf

}


5. Изменим программу так, чтобы светодиод горел с определенной «скважностью»:


int procent=100;

EALLOW;

GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=0;

GpioMuxRegs.GPFDIR.bit.GPIOF14=1;

EDIS;

while(1)

{

if (l_counter>100) l_counter=0;

EALLOW;

if (l_counter

else GpioDataRegs.GPFDAT.bit.GPIOF14=0;

}