Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-ноя-24 03:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: 2016-апр-20 01:03 
Не в сети

Зарегистрирован: 2016-апр-06 19:38
Сообщения: 4
При разработке изделия я столкнулся со следующей проблемой. В разрабатываемом устройстве мне необходимо использовать порт D на вывод и при этом загружать рабочую программу из FLASH памяти. Но при установке битов MODE[2:0] в состояние 000 вывод PD4 все время находится в состоянии 1. Директивы #define USE_JTAG_A #define USE_JTAG_B в файле MDR32F9Qx_config.h я закоментировал. В 6 и 7 биты регистра MDR_BKP->REG_0E прописываю 0.
Подскажите пожалуйста как переконфигурировать функции порта D с использования JTAG на обычные порты ввода/вывода.
Да, порт B в моей схеме тоже используется, поэтому загрузка с MODE[2:0] 001 не подходит.
Пишу данные командой MDR_PORTD->RXTX=DATA;
Микросхема К1986ВЕ92QI


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-20 12:22 
Не в сети

Зарегистрирован: 2014-авг-11 19:26
Сообщения: 111
Ну вроде бы вполне ясно написано, что в 000 режиме будет работать JTAG. А что бы он не работал - надо выбрать другие режимы, последние два не подходят для постоянной работы, а один без использования JTAG работает с внешней памятью только....
Вложение:
Снимок.PNG
Снимок.PNG [ 136.85 КБ | Просмотров: 3729 ]

_________________
https://adelectronics.ru
Заходи, не стесняйся! ;)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-20 18:38 
Не в сети

Зарегистрирован: 2016-апр-06 19:38
Сообщения: 4
Это я понял. В том то вопрос и заключался как можно переконфигурировать порты, чтобы отключить сигнал TDO. Если конечно это возможно. Запись PORTD=DATA; компилятором (Keil v5.18) не воспринимается, а при записи в порт через регистр RXTX как я понял происходит логическое ИЛИ с сигналом TDO, который поддерживает вывод в 1.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-20 19:13 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 229
1 висит возможно из-за того, что включена подтяжка внутри порта вывода к VCC (регистр MDR_PORTD->PULL).

Порт D для вывода TDO можно настроить так:
Код:
#define PORT_JTAG_Msk 0x001F

#define JB_TDO_Pos 4
#define JB_TDO_Msk (1<<4)

#define   RST_CLK_PER_CLOCK_PCLK_EN_PORTD_Msk   (1<<24)
#define   PORT_FUNC_MODE_Msk   3
#define   PORT_PWR_Msk   3

MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_PCLK_EN_PORTD_Msk;

MDR_PORTD->ANALOG |= JB_TDO_Msk;
MDR_PORTD->FUNC &= ~(PORT_FUNC_MODE_Msk<<JB_TDO_Pos*2);
MDR_PORTD->OE |= JB_TDO_Msk;
MDR_PORTD->PWR |= (PORT_PWR_Msk<<JB_TDO_Pos*2);
MDR_PORTD->PULL &= ~((1<<JB_TDO_Pos)|(1<<(JB_TDO_Pos+PORT_PULL_UP_Pos)));
MDR_PORTD->PD &= ~JB_TDO_Msk;


Из-за того, что JTAG совмещён c выводами с GPIO и альтернативными функциями, необходимо специальным образом устанавливать и сбрасывать выводы, сначала считывая весь порт, иначе отладка через среду проектирования будеть выключаться на какой-то инструкции:
Код:
// Установка бита JB_TDO
PORTD->RXTX = JB_TDO_Msk | (PORTD->RXTX & (~PORT_JTAG_Msk));
// Сброс бита JB_TDO
PORTD->RXTX &= ~(JB_TDO_Msk | PORT_JTAG_Msk);

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-20 20:25 
Не в сети

Зарегистрирован: 2016-апр-06 19:38
Сообщения: 4
R Max спасибо. Завтра попробую.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-21 15:43 
Не в сети

Зарегистрирован: 2016-апр-06 19:38
Сообщения: 4
Спасибо всем, кто попытался помочь. Моя ошибка была в том, что я перед записью в 6 и 7 биты регистра MDR_BKP->REG_0E "0" не включил тактирование регистра MDR_BKP. Проблема решилась просто включением тактирования регистра BKP в MDR_RST_CLK->PER_CLOCK (27 бит).
После этого инструкции типа MDR_PORTD->RXTX = DATA; работают корректно.
Для наступивших на те-же грабли:
1 включаем тактирование регистра BKP (1 в 27-й бит MDR_RST_CLK->PER_CLOCK)
2 запрещаем не нужный в данный момент JTAG ("0" в 6 или 7 бит MDR_BKP->REG_0E)
3 порт, совмещенный с JTAG работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-июл-21 10:22 
Не в сети

Зарегистрирован: 2016-фев-26 09:54
Сообщения: 22
Скажите пожалуйста, можно ли использовать ножки портов, совмещенные с незадействованным выводом активного JTAG, если используется двухпроводной интерфейс SWD. Т.е. в SWD используются TMS и TCK, можно ли при этом использовать для своих нужд выводы JRST, JTDO, JTDI? Стандартные библиотеки, естественно, не используем.

Имеется частично успешный опыт такого использования выводов на микроконтроллере STM32F103 - там проблема возникла только с выводом JTDI (не переключался в режим выхода).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-июл-21 13:43 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 445
Есть успешный опыт использования TDO как выхода :). И даже TMS, TCK как входов, с прошивкой по SWD


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-авг-01 20:45 
Не в сети

Зарегистрирован: 2013-апр-23 20:56
Сообщения: 10
ЧумА писал(а):
Есть успешный опыт использования TDO как выхода :). И даже TMS, TCK как входов, с прошивкой по SWD

А отладке это не мешает? У меня JTAG "отваливается" при записи в регистр RXTX, при этом в качестве выходов настроены пины не относящиеся к JTAG. Может подскажете как это обойти на 1986ВЕ9х?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-авг-02 08:45 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 445
Цитата:
У меня JTAG "отваливается" при записи в регистр RXTX, при этом в качестве выходов настроены пины не относящиеся к JTAG.

Тема стара как форум :). Для нормальной работы отладчика завести тень порта, все манипуляции по записи в порт выполнять с тенью, затем копировать тень в порт. Пример:
shadow &= ~(1 << clr_bit);
shadow |= 1 << set_bit;
PORT = shadow;
Разряды задействованные в JTAG/SWD в "тени" не использовать.
P.S. В SPL это, вроде, как-то учтено.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-апр-28 17:22 
Не в сети

Зарегистрирован: 2015-июн-24 11:07
Сообщения: 3
В ножки JTAG нельзя писать единицы, при записи в порт всегда делайте маску и сбрасывайте все биты JTAG в ноль:

void port_pin_clr(int port_base_addr, int pin_num)
{
uint32_t* port = (uint32_t*)port_base_addr;
#ifdef JTAG_B
if(port_base_addr == MDR_PORTD_BASE) *port = ~((1 << pin_num) | JTAG) & *port;
#else
if(port_base_addr == MDR_PORTB_BASE) *port = ~((1 << pin_num) | JTAG) & *port;
#endif
else *port &= ~(1 << pin_num);
}

void port_pin_set(int port_base_addr, int pin_num)
{
uint32_t* port = (uint32_t*)port_base_addr;
#ifdef JTAG_B
if(port_base_addr == MDR_PORTD_BASE) *port = (1 << pin_num) | *port & ~JTAG;
#else
if(port_base_addr == MDR_PORTB_BASE) *port = (1 << pin_num) | *port & ~JTAG;
#endif
else *port |= 1 << pin_num;
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB