Линии ввода-вывода [STM32, Часть 3]
В прошлый раз не получилось восстановить старую запись полностью (Базовый шаблон [STM32, Часть 2]), но это и к лучшему.
Так как я попробовал в работе новые платы (STM32F0-Discovery и STM32F4-Discovery), а следовательно как я и обещал в конце статьи получим четыре базовых проекта.
Сразу прошу меня извинить за возможные ошибки в проектах и если таковые будут напишите мне.
Базовый проект
В первую очередь необходимо скачать стандартную библиотеку (Standard Peripherals Library Drivers) под выбранное семейство, я скачал все четыре:
- STM32L1xx Standard Peripherals Library Drivers
- STM32F0xx Standard Peripherals Library Drivers
- STM32F1xx Standard Peripherals Library Drivers
- STM32F4xx Standard Peripherals Library Drivers
Для простоты рассмотрим один проект для STM32F0.
Из библиотеки я взял следующие файлы:
- stm32_flash.ld - сценарий для компоновщика (решил и его взять готовый)
- startup_stm32f0xx.s - начальная инициализация
- stm32f0xx.h - заголовочный файл с описанием периферии микроконтроллера
- core_cm0.h, core_cmFunc.h, core_cmInstr.h - файлы с описанием ядра (cortex-M0)
- stm32f0_stdperiph_lib - файлы самой библиотеки
Для проверки работоспособности кода используем простую программу:
void main(void)
{
while(1)
{
if(PIN_SIGNAL(PIN_BUTTON))
{
PIN_ON(PIN_LED);
}
else
{
PIN_OFF(PIN_LED);
}
}
}
Действия которой сводятся к включению светодиода при нажатии кнопки.
(На каждой из четырех плат имеется как минимум один светодиод и два кнопки: одна для сброса микроконтроллера, состояние другой можно контролировать из программы)
Как видно из кода выше, для работы с линиями ввода-вывода я не использую библиотечные функции, так как они очень не оптимальны. А использую свои макросы.
Они содержат базовый функционал необходимый для работы.
Перед использованием линии ввода-вывода необходимо сделать объявление:
#define PIN_LED C, 9, HIGH, MODE_OUTPUT_PUSH_PULL, SPEED_2MHZ
Примечание:
литера порта [A, B, C …] |
номер линии [0-15] |
активный уровень [HIGH, LOW] |
режим работы (согласно документации) ANALOGINPUT_FLOATING INPUT_PULL_DOWN INPUT_PULL_UP GENERAL_OUTPUT_OPEN_DRAIN GENERAL_OUTPUT_PUSH_PULL ALTERNATE_OUTPUT_OPEN_DRAIN ALTERNATE_OUTPUT_PUSH_PULL |
максимальная частота работы линии SPEED_2MHZSPEED_10MHZ SPEED_50MHZ |
и перед использованием настроить линию:
PIN_CONFIGURATION(LED_GREEN);
Раньше я включал тактирование линии при настройке, однако мне это показалось не удобным и теперь я включаю тактирование сразу для всех используемых портов.
Внимание! Для каждого семейства используются свои макросы, в виду различий в реализации модуля GPIO.
В коде инициализации (файл startup_stm32f0xx.s) вызывается внешняя функция SystemInit, реализация которой представлена в файле system_stm32f0xx.с.
Решил не использовать её и написал вот такой код:
//------------------------------------------------------------------------------
void SystemInit(void)
{
clock();
gpio();
}
Т.е. сразу после кода инициализации (startup_stm32f0xx.s) и перед передачей управления основному коду (main), вызывается функция SystemInit.
Внутри которой настраивается татирование линий ввода-вывода:
//------------------------------------------------------------------------------
inline static void clock(void)
{
// включение тактирования необходимых модулей
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD, ENABLE);
}
и сами линии:
//------------------------------------------------------------------------------
inline static void gpio(void)
{
// светодиод
PIN_CONFIGURATION(PIN_LED);
// кнопка
PIN_CONFIGURATION(PIN_BUTTON);
}
Для полноты картины структура проекта:
[caption id=”attachment_81” align=”aligncenter” width=”244”] Структура проекта[/caption]
Сборку проекта можно сделать из командной строки, а можно как я использовать Eclipse.
Eclipse – в качестве редактора кода
Скачиваем сам Eclipse c офф сайта www.eclipse.org.
Установки он не требует, необходимо только распаковать скаченный архив.
После запуска нам предлагают выбрать рабочее пространство:
[caption id=”attachment_86” align=”aligncenter” width=”686”] Выбор рабочего пространства[/caption]
Указываем место где будет располагаться наш проект.
Далее давим кнопочку и переходим к текущему рабочему пространству:
Качаем проект с примером.
Архив нужно распаковать в любую папку.
Создаем проект:
Задаем имя проекта и указываем каталог с исходниками:
Исходники будут добавлены в проект и автоматически собраны:
Базовые проекты:
- STM32L1-Discovery - 2012-09-09-stm32l1-demo
- STM32F0-Discovery - 2012-09-09-stm32f0-demo
- STM32F1-Discovery - 2012-09-09-stm32f1-demo
- STM32F4-Discovery - 2012-09-09-stm32f4-demo
comments powered by Disqus