Мигаем светодиодом
От теории плавно переходим к практике, и сейчас я покажу как мигать светодиодом на отадочной плате STM32F1-Discovery.
Первое, что понадобится – это реализация пауз. Для простоты реализации выполнена она будет тупым циклом, например, вот так:
{
uint32_t i;
for (i=0; i< pause; i++) {};
}
Второе – генератор тактовых импульсов в stm32 со своими приколами. Если в AVR порты ввода/вывода тактируются по-умолчанию, то в stm32 их требуется включить принудительно. Думаю, не стоит обьянять, что если этого не сделать, то хоть конец света – светодиод не зажгется. Включение тактирование производится установкой соответствующих битов в регистрах APB1ENR и APB2ENR .
Что касается светодиода: их на отладочной плате stm32 аж два! Синий и зеленый, подключены соответственно к РС8 и РС9. Мигать будем синим.
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 МГц
Итак, что мы имеем:
Мигаем!
{ //blink
GPIOC->BSRR |= GPIO_BSRR_BS8; //установкой соответствующего бита зажигаем светодиод
Delay(1000000); //Пауза
GPIOC->BRR |= GPIO_BRR_BR8; //установкой соответствующего бита тушим светодиод
Delay(1000000); //Пауза
}
На самом деле это лишь один из вариантов включения /выключения светодиодов. Второй выглядит следющим образом:
{ //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 прилагается.
Вот пожалуй и все.