Как освободить PB3, PB4 и PA15 на STM32F103?
Обновлено Редакция GAW
После сброса STM32F103 включает полный отладочный порт SWJ: и JTAG, и SWD. Под JTAG заняты пять выводов — PA13, PA14, PA15, PB3 и PB4. Пока они в этом режиме, запись в регистры GPIO на PA15, PB3 и PB4 ничего не даёт, и светодиод или кнопка на них «не работают».
| SWJ_CFG | Режим отладки | PA13, PA14 | PA15 | PB3 | PB4 |
|---|---|---|---|---|---|
| 000 (после сброса) | JTAG + SWD | отладка | JTDI | JTDO | NJTRST |
| 001 | JTAG + SWD без NJTRST | отладка | JTDI | JTDO | свободен |
| 010 | только SWD | отладка | свободен | свободен* | свободен |
| 100 | отладка выключена | свободны | свободен | свободен | свободен |
* PB3 освобождается, только если не используется асинхронная трассировка SWO.
Как отключить JTAG
- Включите тактирование AFIO битом AFIOEN в RCC_APB2ENR — без него AFIO_MAPR недоступен.
- Запишите в AFIO_MAPR значение с SWJ_CFG = 010, сохранив остальные биты переназначения.
- Настройте PA15, PB3 и PB4 как обычные выводы.
Значение 010 — правильный выбор почти всегда: ST-LINK подключается по SWD всего двумя проводами, и отладка сохраняется. Генератор кода инициализации STM32 делает это автоматически.
Особенности после сброса
По RM0008 до переключения PA15 и PB4 подтянуты вверх, а PA14 — вниз. Если на эти выводы подключены внешние цепи, учитывайте эти уровни до того, как программа переключит выводы.
Как подключить ST-LINK по SWD, показано на странице распиновка JTAG и SWD, режимы выводов — на странице GPIO STM32, а что делать, если отладчик перестал подключаться, — в ответе «Почему ST-LINK перестал подключаться к STM32 после прошивки?».
Похожие вопросы
Можно ли отключить и SWD, чтобы освободить PA13 и PA14?
Можно, значением 100 в SWJ_CFG, но тогда ST-LINK не подключится к работающей программе. Восстановить доступ можно подключением под сбросом или запуском с BOOT0 = 1 — см. ответ про потерю связи с ST-LINK.
Почему запись в SWJ_CFG не действует?
Чаще всего не включено тактирование AFIO: по RM0008 без бита AFIOEN регистр AFIO_MAPR недоступен. Кроме того, поле SWJ_CFG только для записи, поэтому меняют весь регистр, не полагаясь на прочитанное значение этих битов.
Что будет с PB3, если включена трассировка SWO?
PB3 — это вывод JTDO/TRACESWO. По примечанию к табл. 37 RM0008 он освобождается только тогда, когда асинхронная трассировка не используется.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — разд. 9.1.1 — после сброса выводы JTAG во входном режиме с подтяжкой: PA15 (JTDI) и PA13 (JTMS) и PB4 (NJTRST) — вверх, PA14 (JTCK) — вниз; разд. 9.3.5, табл. 37 — SWJ_CFG = 000 полный SWJ (состояние после сброса), 001 — без NJTRST (освобождается PB4), 010 — JTAG-DP выключен, SW-DP включён (свободны PA15, PB3, PB4; PB3 — только без асинхронной трассировки), 100 — выключены оба (свободны и PA13, PA14); разд. 9.4.2 — биты SWJ_CFG[2:0] регистра AFIO_MAPR только для записи, при чтении значение не определено; для доступа к AFIO_MAPR должно быть включено тактирование AFIO (бит AFIOEN)
- STMicroelectronics. DS5319 Rev 20. STM32F103x8, STM32F103xB datasheet — разд. 2.3.24 — порт отладки SWJ-DP объединяет JTAG и SW-DP; табл. 5 — PA13/JTMS-SWDIO, PA14/JTCK-SWCLK, PA15/JTDI, PB3/JTDO, PB4/NJTRST — функции выводов после сброса
Нашли ошибку?
Смотрите также
- JTAG и SWDARM JTAG 20, Cortex Debug 10, STDC14, ST-LINK
- Генератор кода инициализации STM32Тактирование, USART, таймер и GPIO → код на CMSIS, LL или HAL
- GPIO STM32Режимы выводов, регистры F1 и F4, BSRR, AF, скорость, токи, 5 В, код
- Почему ST-LINK перестал подключаться к STM32 после прошивки?Программа заняла SWD или ушла в сон — подключаться под сбросом