Регистр режима GPIO

Я привел пример из Вот для платы STM3240G-EVAL, чтобы мигать светодиоды 3 и 4. У меня она работает, но меня смущает настройка регистра режима:

GPIOG->MODER |= (GPIO_MODER_MODER6_0 | GPIO_MODER_MODER8_0) ;

Когда я читаю справочное руководство (p186), он утверждает, что режим должен быть установлен на 01 для вывода, но установка его на 0 таким образом работает просто отлично. В идеале я хотел бы иметь возможность перейти на другие режимы, но я бы предположил, что приведенный выше код изменил бы выводы 6 и 8 порта G на входные контакты. Я должен что-то упустить.

Вот мой полный основной документ на случай, если он уместен:

#include "stm32f4xx.h"
/* We will use PG6 and PG8 connected to LEDs 1 and 2 because they're the same port. */
/* Find base register value for Port G                                              */void delay (int a);

int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f0xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f0xx.c file
*/

/* GPIOG Periph clock enable */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN;

GPIOG->MODER |= (GPIO_MODER_MODER6_0 | GPIO_MODER_MODER8_0) ;
/* Configure PG6 and PG8 in output  mode  */

GPIOG->OTYPER &= ~(GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_8) ;
// Ensure push pull mode selected--default

GPIOG->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR6|GPIO_OSPEEDER_OSPEEDR8);
//Ensure maximum speed setting (even though it is unnecessary)

GPIOG->PUPDR &= ~(GPIO_PUPDR_PUPDR6|GPIO_PUPDR_PUPDR8);
//Ensure all pull up pull down resistors are disabled

while (1)
{
/* Set PG6 and PG8 */
/* the bit set/reset low register SETS the output data register     */
/* the bit set/reset high register RESETS the output data register  */

GPIOG -> BSRRL = (1 << 6);
GPIOG -> BSRRL = (1 << 8);
delay(500000);
/* Reset PC8 and PC9 */
GPIOG -> BSRRH = (1 << 6);
GPIOG -> BSRRH = (1 << 8);
delay(500000);
}

return 0;
}

void delay (int a)
{
volatile int i,j;

for (i=0 ; i < a ; i++)
{
j++;
}

return;
}

0

Решение

Вы не устанавливаете его на ноль, вы устанавливаете его на единицу.

Определение GPIO_MODER_MODER6_0 константа 0x00001000, Маска для GPIO_MODER_MODER6 биты это 0x00003000кладешь биты 01 в нужное место.

Если постоянная GPIO_MODER_MODER6_0 были определены как ноль, то «или» внесение его в регистр конфигурации не будет иметь никакого эффекта в любом случае. Чтобы установить оба бита на ноль, вам нужно сделать что-то вроде:

GPIOG->MODER &= ~(GPIO_MODER_MODER6_0 | GPIO_MODER_MODER6_1);

_0 а также _1 суффиксы относятся к битовым номерам для маскировки, а не к записываемым значениям.

1

Другие решения


По вопросам рекламы [email protected]