About STM32

Мигаем светодиодом

От теории плавно переходим к практике, и сейчас я покажу как мигать светодиодом на отадочной плате STM32F1-Discovery.

    Первое, что понадобится – это реализация пауз. Для простоты реализации выполнена она будет тупым циклом, например, вот так:

void Delay(uint32_t pause) //все предельно просто и думаю,что в комментариях не нуждается
{
    uint32_t i;
    for (i=0; i< pause; i++) {};
}
 

    Второе – генератор тактовых импульсов в stm32 со своими приколами. Если в AVR порты ввода/вывода тактируются по-умолчанию, то в stm32 их требуется включить принудительно. Думаю, не стоит обьянять, что если этого не сделать, то хоть конец света – светодиод не зажгется. Включение тактирование производится установкой соответствующих битов в регистрах APB1ENR и APB2ENR .

    Что касается светодиода: их на отладочной плате stm32 аж два! Синий и зеленый, подключены соответственно к РС8 и РС9. Мигать будем синим.

//RCC
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;        //разрешаем тактирование порта С
    //PINS
    //LEDS
    //blue
GPIOC-> CRH &= ~GPIO_CRH_CNF8;   //обнуляем биты CNF1 и CNF0, т.е. конфигурирум пин на вывод в двухтактный режим работы
GPIOC->CRH |= GPIO_CRH_MODE8_1;  //устанавливаем бит MODE0, т.е. устанавливаем частоту работы пина в 2 МГц
    //green
GPIOC->CRH &= ~GPIO_CRH_CNF9;   //обнуляем биты CNF1 и CNF0, т.е. конфигурирум пин на вывод в двухтактный режим работы
GPIOC->CRH |= GPIO_CRH_MODE9_1;   //устанавливаем бит MODE0, т.е. устанавливаем частоту работы пина в 2 МГц

            Итак, что мы имеем:

  • Примитивную функцию задержки.
  • Затактированный порт С.
  • Настроенный в соответствующий режим работы 9-й пин порта С.

  •  

    Мигаем!

     
    while (1)           //бесконечный цикл
    {            //blink
    GPIOC->BSRR |= GPIO_BSRR_BS8;            //установкой соответствующего бита зажигаем светодиод
    Delay(1000000);             //Пауза
    GPIOC->BRR |= GPIO_BRR_BR8;  //установкой соответствующего бита тушим светодиод
    Delay(1000000);               //Пауза
    }

        

        На самом деле это лишь один из вариантов включения /выключения светодиодов. Второй выглядит следющим образом:

    while (1)           //бесконечный цикл
    {            //blink
    GPIOC->ODR |= GPIO_ODR_ODR8;            //установкой соответствующего бита зажигаем светодиод
    Delay(1000000);             //Пауза
    GPIOC->ODR &= ~GPIO_ODR_ODR8;       //установкой соответствующего бита тушим светодиод
    Delay(1000000);               //Пауза
    }

          Я являюсь человеком ленивым и поэтому всегда стараюсь получить качественный результат прилагая минимум усилий. У Вас тотчас может возникнуть вопрос, о который разбиваются все аргументы: «И чё?» И правда, ведь количество строк кода одинаковое, светодиод как мигал – так и мигает. В чем прикол?. Ответ кроется в используемых регистрах, а точнее в алгоритмах их работы.

        Используя регистр ODR  (output data register) контроллер работает по алгоритму: чтение состояния порта -> модификация -> запись нового состония порта.

        А при использовании регистров BSRR (bit set/reset register) и BRR (bit reset registe) контроллер берет и тупо устанавливает или сбрасыват бит, невзирая на предыдущее состояние порта.

         Выигрыш не существенен, всего несколько ассемблерных команд, но он есть.

         Архив с проектом в Keil прилагается.

          migaem_svetodiodom.rar

        Вот пожалуй и все.

     
    Хостинг от uCoz