Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MSP430_Final

.pdf
Скачиваний:
49
Добавлен:
31.05.2015
Размер:
2.03 Mб
Скачать

 

 

 

21.3. Регистры модуля ADC12 501

 

 

 

SHP

Бит 9

Выбор импульсного режима работы устройства выборки/хранения.

 

 

Этот бит определяет источник сигнала выборки SAMPCON — выход

 

 

таймера выборки или непосредственно сигнал выборки.

 

 

0

Сигнал SAMPCON формируется из входного сигнала выборки

 

 

1

Сигнал SAMPCON формируется таймером выборки

ISSH

Бит 8

Инвертирование сигнала запуска выборки/преобразования.

 

 

0

Сигнал запуска выборки/преобразования не инвертируется

 

 

1

Сигнал запуска выборки/преобразования инвертируется

ADC12DIVx

Биты

Коэффициент деления тактового сигнала модуля ADC12.

 

7…5

000

1

 

 

001

2

 

 

010

3

 

 

011

4

 

 

100

5

 

 

101

6

 

 

110

7

 

 

111

8

ADC12SSELx Биты

Выбор источника тактового сигнала модуля ADC12.

 

4…3

00

ADC12SC

 

 

01

ACLK

 

 

10

MCLK

 

 

11

SMCLK

CONSEQx

Биты

Выбор режима преобразования.

 

2…1

00

Однократный одноканальный

 

 

01

Однократный последовательный

 

 

10

Циклический одноканальный

 

 

11

Циклический последовательный

ADC12BUSY Бит 0

Модуль ADC12 занят. Этот бит показывает активность операций вы

 

 

борки или преобразования.

 

 

0

Нет активности

 

 

1

Производится выборка, преобразование или выполняется пос

 

 

 

ледовательность преобразований

ADC12MEMx, регистр данных буфера модуля ADC12

15

14

13

12

11

10

9

8

0

0

 

0

 

0

 

Результат преобразования

 

 

 

 

 

 

 

 

 

 

 

r0

r0

 

r0

 

r0

rw

rw

rw

rw

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

Результат преобразования

 

 

 

 

 

 

 

 

 

 

 

 

rw

rw

 

rw

 

rw

rw

rw

rw

rw

Результат

Биты

12 битный результат преобразования выровнен по правому краю.

преобразо

15…0 Бит 11 — MSB. Биты 15…12 всегда равны 0. Запись в регистры памя

вания

 

ти преобразований вызовет порчу результата.

 

 

502 Глава 21. Модуль 12#битного АЦП ADC12

ADC12MCTLx, регистр управления памяти преобразований модуля ADC12

7

6

 

 

5

4

3

2

1

0

EOS

 

 

SREFx

 

 

INCHx

 

 

 

 

 

 

 

 

 

 

rw–(0)

rw–(0)

 

rw–(0)

rw–(0)

rw–(0)

rw–(0)

rw–(0)

rw–(0)

 

Может быть изменён только при ENC = 0.

 

 

 

 

 

 

 

EOS

Бит 7 Конец последовательности. Этот бит помечает последнее преобразо

 

 

вание в последовательности.

 

 

 

 

 

0

 

Не конец последовательности

 

 

 

 

 

1

 

Конец последовательности

 

 

 

SREFx

Биты

Выбор источника опорного напряжения.

 

 

 

6…4

000

 

VR+ = AVCC, VR– = AVSS

 

 

 

 

 

001

VR+ = VREF+, VR– = AVSS

 

 

 

 

 

010

VR+ = VeREF+, VR– = AVSS

 

 

 

 

 

011

VR+ = VeREF+, VR– = AVSS

 

 

 

 

 

100

VR+ = AVСС, VR– = VREF–/VeREF–

 

 

 

 

 

101

VR+ = VREF+, VR– = VREF–/VeREF–

 

 

 

 

110

VR+ = VeREF+, VR– = VREF–/VeREF–

 

 

INCHx

 

111

VR+ = VeREF+, VR– = VREF–/VeREF–

 

 

Биты

Выбор входного канала. Эти биты определяют конкретный канал для

 

3…0

однократных преобразований или канал с максимальным номером

 

 

для последовательных преобразований.

 

 

 

 

0000

A0

 

 

 

 

 

 

 

0001

A1

 

 

 

 

 

 

 

0010

A2

 

 

 

 

 

 

 

0011

A3

 

 

 

 

 

 

 

0100

A4

 

 

 

 

 

 

 

0101

A5

 

 

 

 

 

 

 

0110

A6

 

 

 

 

 

 

 

0111

A7

 

 

 

 

 

 

 

1000

VeREF+

 

 

 

 

 

 

 

1001

VREF–/VeREF–

 

 

 

 

 

 

1010

Датчик температуры

 

 

 

 

 

1011

(AVCC AVSS)/2

 

 

 

 

 

 

1100

GND

 

 

 

 

 

 

 

1101

GND

 

 

 

 

 

 

 

1110

GND

 

 

 

 

 

 

 

1111

GND

 

 

 

 

 

ADC12IE, регистр разрешения прерываний модуля ADC12

15

14

13

12

11

10

9

8

ADC12IE15

ADC12IE14

ADC12IE13

ADC12IE12

ADC12IE11

ADC12IE10

ADC12IE9

ADC12IE8

 

 

 

 

 

 

 

 

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

7

6

5

4

3

2

1

0

ADC12IE7 ADC12IE6 ADC12IE5 ADC12IE4 ADC12IE3 ADC12IE2 ADC12IE1 ADC12IE0

rw (0) rw (0)

ADC12IEx Биты 15…0

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

Разрешение прерывания. Эти биты разрешают или запрещают гене рацию запроса прерывания при установке соответствующего флага ADC12IFGx.

0 Прерывание запрещено

1Прерывание разрешено

21.3. Регистры модуля ADC12 503

ADC12IFG, регистр флагов прерываний модуля ADC12

15

14

13

12

11

10

9

8

ADC12

ADC12

ADC12

ADC12

ADC12

ADC12

ADC12

ADC12

IFG15

IFG14

IFG13

IFG12

IFG11

IFG10

IFG9

IFG8

 

 

 

 

 

 

 

 

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

ADC12

ADC12

ADC12

ADC12

ADC12

ADC12

ADC12

ADC12

IFG7

IFG6

IFG5

IFG4

IFG3

IFG2

IFG1

IFG0

 

 

 

 

 

 

 

 

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

rw (0)

ADC12IFGx Биты 15…0

Флаг прерывания регистра ADC12MEMx. Эти биты устанавливаются при загрузке результата преобразования в соответствующий регистр ADC12MEMx. Биты ADC12IFGx сбрасываются автоматически при любом обращении к соответствующему регистру ADC12MEMx или программно.

0 Не было запроса прерывания

1Есть запрос прерывания

ADC12IFG, регистр флагов прерываний модуля ADC12

15

14

13

12

 

11

 

10

9

8

0

0

 

0

 

0

 

0

 

0

 

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

r0

r0

 

r0

 

r0

 

r0

 

r0

 

r0

r0

7

6

5

4

 

3

 

2

1

0

 

 

 

 

 

 

 

 

 

 

 

0

0

 

 

 

 

ADC12IVx

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

r0

r0

 

r (0)

 

r (0)

r (0)

r (0)

 

r (0)

r0

ADC12IVx

Биты

Значение вектора прерывания модуля ADC12

 

 

15…0

 

 

 

 

 

 

 

 

 

 

 

 

Содержимое

 

Источник прерывания

 

 

Флаг

Приоритет

 

 

 

 

 

 

 

 

ADC12IV

 

 

прерывания

прерывания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00h

Нет прерывания

 

 

 

 

 

 

 

 

02h

Переполнение ADC12MEMx

 

 

Высший

 

 

 

04h

Превышение времени

 

 

 

 

 

 

 

преобразования

 

 

 

 

 

 

 

 

 

06h

Флаг прерывания ADC12MEM0

ADC12IFG0

 

 

 

 

08h

Флаг прерывания ADC12MEM1

ADC12IFG1

 

 

 

 

0Ah

Флаг прерывания ADC12MEM2

ADC12IFG2

 

 

 

 

0Ch

Флаг прерывания ADC12MEM3

ADC12IFG3

 

 

 

 

0Eh

Флаг прерывания ADC12MEM4

ADC12IFG4

 

 

 

 

010h

Флаг прерывания ADC12MEM5

ADC12IFG5

 

 

 

 

012h

Флаг прерывания ADC12MEM6

ADC12IFG6

 

 

 

 

014h

Флаг прерывания ADC12MEM7

ADC12IFG7

 

 

 

 

016h

Флаг прерывания ADC12MEM8

ADC12IFG8

 

 

 

 

018h

Флаг прерывания ADC12MEM9

ADC12IFG9

 

 

 

 

01Ah

Флаг прерывания ADC12MEM10

ADC12IFG10

 

 

 

 

01Ch

Флаг прерывания ADC12MEM11

ADC12IFG11

 

 

 

 

01Eh

Флаг прерывания ADC12MEM12

ADC12IFG12

 

 

 

 

020h

Флаг прерывания ADC12MEM13

ADC12IFG13

 

 

 

 

022h

Флаг прерывания ADC12MEM14

ADC12IFG14

 

 

 

 

024h

Флаг прерывания ADC12MEM15

ADC12IFG15

Низший

504 Глава 22. Структура TLV

ГЛАВА 22

СТРУКТУРА TLV

Структуры TLV (Tag Length Value — тег длина значение) используются в микроконтроллерах семейства MSP430x2xx для представления информации, за висящей от устройства, такой как калибровочные значения. Эти структуры рас полагаются в сегменте A информационной секции флэш памяти. Аппаратно за висимые реализации данных структур описываются в справочной документации на конкретные модели.

22.1. Введение

Структуры TLV описывают специфическую для данного устройства информа цию, хранящуюся в сегменте A. В качестве примера в Табл. 22.1 показано содер жимое сегмента A некоего условного устройства.

В двух первых байтах сегмента A (0x10C0 и 0x10C1) содержится контрольная сумма остальной части сегмента (адреса с 0x10C2 по 0x10FF).

Первый тег располагается по адресу 0x10C2 — в данном примере это тег TAG_EMPTY. В следующем байте (0x10C3) содержится длина последующего по ля данных. Длина структуры TAG_EMPTY равна 0x16, поэтому следующий тег, TAG_ADC12_1, располагается по адресу 0x10DA. Аналогично, в следующем бай те содержится длина поля данных структуры TAG_ADC12_1.

Структуры TLV занимают всё адресное пространство сегмента A от 0x10C2 до 0x10FF. Пользовательская программа, проверяющая наличие тегов начиная с первого адреса сегмента (0x10C2), может извлечь всю требуемую информацию даже в том случае, если эта информация расположена по другим (зависящим от устройства) абсолютным адресам.

22.2. Поддерживаемые теги

Каждое устройство поддерживает определённые теги, перечисленные в Табл. 22.2. Более подробная информация приводится в справочной документа ции на конкретные модели.

22.2. Поддерживаемые теги 505

Таблица 22.1. Пример содержимого сегмента A

Адрес

Старший байт

 

Младший байт

Адрес тега

слова

 

и смещение

 

 

 

 

 

 

 

 

0x10FE

CALBC1_1MHZ

 

CALDCO1_1MHZ

0x10F6 + 0x0008

 

 

 

 

 

0x10FC

CALBC1_8MHZ

 

CALDCO1_8MHZ

0x10F6 + 0x0006

 

 

 

 

 

0x10FA

CALBC1_12MHZ

 

CALDCO1_12MHZ

0x10F6 + 0x0004

 

 

 

 

 

0x10F8

CALBC1_16MHZ

 

CALDCO1_16MHZ

0x10F6 + 0x0002

 

 

 

 

 

0x10F6

0x08 (ДЛИНА)

 

TAG_DCO_30

0x10F6

 

 

 

 

 

0x10F4

0xFF

 

0xFF

 

 

 

 

 

 

0x10F2

0xFF

 

0xFF

 

 

 

 

 

 

0x10F0

0xFF

 

0xFF

 

 

 

 

 

 

0x10EE

0xFF

 

0xFF

 

 

 

 

 

 

0x10EC

0x08 (ДЛИНА)

 

TAG_EMPTY

0x10EC

 

 

 

 

 

0x10EA

 

CAL_ADC_25T85

0x10DA + 0x0010

 

 

 

 

0x10E8

 

CAL_ADC_25T30

0x10DA + 0x000E

 

 

 

0x10E6

CAL_ADC_25VREF_FACTOR

0x10DA + 0x000C

 

 

 

 

0x10E4

 

CAL_ADC_15T85

0x10DA + 0x000A

 

 

 

 

0x10E2

 

CAL_ADC_15T30

0x10DA + 0x0008

 

 

 

0x10E0

CAL_ADC_15VREF_FACTOR

0x10DA + 0x0006

 

 

 

0x10DE

CAL_ADC_OFFSET

0x10DA + 0x0004

 

 

 

0x10DC

CAL_ADC_GAIN_FACTOR

0x10DA + 0x0002

 

 

 

 

 

0x10DA

0x10 (ДЛИНА)

 

TAG_ADC12_1

0x10DA

 

 

 

 

 

0x10D8

0xFF

 

0xFF

 

 

 

 

 

 

0x10D6

0xFF

 

0xFF

 

 

 

 

 

 

0x10D4

0xFF

 

0xFF

 

 

 

 

 

 

0x10D2

0xFF

 

0xFF

 

 

 

 

 

 

0x10D0

0xFF

 

0xFF

 

 

 

 

 

 

0x10CE

0xFF

 

0xFF

 

 

 

 

 

 

0x10CC

0xFF

 

0xFF

 

 

 

 

 

 

0x10CA

0xFF

 

0xFF

 

 

 

 

 

 

0x10C8

0xFF

 

0xFF

 

 

 

 

 

 

0x10C6

0xFF

 

0xFF

 

 

 

 

 

 

0x10C4

0xFF

 

0xFF

 

 

 

 

 

 

0x10C2

0x16 (ДЛИНА)

 

TAG_EMPTY

0x10C2

 

 

 

 

0x10C0

Результат побитовой операции «Исключающее ИЛИ», представлен

0x10C0

 

ный в дополнительном коде

 

 

 

 

 

 

Таблица 22.2. Поддерживаемые теги (зависит от устройства)

Тег

Описание

Значение

 

 

 

TAG_EMPTY

Неиспользуемая область памяти

0xFE

 

 

 

TAG_DCO_30

Калибровочные значения DCO для комнатной температуры и DVCC = 3 В

0x01

TAG_ADC12_1

Калибровочные значения для модуля ADC12

0x08

 

 

 

506 Глава 22. Структура TLV

22.2.1. Структура TLV калибровочных значений DCO

Для калибровки генератора DCO используются регистры BCSCTL1 и DCOCTL модуля синхронизации BCS+. Значения, хранящиеся сегменте A ин формационной секции флэш памяти (Табл. 22.3), загружаются в указанные ре гистры модуля BSC+.

Таблица 22.3. Данные для калибровки DCO (зависит от устройства)

Метка

Описание

Смещение

 

 

 

CALBC1_1MHZ

Содержимое регистра BCSCTL1 для 1 МГц, TA = 25°C

0x07

CALDCO_1MHZ

Содержимое регистра DCOCTL для 1 МГц, TA = 25°C

0x06

CALBC1_8MHZ

Содержимое регистра BCSCTL1 для 8 МГц, TA = 25°C

0x05

CALDCO_8MHZ

Содержимое регистра DCOCTL для 8 МГц, TA = 25°C

0x04

CALBC1_12MHZ

Содержимое регистра BCSCTL1 для 12 МГц, TA = 25°C

0x03

CALDCO_12MHZ

Содержимое регистра DCOCTL для 12 МГц, TA = 25°C

0x02

CALBC1_16MHZ

Содержимое регистра BCSCTL1 для 16 МГц, TA = 25°C

0x01

CALDCO_16MHZ

Содержимое регистра DCOCTL для 16 МГц, TA = 25°C

0x00

Использование абсолютного режима адресации

Данные для калибровки DCO содержатся во всех моделях семейства 2xx и хранятся по одним и тем же абсолютным адресам. Поэтому для обращения к со держимому сегмента A в конкретном устройстве можно использовать абсолют ную адресацию, как показано в следующем примере.

; Калибровка DCO на частоту 1 МГц

CLR.B &DCOCTL

; Выбираем наименьшие значения

 

; для битов DCOx и MODx

MOV.B &CALBC1_1MHZ,&BCSCTL1

;

Задаём RSELx

MOV.B &CALDCO_1MHZ,&DCOCTL

;

Задаём DCOx и MODx

Использование структуры TLV

Структура TLV позволяет обращаться к содержимому флэш памяти, исполь зуя адрес тега TAG_DCO_30. В следующем фрагменте показан пример адресации калибровочных значений DCO с использованием тега TAG_DCO_30.

;Калибровка DCO на частоту 8 МГц

;Полагаем, что в регистре R10 содержится адрес тега TAG_DCO_30

CLR.B &DCOCTL

; Выбираем наименьшие значения

 

 

; для битов DCOx и MODx

MOV.B

7(R10),&BCSCTL1

;

Задаём

RSELx

MOV.B

6(R10),&DCOCTL

;

Задаём

DCOx и MODx

22.2.2. Структура TLV калибровочных значений модуля ADC12

Данные для калибровки модуля ADC12 (Табл. 22.4) представляют собой набор из восьми двухбайтных значений.

22.2. Поддерживаемые теги 507

Таблица 22.4. Данные для калибровки модуля ADC12 (зависит от устройства)

Метка

 

Описание

Смещение

 

 

 

 

CAL_ADC_25T85

VREF2_5 = 1, TA = +85

±2°C, 12 битный результат

0x0E

 

преобразования

 

 

CAL_ADC_25T30

VREF2_5 = 1, TA = +30

±2°C, 12 битный результат

0x0C

 

преобразования

 

 

CAL_ADC_25VREF_FACTOR

VREF2_5

= 1, TA = +30

±2°C

0x0A

CAL_ADC_15T85

VREF2_5

= 0, TA = +85

±2°C, 12 битный результат

0x08

 

преобразования

 

 

 

 

 

 

 

CAL_ADC_15T30

VREF2_5

= 0, TA = +30

±2°C, 12 битный результат

0x06

 

преобразования

 

 

CAL_ADC_15VREF_FACTOR

VREF2_5

= 0, TA = +30

±2°C

0x04

CAL_ADC_OFFSET

VeREF = 2.5 В, TA = +85 ±2°C, fADC12CLK = 5 МГц

0x02

CAL_ADC_GAIN_FACTOR

VeREF = 2.5 В, TA = +85 ±2°C, fADC12CLK = 5 МГц

0x00

Данные для калибровки датчика температуры

Датчик температуры калибруется с использованием встроенного источника опорного напряжения. Результаты преобразования для температур +30°C и +85°C при разных значениях бита VREF2_5 заносятся в соответствующие ячейки сег мента А (см. Табл. 22.4).

Данные для калибровки встроенного источника опорного напряжения

Опорные напряжения (VREF2_5 = 0 и 1) измеряются при комнатной темпе ратуре. Измеренное значение перед записью в сегмент А флэш памяти нормали зуется относительно уровня 1.5/2.5 В:

CAL_ADC_15VREF_FACTOR = Ve REF ×215 .

1.5 В

Корректировка результата преобразования производится его умножением на коэффициент CAL_ADC_15VREF_FACTOR (или CAL_ADC_25VREF_FACTOR) с последующим делением на 215:

ADCкоррект = ADCисх ×CAL_ADC_15VREF_FACTOR × 1 .

215

Пример использования калибровки источника опорного напряжения

В следующем примере при выполнении преобразования используется внут реннее опорное напряжение 1.5 В.

1.Результат преобразования: 0x0100.

2.Калибровочный коэффициент опорного напряжения: 0x7BBB.

Для корректирования результата преобразования модуля ADC12 можно вос пользоваться аппаратным умножителем:

1.Умножить результат преобразования на 2 (эта операция упростит последующее деление).

508 Глава 22. Структура TLV

2.Умножить результат на величину CAL_ADC_15VREF_FACTOR.

3.Разделить результат на 216 (взять старшее слово 32 битного результата умноже ния RESHI).

Внашем примере:

1.0x0100 0x0002 = 0x0200

2.0x0200 0x7BBB = 0x00F7_7600

3.0x00F7_7600 0x0001_0000 = 0x0000_00F7 (= 247)

Ниже приведён фрагмент программы, выполняющий описанные действия с использованием аппаратного умножителя.

;Результат АЦП находится в регистре ADC12MEM0

;Предполагается, что R9 содержит адрес TAG_ADC12_1.

;Скорректированное значение заносится в ячейку ADC_COR

MOV.W &ADC12MEM0,R10

; Копируем результат в R10

RLA.W R10

; R10 x 2

MOV.W R10,&MPY

; 1$й операнд, беззнаковое умножение

MOV.W CAL_ADC_15VREF_FACTOR(R9),&OP2

 

; 2$й операнд — калибровочное значение

MOV.W &RESHI,&ADC_COR

; Результат: старшие 16 бит регистра MPY

Данные для калибровки смещения и коэффициента усиления

Значение смещения модуля ADC12 хранится в сегменте A в виде 2 байтного значения, представленного в дополнительном коде. Ошибка смещения коррек тируется сложением результата преобразования со значением CAL_ADC_OFFSET:

ADCкоррект = ADCисх + CAL_ADC_OFFSET .

Коэффициент усиления модуля ADC12, расположенный по смещению 0x00, вычисляется следующим образом:

CAL_ADC_GAIN_FACTOR = 1 ×215 .

GAIN

Корректирование результата преобразования по усилению производится его

умножением на значение CAL_ADC_GAIN_FACTOR и последующим делением на 215:

ADCкоррект = ADCисх ×CAL_ADC_GAIN_FACTOR × 1 .

215

Если результат преобразования корректируется по обоим параметрам, то пер вой осуществляется корректировка усиления:

ADCкоррект, усил = ADCисх ×CAL_ADC_GAIN_FACTOR × 1 ;

215

ADCитог = ADCкоррект, усил + CAL_ADC_OFFSET .

22.3. Проверка целостности содержимого сегмента A 509

Пример использования калибровки смещения и усиления

В следующем примере при выполнении преобразования используется вне шний источник опорного напряжения.

Результат преобразования: 0x0800 (= 2048).

Калибровочный коэффициент по усилению: 0x7BBB.

Смещение: 0xFFFE (–2 в дополнительном коде).

Для корректирования результата преобразования модуля ADC12 можно вос пользоваться аппаратным умножителем:

1.Умножить результат преобразования на 2 (эта операция упростит последующее деление).

2.Умножить результат на величину CAL_ADC_GAIN_FACTOR.

3.Разделить результат на 216 (взять старшее слово 32 битного результата умноже ния RESHI).

4.Прибавить к результату значение CAL_ADC_OFFSET.

Внашем примере:

1.0x0800 0x0002 = 0x1000

2.0x1000 0x8010 = 0x0801_0000

3.0x0801_0000 0x0001_0000 = 0x0000_0801 (= 2049)

4.0x801 + 0xFFFE = 0x07FF (= 2047)

Ниже приведён фрагмент программы, выполняющий описанные действия с использованием аппаратного умножителя.

;Результат АЦП находится в регистре ADC12MEM0

;Предполагается, что R9 содержит адрес TAG_ADC12_1.

;Скорректированное значение заносится в ячейку ADC_COR MOV.W &ADC12MEM0,R10 ; Копируем результат в R10

RLA.W R10

; R10

x 2

MOV.W R10,&MPY

;

1$й операнд, беззнаковое умножение

MOV.W CAL_ADC_GAIN_FACTOR(R9),&OP2

 

;

2$й

операнд — калибровочное значение

MOV.W &RESHI,&ADC_COR ; Используем старшие 16 бит регистра MPY ADD.W CAL_ADC_OFFSET(R9),&ADC_COR

;Корректируем смещение

22.3.Проверка целостности содержимого сегмента A

По адресам 0x10C0 и 0x10C1 расположена 2 байтная контрольная сумма со держимого сегмента A с адреса 0x10C2 по 0x10FF. Контрольная сумма представ ляет собой результат побитовой операции «Исключающее ИЛИ» между осталь ными словами сегмента, представленный в дополнительном коде.

Ниже приведён фрагмент кода, в котором вычисляется контрольная сумма сегмента A.

;Проверка целостности содержимого сегмента A флэш$памяти

;путём вычисления обратного кода слов, расположенных по

;адресам 0x10C2 – 0x10FE

510 Глава 22. Структура TLV

;Предполагается, что начальный адрес сегмента A находится

;в R10. Регистр R11 инициализирован нулевым значением.

;Метка TLV_CHKSUM соответствует адресу 0x10C0

ADD.W

#2,R10

; Пропускаем поле контрольной суммы

LP0 XOR.W

@R10+,R11

; Прибавляем слово к контрольной сумме

CMP.W

#0x10FF,R10

; Последнее слово?

JN

LP0

; Нет, продолжаем

ADD.W

&TLV_CHKSUM,R11

; Прибавляем контрольную сумму

JNZ

CSNOK

; Контрольная сумма не верна

...

 

; Используем данные сегмента A

CSNOK ...

 

; Не используем данные сегмента A

22.4. Анализ содержимого сегмента A

Ниже приведён пример кода, выполняющего анализ содержимого сегмента A.

; Предполагается, что начальный адрес сегмента A находится в R10

LP1

ADD.W

#2,R10

;

Пропускаем два байта

 

CMP.W

#0x10FF,R10

;

Дошли до конца сегмента?

 

JGE

DONE

; Да, переходим к метке DONE

 

CMP.B

#TAG_EMPTY,0(R10)

 

 

 

 

; TAG_EMPTY?

 

JNZ

T1

; Нет, продолжаем

 

JMP

LP2

; Да, обрабатываем тег TAG_EMPTY

T1

CMP.B

#TAG_ADC12_1,0(R10)

 

 

 

; TAG_ADC12_1?

 

JNZ

T2

; Нет, продолжаем

 

...

 

; Да, найден TAG_ADC12_1

 

JMP

LP2

; Обрабатываем тег TAG_ADC12_1

T2

CMP.B

#DCO_30,0(R10)

; TAG_DCO_30?

 

JNZ

T3

; Нет, продолжаем

 

CLR.B

&DCOCTL

; Устанавливаем наименьшее значение DCOx

 

MOV.B

7(R10),&BCSCTL1

; Да, используем данные для 8 МГц

 

MOV.B

6(R10),&DCOCTL

; и задаём DCOx и MODx

 

JMP

LP2

; Обрабатываем тег TAG_DCO_30

T3

...

 

; Проверяем на следующий тег

 

...

 

;

 

 

JMP

LP2

; Обрабатываем следующий тег

LP2

MOV.B

1(R10),R11

; Запоминаем длину в R11

 

ADD.W

R11,R10

; Прибавляем длину к R10

 

JMP

LP1

; Продолжаем анализ

DONE

 

 

;

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]