Настройка портов GPIO

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 728
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

Здравствуйте!
Попалось как то в сети мнение
Если CRH/CRL настраивать не сразу, а постепенно, путем последовательного включения/выключения бит, мы получим на выходе разные режимы работы пина, а это чревато. За это время можно что-нибудь «поджарить», так как обычно в этом случае не отслеживается, в каких именно промежуточных режимах оказывается порт.
Если посмотреть на код инициализации с помощью библиотеки SPL:

Код: Выделить всё

  GPIO_InitTypeDef GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
то как бы действительно сначала мы создаём переменную GPIO_InitStructure, через которую производим необходимые настройки и уже после, одной операцией записываем эти настройки GPIO_Init(GPIOE, &GPIO_InitStructure);
Собственно говоря может правильнее в таком случае без SPL писать так:
Создадим переменную uint32_t SET_GPIO;

Код: Выделить всё

  SET_GPIO &= ~GPIO_CRL_CNF7;
  SET_GPIO |=  GPIO_CRL_MODE7 | GPIO_CRL_CNF7_1;   //выход AF_PP, 50MHz
  GPIOE->CRL = SET_GPIO;
  SET_GPIO  &= ~GPIO_CRH_CNF;                       //очистить разряды CNF
  SET_GPIO |=  GPIO_CRH_MODE;                      //выход, 50MHz
  SET_GPIO |=(GPIO_CRH_CNF8_1|GPIO_CRH_CNF9_1|GPIO_CRH_CNF10_1|GPIO_CRH_CNF11_1 
                  | GPIO_CRH_CNF12_1|GPIO_CRH_CNF13_1|GPIO_CRH_CNF14_1|GPIO_CRH_CNF15_1);
  GPIOE->CRH = SET_GPIO;
Или менее наглядно, но короче

Код: Выделить всё

GPIOE->CRL = 0xB4444444;
GPIOE->CRH = 0xBBBBBBBB;
Или все эти страшилки не обоснованы и можно не обращать на это внимание?
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Проблема и решение высосаны из пальца... Начните сначала... с запуска МК... Все чувствительные и критические к состоянию порта цепи должны быть приведены в соответствие внешними подтяжками... Дальше всё настраивается в соответствии с логикой программы... Надеяться на то, что МК во время запуска успеет правильно инициализировать мост с токами в несколько ампер как минимум глупо... причины могут быть разными...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Ответить

Вернуться в «ARM»