Как отключить JTAG? |
![]() |
Добавил(а) microsin |
У микроконтроллеров AVR интерфейс JTAG по умолчанию включен (у тех AVR, у которых JTAG есть на выводах корпуса). При этом выводы JTAG совмещены с портами ввода/вывода, и при разрешенном JTAG нет возможности их использовать. Теряется целых 4 порта GPIO, соответствующих сигналам TMS, TCK, TDI и TDO интерфейса JTAG. Как отключить JTAG, чтобы можно было воспользоваться дополнительными портами ввода/вывода? Для этого есть 2 способа: изменить значение фьюза JTAGEN, и изменить значение бита JTD регистра MCUCR. [Фьюз JTAGEN] По умолчанию фьюз JTAGEN запрограммирован, т. е. находится в лог. 0. Это соответствует состоянию, когда JTAG разрешен, и воспользоваться портами ввода/вывода, привязанными к сигналам JTAG, нельзя. Если перевести бит JTAGEN в незапрограммированное состояние (лог. 1), то интерфейс JTAG отключается, и можно программно управлять состоянием его портов ввода/вывода. Изменить состояние фьзов можно только с помощью программатора ISP или JTAG. Имейте в виду, что если Вы переведете JTAGEN в незапрограммированное состояние с помощью JTAG, то в результате JTAG отключится, и Вы потеряете управление чипом. По этой причине способ отключения JTAG с помощью фьюзов мне не нравится. [Бит JTD регистра MCUCR] Есть еще одна возможность отключить JTAG: программный. Бит JTD регистра MCUCR управляет рабочим состоянием JTAG. Аббревиатура JTD названия бита соответствует сокращению от JTAG Disable. Когда бит JTD в состоянии лог. 0 (это состояние по умолчанию после включения питания и сброса), интерфейс JTAG разрешен (конечно при условии, что запрограммирован фьюз JTAGEN, о чем мы уже говорили). Если бит JTD в состоянии лог. 1, то интерфейс JTAG запрещен. В запрещенном состоянии освобождаются порты ввода/вывода, привязанные к сигналам JTAG. Для того, чтобы избежать случайного разрешения или запрещения JTAG, существует специальная процедура модификации бита JTD. Программа должна дважды записать бит JTD в нужное значение в интервале времени 4 тактов ядра, чтобы реально поменялось значение бита JTD. Пример кода, который запрещает JTAG: MCUCR = (1<<JTD); MCUCR = (1<<JTD); Имейте в виду, что не следует менять значение бита JTD, когда Вы применяете встроенную систему отладки микроконтроллера (On-Chip Debug, OCD). |