STM32 Blink: изучение нескольких методов мигания светодиода

В этой статье блога мы рассмотрим различные способы мигания светодиода с помощью микроконтроллера STM32. Мигание светодиода — фундаментальная задача при разработке встроенных систем, и понимание различных подходов может помочь расширить ваши знания и улучшить навыки разработки встроенного ПО. Мы рассмотрим несколько методов, приведем примеры кода для каждого и обсудим их плюсы и минусы. Давайте начнем!

Метод 1: опрос GPIO
Самый простой способ мигания светодиодом — опрос GPIO. Этот метод включает в себя переключение состояния контакта GPIO, подключенного к светодиоду в цикле. Вот пример использования библиотеки HAL STM32:

#include "stm32f4xx.h"
int main(void) {
    // Enable GPIO clock
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    // Configure GPIO pin as output
    GPIOA->MODER |= GPIO_MODER_MODER5_0;
    while (1) {
        // Toggle LED state
        GPIOA->ODR ^= GPIO_ODR_ODR_5;
        // Delay
        for (int i = 0; i < 1000000; i++);
    }
}

Метод 2: Прерывание по таймеру
Использование прерывания по таймеру позволяет более точно контролировать частоту мигания. Вот пример использования Таймера 2 и прерываний:

#include "stm32f4xx.h"
void TIM2_IRQHandler(void) {
    // Clear interrupt flag
    TIM2->SR &= ~TIM_SR_UIF;
    // Toggle LED state
    GPIOA->ODR ^= GPIO_ODR_ODR_5;
}
int main(void) {
    // Enable GPIO and Timer 2 clocks
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    // Configure GPIO pin as output
    GPIOA->MODER |= GPIO_MODER_MODER5_0;
    // Configure Timer 2
    TIM2->PSC = 15999;  // Prescaler value for 1ms
    TIM2->ARR = 999;    // Auto-reload value for 1s
    TIM2->DIER |= TIM_DIER_UIE;  // Enable update interrupt
    TIM2->CR1 |= TIM_CR1_CEN;    // Enable Timer 2
    // Enable Timer 2 interrupt
    NVIC_EnableIRQ(TIM2_IRQn);
    while (1) {
        // Main loop
    }
}

Метод 3: режимы низкого энергопотребления
В сценариях, где энергоэффективность имеет решающее значение, использование режимов низкого энергопотребления может оказаться полезным. Микроконтроллер может переходить в спящий режим и периодически просыпаться для переключения состояния светодиода. Вот пример использования режима СТОП:

#include "stm32f4xx.h"
void SysTick_Handler(void) {
    // Toggle LED state
    GPIOA->ODR ^= GPIO_ODR_ODR_5;
}
int main(void) {
    // Enable GPIO clock
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    // Configure GPIO pin as output
    GPIOA->MODER |= GPIO_MODER_MODER5_0;
    // Configure SysTick for 1s interval
    SysTick_Config(SystemCoreClock / 1000);
    while (1) {
        // Enter STOP mode
        PWR->CR |= PWR_CR_PDDS;
        SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
        __WFI();
        // Wake up here after every 1s interval
    }
}

В этой статье мы рассмотрели три различных способа мигания светодиода с помощью микроконтроллера STM32. Мы рассмотрели опрос GPIO, прерывания по таймеру и режимы пониженного энергопотребления. Каждый метод имеет свои преимущества и применим в конкретных сценариях. Понимая эти различные методы, вы сможете улучшить свои навыки разработки встроенного ПО и адаптировать реализацию мигания светодиодами в соответствии с конкретными требованиями.