В который раз о портах совмещенных с JTAG. STM32

Не работает PB3 на stm32f103? Тогда мы идём к вам. Расскажу как не наступить на эти грабли.

У меня была одна из заметок про подобную тему, но то был контроллер Миландр. На этот раз его собрат от компании STMicroelectronics - stm32f103rc. Необходимо было задетвовать ножки порта PB3, PB4 и PB5 - на них висит SPI1, с помощью которого планировалось управлять переферийной микросхемой.

Проблемы кроются в деталях. Оказалось, что запустить SPI, так и не получится, косяк в разводке - перепутаны дата и клок, выкрутимся "ногодрыгом", но это другая история.

То, что ноги совмещены с JTAG означает, что нужно сделать ремап, то есть отключить функцию JTAG для этих выводов. Что и было сделано и вроде всё должно работать как часики.

Если интересно, то отключение с помощью SPL делается так:

RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable, ENABLE );

C помощью CMSIS вот так:

AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;

Самое интересное началось после. Получилось так, что все необходимые выводы кроме PB3 функционируют нормально, а он всё время находится в состоянии логической единицы (3,3 В на выводе).

В голову полезли мысли, что процессу мешает SWD интерфейс, ведь этот вывод не что иное как SWO сигнал. Но в мануале на чип ясно сказано, что не должен мешать если не используется асинхронная трассировка, а она действительно не используется. Вот настройки ST-Link в Keil:

настройки ST-Link trace

Прикол в том, что даже если трассировака выключена, отладчик все равно задействует этот канал. Что бы наверняка издавиться от этой проблемы нужно включить трассировку и поснимать галочки в поле ITM Stimusus Ports, или что намного проще в поле Enable ввести значение 0x0 и затем снова отключить трассировку.

настройки ST-Link trace после отключения трасировки полностью

Как бы это не было парадоксально, но это работает. По крайней мере с ST-Link это именно так.