Управление 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 (она также не увеличит размер кода даже на один байт).
Я не буду проверять ваши магические смещения и числа.
- Ошибка первая: после включения периферийных часов нужно подождать. Это описано в Справочном руководстве. Вы не ждете, и ваша первая операция МОДЕР не даст никакого эффекта. Макросы 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