реклама на сайте
подробности

 
 
> PB4 и JTAG в STM32F100RB, Похоже не могу отключить JTAG
greenhorn
сообщение Mar 4 2012, 14:20
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-01-12
Пользователь №: 69 728



Добрый день!

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

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
greenhorn
сообщение Mar 4 2012, 15:39
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-01-12
Пользователь №: 69 728



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

Код
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
Go to the top of the page
 
+Quote Post
некто
сообщение Mar 4 2012, 16:25
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 24-10-07
Пользователь №: 31 674



Попробуйте выключать бит TRACE_IOEN в регистре DBG сразу после старта программы
Go to the top of the page
 
+Quote Post
zöner
сообщение Mar 4 2012, 19:42
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299



посмотрите на исходник функции GPIO_PinRemapConfig в станд.библ.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016