Линии ввода-вывода [STM32, Часть 3]

9 Сентября 2012 К комментариям

В прошлый раз не получилось восстановить старую запись полностью (Базовый шаблон [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]

Указываем место где будет располагаться наш проект.

Далее давим кнопочку и переходим к текущему рабочему пространству:

Качаем проект с примером.

Архив нужно распаковать в любую папку.

Создаем проект:

Задаем имя проекта и указываем каталог с исходниками:

Исходники будут добавлены в проект и автоматически собраны:


Базовые проекты:



comments powered by Disqus