MyTetra Share
Делитесь знаниями!
Как освободить ножки PB3, PB4, PA15 на STM32 BluePill через CMSIS
Время создания: 11.10.2022 15:40
Текстовые метки: stm32, bluepill, CMSIS, ножки, порт, PB3, PB4, PA15, освободить, JTAG, AFIO
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/1665492004pi2bp3es78/text.html на raw.github.com

При разработке под микроконтроллер STM32F103C8T6 (и ему подобные) можно наткнуться на ситуацию, что некоторые ножки не настраиватются на режим ввода/вывода и не работают как положено. Обычно это касается ножек, на которые разведен JTAG. По-умолчанию все ножки не подключены к дополнительному оборудованию, а вот JTAG-овые сконфигурированы на работу JTAG, чтобы была доступна отладка.


Если отладка по JTAG ненужна, например когда прошивание и отладка делается по SWD-разъему, то эти ножки можно переконфигурировать в обычные порты ввода-вывода. Обычно это ножки PB3, PB4, PA15.


В интернете на профильных форумах говорится, что для "освобождения" ножек PB3, PB4, PA15 нужно настроить бит SWJ_CFG регистра AFIO_MAPR для отключения JTAG. Т. е. оставить только порт отладки SWD для отладки кода. И нужно не забыть включить тактирование AFIO в регистре RCC. Если используется библиотека CMSIS, то код может быть следующий:



// Отключение JTAG для освобождения PB3, PB4, PA15

AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;


// Дополнительная настройка для освобождения PA15

// (среди прочих выставляется RCC_APB2ENR_AFIOEN)

RCC->APB2ENR = RCC_APB2ENR_USART1EN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_SPI1EN \

| RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN | RCC_APB2ENR_AFIOEN \

| RCC_APB2ENR_IOPDEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPBEN \

| RCC_APB2ENR_IOPAEN;



Если еще точнее, то такой код инициализации точно работает:



    // Включение тактирования портов GPIOA, GPIOB, GPIOC
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

    // Конфигурирование AFIO, чтобы работали ножки PB3, PB4, PA15
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // Разрешение тактирования AFIO для PA15
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // Отключение JTAG



Начинают работать все три проблеммные ножки: PB3, PB4, PA15.


Оказывается, очень сильно влияет последовательность инициализации. Вначале надо разрешать тактирование AFIO, и только потом отключать JTAG. В другой последовательности ничего не настроится.


Так же в этом разделе:
 
MyTetra Share v.0.62
Яндекс индекс цитирования