Добрый день!
Хочу использовать GPIOB (в частности PB4) как push-pull out, но PB4 по умолчанию используется под NJRST.
У меня отладочная плата STM32 Value Line Discovery, встроенный отладчик использует только SWD, соответственно пытаюсь отключить JTAG, оставив только SWD и освободив тем самым PB4:
Код
void GPIOB_init (void) {
AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE; //отключаю JTAG, согласно таблице 29 из RM0041 PB3 и PB4 должны освободиться
RCC->APB2ENR = RCC_APB2ENR_IOPBEN; //включаю GPIOB
GPIOB->CRL = 0x22222222; //настраиваю GPIOB0-7 на push-pull out
GPIOB->CRH = 0x22222222; //настраиваю GPIOB8-15 на push-pull out
GPIOB->LCKR = 0x0; //снимаю локи - знаю что после ресета итак 0, но чтоб наверняка
return;
}
В результате на PB4 постоянно 3V и ни на что не реагирует, остальные линии (использую PB4-PB9) работают нормально. Как я понял JTAG по какой-то причине не отключается.
После взгляда на AFIO в Keil а режиме отладчика понимаю еще меньше:
Как в SWJ_CFG может быть 0x78 если это всего 3 бита? Что значит это значение (по умолчанию должно бть 0 как я понимаю)? Почему не меняется (пробовал явно 0x02000000 вместо AFIO_MAPR_SWJ_CFG_JTAGDISABLE - безрезультатно)?
В RM0041 в пункте 25.4.4 стр 646 есть такя строка "To use the serial wire DP to release some GPIOs, the user software must set SWJ_CFG=010 just after reset. This releases PA15, PB3 and PB4 which now become available as GPIOs."
Это какраз то чего я и пытаюсь добиться, но не совсем понимаю что значит "сразу после ресета", есть жеж еще стандартный стартап код (startup_stm32f10x_md_vl.s и system_stm32f10x.c), разобраться в котором у меня пока не хватает знаний.
Подскажите пожалуйста как ПРАВИЛЬНО освободить PB4 для GPIO.
Уточню что моя задача больше разобраться и научиться программировать, иначе ногу можно было бы просто взять другую.
Спасибо.