Здравствуйте!
Попалось как то в сети мнение то как бы действительно сначала мы создаём переменную GPIO_InitStructure, через которую производим необходимые настройки и уже после, одной операцией записываем эти настройки GPIO_Init(GPIOE, &GPIO_InitStructure);
Собственно говоря может правильнее в таком случае без SPL писать так:
Создадим переменную uint32_t SET_GPIO;
Или менее наглядно, но короче Или все эти страшилки не обоснованы и можно не обращать на это внимание?
Попалось как то в сети мнение
Если посмотреть на код инициализации с помощью библиотеки SPL:Если CRH/CRL настраивать не сразу, а постепенно, путем последовательного включения/выключения бит, мы получим на выходе разные режимы работы пина, а это чревато. За это время можно что-нибудь «поджарить», так как обычно в этом случае не отслеживается, в каких именно промежуточных режимах оказывается порт.
Код: Выделить всё
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);Собственно говоря может правильнее в таком случае без 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;
