Инструменты пользователя

Инструменты сайта


doc:mk:1986be1t:faq

Общие вопросы по 1986ВЕ1Т

- В чем разница между генераторами HSE и HSE2.

Ответ:
HSE генератор предназначен для получения тактового сигнала для ядра микроконтроллера и периферии, к этому генератору допускается подключение внешнего кварцевого резонатора в диапазоне частот от 2 до 16 МГц при условии настройки блока для работы в режиме осциллятора (бит HSE BYP = 0 в регистре RST_CLK→HS_CONTROL). Также к HSE допускается подключение внешнего генератора с частотой до 144 МГц (с ревизии 3, ревизия 1 и 2 – до 140 МГц) при условии настройки блока для работы в режиме внешнего генератора (бит HSE BYP = 1 в регистре RST_CLK→HS_CONTROL).

HSE2 генератор предназначен для получения тактового сигнала только для блока Ethernet PHY (который требует стабильную частоту 25 МГц), от этого генератора не предусмотрена подача тактового сигнала на ядро контроллера или другую периферию. Данный генератор предусматривает подключение либо кварцевого резонатора (от 20 до 30 МГц), либо внешнего генератора. В программе необходимо будет предусмотреть включение HSE2 генератора в режиме внешнего генератора (в регистре RST_CLK→HS_CONTROL установить в 1 разряды 2 (HSEON2) и 3 (HSEBYP2)).

Внимание! Частота 25 МГц для Ethernet должна быть очень "чистой", причем если на плате стоят генераторы (не резонаторы, а именно генераторы), то работа Ethernet PHY сильно затрудняется, так как они сильно шумят по питанию, вообщем одной из проблем, которая может вызвать такого рода эффекты. А с учетом того, что в демо-плату напихано все что только можно и выполнена она всего в двух слоях - с шумами там не то что бы очень плохо, но и не хорошо.

Использовать генератор можно, только необходимо соблюдать требование, написанное на странице 395 спецификации: "Блок PHY обеспечивает простое подключение к линии с использованием небольшого количества внешних элементов. Частота тактирования блока PHY должна быть 25 МГц с джиттером менее 100 пс и длительностью фронтов менее 3 нс."


в канале ARINC-429 микроконтроллера 1986ВЕ1Т не происходит приём посылки (т.е. отсутствие записи в буфер (FIFO) приёмника и установки признаков приёма) при установленном флаге ошибки приёма данного канала (соответствующий бит ERRi регистра приёмника STATUS1 контроллера интерфейса ГОСТ 18977-79). Поэтому, если флаг ошибки установлен, для гарантированного приёма следующей корректной посылки необходимо произвести программный сброс флага до окончания поступления этой посылки. В случае работы с блоком без программного анализа и сброса ошибок, установленный флаг ошибки будет сброшен аппаратно фактом поступления следующей (за событием, вызвавшим установку флага) корректной посылки, то есть, не имеющей ошибок в количестве битов и их длительности, правильном значении бита чётности и корректными паузами до и после посылки; при этом приём самой этой посылки не гарантируется. Дальнейший приём посылок будет происходить штатно, т.е. вторая и последующие корректные посылки гарантированно будут приниматься, вплоть до возникновения нового ошибочного события. Данное поведение не является признаком наличия аппаратного дефекта для всех ревизий микроконтроллеров 1986ВЕ1Т и является их штатным режимом функционирования.


Как определить ревизию МК 1986ВЕ1Т?

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

1 способ.

Скачать функцию на форуме и вставить в свою программу.

2 способ.

а) Устанавить режим UART-loader (SW3, SW2, SW1 –> 100). Подключить к ПК через RS-232 (на плате установлены перемычки XP18 - UART, XP19 - UART1). Включить плату.

б) Ознакомиться с разделом спецификации "Загрузочное ПЗУ и режимы работы микроконтроллера", пункт "UART загрузчик". С помощью любого терминала на ПК послать по RS-232, используя настройки из пункта спецификации "Параметры связи по UART" символы 0x00 для синхронизации, (может быть необходимо порядка 500 символов), после успешной синхронизации контроллер выдает 3 символа 0x0D, 0x0A, 0x3E.

в) Подать команду CMD_VFY (9 байт по порядку: 0x59 0xFF 0x0F 0x00 0x00 0x01 0x00 0x00 0x00) для чтения 1 байта по адресу 0xFFF. В этом байте хранится номер ревизии кристалла (а точнее в 4 старших разрядах).

Возможные варианты:

  • 0x00 - 1 ревизия
  • 0x8D - 2 ревизия
  • 0x4D - 3 ревизия
  • 0xCD - 4 ревизия
  • 0x2D - 5 ревизия
  • 0хAD - 6 ревизия

Примечание: Данную программу нельзя использовать при исполнении программы из FLASH, так как информация о ревизии находится в масочном ПЗУ, а масочное ПЗУ не доступно, при таком исполнении.

О том, как запустить МК в режиме UART-загрузчика, описано в статье Тестируем Bootloader в режиме UART. Для получения номера ревизии кристалла после успешной синхронизации МК с ПК в программе Terminal v1.9b можно воспользоваться командой

Y$FF$0F$00$00$01$00$00$00

- Нужны ли терминирующие резисторы 75Ом при подключении в линию МКИО отладочной платы 1986ВЕ1Т?

Да, нужны.

На плате (rev. 4) установлены резисторы R46, R107 и R112 чтобы "имитировать" терминирующие резисторы при подключению друг к другу двух отладочных платы (без терминирующих резисторов). Резисторы имеют номиналы по 1,2К и их три штуки для лучшего рассеивания мощности. Подключение/отключение этих резисторов осуществляется джампером на плате.

При внешнем терминировании джампер необходимо снять.

В реальной линии сигналы могут достигать 20В, поэтому на правильном резисторе 75Ом должна рассеиваться большая мощность. На плату не стали ставить такой мощный резистор. Кроме этого, для избежания перегрева микросхем-драйверов 5559ИН13 на выводах R установлены ограничивающие резисторы, чтобы снизить ток через трансформаторы. Поэтому при подключении демо-платы на реальную линию, сигналы будут несколько подсажены.

На демоплате можно вывести наружу либо один контроллер МКИО (линии А и B), либо второй (C и D). При сертификации работы с обоими каналами использовалась дополнительная плата (со всей обвязкой под второй МКИО - драйверы 6669ИН3 и трансформаторы). Плата подсоединялась на разъем XP48 (EXTERNAL_SYSTEM_BUS) для подключения питания. Вторым же резъемом одевалась на разъем с контактами MIL_STD_1553.


- На отладочной плате не удается измерить сигнал с выводов АЦП, в чем может быть дело? С АЦП постоянно считываются значения 0xFFF, даже с регулируемого резистора R14, состояние которого на значение АЦП не влияет.

Отладочная плата имеет некоторый недостаток. С драйвера UART_RX подается 5 вольт на НЕ толерантный вывод PD14 Uart2_RX, он же ADC7 в другой функции. Это повышенное напряжение сбивает работу аналоговой части. Поэтому на плате необходимо снять перемычку Uart2_RX на разъеме XP19. Лучше снять обе - RX и TX.

adc_uart2_5v.jpg

Выводы каналов АЦП идут так-же на светодиоды, поэтому перемычки на светодиоды тоже лучше снять.

ПРОЯВЛЯЕТСЯ ТАКЖЕ: При поданных 5 вольтах с Uart2 и установленной перемычке на светодиоде VD13, значение с АЦП считывается порядка 0xBBх, при этом значения меняются в младших разрядах. Это показывает, что АЦП на самом деле измеряет, но значение сигнала не меняется при внешних воздействиях.


- Подскажите как запустить исполняемый код из ОЗУ внутреннего или внешнего. Хочу исследовать потерю производительности. Использую Keil 4, процессор 1986ВЕ1Т. Я так понял, что надо загрузить код в озу и передать ему управление. Но как это сделать?

Если хотите можно и так предположить потерю производительности, время доступа к озу например пусть 20 нс, значит 3 такта внешней шины на это уйдёт, 1 такт предустановка, 1 такт выборка и 1 такт удержание. Может и два такта получиться но точно не один. Плюс четыре внутренних такта шины AHB от одного обращения до другого. И того 6-7 тактов. При частоте 144 МГц максимально получите от 20 до 30 МГц частоту работу ядра. Выполнять лучше из внутреннего ОЗУ, хотя и там потеря будет но уже в 4 раза то есть из 144 МГц получите 36 МГц может чуть больше.

Форум.


Настраиваю 22 канал DMA, запрос "TIM3_DMA_REQ1", разрешаю запросы от таймера 3 по событию захвату на 1 канале TIMER3→DMA_RE = 0x20, однако запросы на исполнение цикла DMA не генерируются.

Запросы к DMA могут выставляться от таймеров, каналы DMA 10-13, при этом за настройку данных запросов к DMA выступает регистр TIMERx→DMA_RE, либо запросы могут выставляться индивидуально от каналов таймеров, каналы DMA 14-29 (таблица 395 - Распределение каналов DMA), при этом за настройку запросов к DMA от канала "y" таймера "x" выступает регистр TIMERx→DMA_REy. В Вашем случае Вы настраиваете 22 канал DMA, что соответствует запросу "TIM3_DMA_REQ1", поэтому для разрешения запроса "TIM3_DMA_REQ1" к DMA по событию захвата на канале 1 Вам необходимо записать в регистр TIMER3→DMA_RE1 = 0x20;. По сути, регистры TIMERx→DMA_REy настраивают соответствующий запрос к DMA "TIMx_DMA_REQy".


Исполняю код из ОЗУ. При наличии прерываний в программе, микроконтроллер сваливается в HardFault

Подобная ситуация связана с тем, что в микроконтроллерах 1986ВЕ1Т и 1986ВЕ3Т таблица векторов расположена с адресов 0x0. Обращаться из ОЗУ по этим адресам нельзя, почему и происходит сбой. Решений можно предложить несколько:

1. Загрузить программу во Flash-память, в которой описать функции-подпрограммы обработки прерываний, например, для Timer 1 это может выглядеть так: void TIMER1_IRQHandler(void). Эта функция описана в файле startup_MDR1986VE1T.s. А уже внутри этой функции (TIMER1_IRQHandler) должен вызываться реальный обработчик прерываний, расположенный в памяти ОЗУ.

Пример:

  • В программе для ОЗУ функция с обработкой прерывания называется void UART1_Handler()
  • Код программы для Flash следующий:
 
#include <MDR32F9Qx_port.h>
#include <MDR32F9Qx_rst_clk.h>
#define HWREG(x)            (*((volatile uint32_t *)(x))) // Макрос для считывания значения по определенному адресу
void UART1_IRQHandler(void);



int main()
{
	NVIC_EnableIRQ(UART1_IRQn); //Enable UART1 interrupt
	while(1)
	{
		UART1_IRQHandler();
	}
}


//--- UART1 interrupt routine ---
void UART1_IRQHandler()
{
  int A;
  A = HWREG(0x20100058); // Занести в переменную А значение памяти по адресу 0x20100058 (UART_Hundler), чтобы корректно прыгнуть в обработчик прерывания в программе ОЗУ
  typedef void (*funcptr)();
  funcptr funcInRAM = (funcptr) (A);
  funcInRAM();	// сам "прыжок"
}

2. Обработчики прерываний находятся в ОЗУ, а во Flash-памяти в таблице векторов прерываний указаны верные адреса этих обработчиков. Тогда при возникновении прерывания процессор обратится к таблице во Flash память, в которой возьмёт адрес обработчика прерывания, расположенного в ОЗУ.

Пример:

Если рассматривать также UART1_IRQHandler(), то можно написать для этого обработчика адрес в файле startup.s в программе для Flash, тогда не нужно производить никаких прыжков.

doc/mk/1986be1t/faq.txt · Последнее изменение: 2022/04/03 23:09 (внешнее изменение)