Управление GPIO STM32F3 без библиотек Cube MX

Я адаптирую этот загрузчик для STM32F373CC к своему устройству. Чтобы указать, что устройство работает, но находится в режиме загрузчика, я хотел бы включить некоторые светодиоды состояния. Однако этот загрузчик не использует библиотеки STM Cube MX, поэтому мне приходится кодировать его на низком уровне. Заголовочный файл stm32f373xc.h включен, поэтому я могу использовать такие выражения, как GPIOB_BASE.

Сначала я попробовал следующее в main(), но, к сожалению, это не сработало:

      // turn on GPIOB clock: SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOBEN);
uint32_t* rcc = (uint32_t*)RCC_BASE;
*(rcc+0x14) |= RCC_AHBENR_GPIOBEN;  // AHBENR is at offset 0x14

// configure Port B, pins 4 and 5 to GPIO, Open Drain, low.
uint32_t* gpiob = (uint32_t*)GPIOB_BASE;
*(gpiob) |= 0x500; // GPIO output mode --- GPIOB_MODER = 0x500; (bits 11:8 = 0101), offset 0
*(gpiob) &= ~0xA00;
*(gpiob+0x04) |= 0x30;   // output type open drain --- GPIOB_OTYPER = 0x30; (bits 5:4 = 11), offset 0x04
*(gpiob+0x0c) &= ~0xF00; // pull up/down off --- GPIOB_PUPDR = 0x0; (bits 11:8 = 0000), offset 0x0c
*(gpiob+0x14) &= ~0x30;  // output low --- GPIOB_ODR = 0x0; (bits 5:4 = 00), offset 0x14

Есть идеи, что мне не хватает? Как я могу узнать, связана ли проблема с синхронизацией порта B или конфигурацией контактов?

Я нашел этот похожий пост , но для первого ответа требуется вся CMSIS, а для второго ответа нет комментариев, поэтому я не совсем понимаю, что они делают.

1 ответ

Надеюсь, вы знаете, что выходы с открытым стоком требуют подтягивания (внутреннего или внешнего)

Используйте определения CMSIS, а не магические числа и операции.

требуется вся CMSIS

А в чем проблема? CMSIS не добавляет накладных расходов к вашему коду, только удобные определения и встроенные функции, которые не изменяют размер кода, если они не используются.

Кроме того, в HAL есть очень удобные макросы, которые можно использовать, даже если вы не используете саму библиотеку HAL (она также не увеличит размер кода даже на один байт).

Я не буду проверять ваши магические смещения и числа.

  1. Ошибка первая: после включения периферийных часов нужно подождать. Это описано в Справочном руководстве. Вы не ждете, и ваша первая операция МОДЕР не даст никакого эффекта. Макросы HAL считывают регистр, чтобы убедиться, что операция завершена.

Пример из STM32L4:

      #define __HAL_RCC_GPIOB_CLK_ENABLE()           do { \
                                                 __IO uint32_t tmpreg; \
                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN); \
                                                 /* Delay after an RCC peripheral clock enabling */ \
                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN); \
                                                 UNUSED(tmpreg); \
                                               } while(0)

Затем используйте определения типов и определения регистров CMSIS.

      #define PIN4    4
#define PIN5    5

GPIOB -> MODER &= ~((0b11 << (2 * PIN5)) | (0b11 << (2 * PIN4)));  
GPIOB -> MODER |= ((0b01 << (2 * PIN5)) | (0b01 << (2 * PIN4)));  
GPIOB -> OTYPER &= ~((1 << PIN4) | (1 << PIN5));
GPIOB -> OTYPER |= (1 << PIN4) | (1 << PIN5);
GPIOB -> BSRR = (1 << (PIN4 + 16)) | (1 << (PIN5 + 16));  // set the pins low
Другие вопросы по тегам