Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PB4 и JTAG в STM32F100RB
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
greenhorn
Добрый день!

Хочу использовать 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.
Уточню что моя задача больше разобраться и научиться программировать, иначе ногу можно было бы просто взять другую.

Спасибо.
greenhorn
Погуглив нашел ошибки, исправил:

Код
void GPIOB_init (void)    {
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    GPIOB->CRL    = 0x22222222;
    GPIOB->CRH  = 0x22222222;
    GPIOB->LCKR = 0x0;
    return;
}


Заработало, в SWJ_CFG значение некорректное очевидно по тому что он write-only, но непонятно почему именно 0x78
некто
Попробуйте выключать бит TRACE_IOEN в регистре DBG сразу после старта программы
zöner
посмотрите на исходник функции GPIO_PinRemapConfig в станд.библ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.