Вот настройка порта А:
CODE
//=============================================================================
// GPIOA configuration
//=============================================================================
// enable GPIOA clock
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// Alternate Function
//GPIOA->MODER = 0; // clear moder register
GPIOA->MODER |=
(
GPIO_MODER_MODER15_0 | // General Purpose Output, SPI3_NSS
GPIO_MODER_MODER4_0 | // General Purpose Output, SPI1_NSS
GPIO_MODER_MODER5_1 | // Alternate Function, SPI1_SCK
GPIO_MODER_MODER6_1 | // Alternate Function, SPI1_MISO
GPIO_MODER_MODER7_1 | // Alternate Function, SPI1_MOSI
GPIO_MODER_MODER9_0 | // General Purpose Output
GPIO_MODER_MODER11_0 // General Purpose Output
);
// Output type
//GPIOA->OTYPER = 0x0; // clear OTYPER register
//GPIOA->OTYPER |= 0; // Push-Pull
// Speed type
//GPIOA->OSPEEDR = 0; // clear OSPEEDR register
GPIOA->OSPEEDR |=
(
GPIO_OSPEEDER_OSPEEDR15 | // SPI3_NSS 100MHz
GPIO_OSPEEDER_OSPEEDR4 | // SPI1 NSS, 100MHz
GPIO_OSPEEDER_OSPEEDR5 | // SPI1 SCK, 100MHz
GPIO_OSPEEDER_OSPEEDR6 | // SPI1 MISO 100MHz
GPIO_OSPEEDER_OSPEEDR7 // SPI1 MOSI 100MHz
//GPIO_OSPEEDER_OSPEEDR9 | // 100MHz
//GPIO_OSPEEDER_OSPEEDR10 | // 100MHz
//GPIO_OSPEEDER_OSPEEDR11 | // 100MHz
//GPIO_OSPEEDER_OSPEEDR12 // 100MHz
);
// Push/Pull
//GPIOA->PUPDR = 0; // clear PUPDR register
GPIOA->PUPDR |=
(
GPIO_PUPDR_PUPDR15_0 | // pull-up, NSS,SPI3
GPIO_PUPDR_PUPDR4_0 | // Pull-Up, NSS,SPI1
GPIO_PUPDR_PUPDR10_0 | // Pull-Up
GPIO_PUPDR_PUPDR9_1 | // Pull-Down
GPIO_PUPDR_PUPDR11_1 | // Pull-Down
GPIO_PUPDR_PUPDR12_0 // Pull-Up
);
// Alternate Function pins
GPIOA->AFR[1] = 0; // clear AFR_H register
GPIOA->AFR[0] = 0; // clear AFR_L register
GPIOA->AFR[0] |=
(
//(5 << ((4 - 0) << 2)) | // SPI1 NSS, AF5
(5 << ((5 - 0) << 2)) | // SPI1 SCK, AF5
(5 << ((6 - 0) << 2)) | // SPI1 MISO, AF5
(5 << ((7 - 0) << 2)) // SPI1 MOSI, AF5
);
А вот тут я выставляю 1 на пин, потом после нажатия кнопки выставляю 0 (пробовал разными методами, BSRRL/BSRRH тоже):
Код
GPIOA->ODR |= GPIO_ODR_ODR_9; // PA9 HIGH
GPIOA->ODR |= GPIO_ODR_ODR_11; // PA11 HIGH
// wait for CTRL_BUTTON1 press
while ( !(((GPIOB->IDR) & GPIO_IDR_IDR_12) == RESET) );
GPIOA->ODR &= !GPIO_ODR_ODR_9; // PA9 LOW
GPIOA->ODR &= !GPIO_ODR_ODR_11; // PA11 LOW
Так вот пин9 в начале 3.3В, проверяю вольтметром, после нажатия кнопки он 0.
А вот пин11 всегда на уровне 3.3В.
Оба пина (9 и 11) имеют одинаковую разводку на плате, и последовательное сопротивление примерно 90 Ом между пином чипа и пином на плате куда подключается вольтметр (т.е. последовательно подключен и резистор).
Почему пин 11 зависает всегда на 3.3В а Пин 9 работает нормально?
как всегда пины перепутал, работает все короче.