Как я уже говорил раньше, микроконтроллеры это маленькие компьютеры очень часто лишенные привычных средств вывода. Для изучения программирования контроллеров нужно забыть вывод на экран, ввод с клавиатуры и файловые операции. Остается голое железо - Bare Metall Hello world на МК это зажигание светодиода. Поэтому и займемся этим. Кто хочет обсуждать программирование под MinGW, CygWin визуалы и прочу хрень - пожалуйста в свои темы. Здесь будем людей учить делать первые шаги на контроллерах, а точнее на плате дискавери.
Я очень не люблю объяснять банальные вещи, особенно по сто раз. Поэтому один раз буду все описывать. А потом думаю буду только в трудных местах появляться. Советчиков по программированию у нас как я вижу много, поэтому мне будет легче.
Для программирования МК в среде разработки требуется настроить проект, достать и настроить нужные библиотеки и все собрать в кучу. Это все неинтересно, отправил Вальтеру уже собранный архив, заточенный под его плату. В нем уже можно будет работать.
Итак первая программа - включение светодиодов на плате. Их там аж 2 штуки и прицеплены они на порт G на 13,14-ю ножки. Можно включить любой из них, или оба.
В пустом проекте уже есть процедура main в нее добавим следующий код:
Код: Выделить всё
GPIO_InitTypeDef GPIO_InitStructure; //пустая структура настройки порта
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); //включим тактирование порта GPIOG
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOG, &GPIO_InitStructure); //эта процедура, на основании заполненной выше структуры, настраивает нужные выводы требуемого порта.
GPIOG->ODR |= GPIO_Pin_14;
Все аппаратные устройства в кортексах отключаемые, что сделано в целях оптимизации энергопотребления контроллера. По умолчанию все выключено и требует включения,а потом настройки. Когда какой-то аппаратный блок выключен, тогда на него не подается тактовая частота. Включение тактирования устройства, собственно включает все его внутренние узлы, таким образом устройство начинает потреблять некоторую часть энергии и почти готово к работе. Процедура RCC_AHB1PeriphClockCmd() включает тактирование нужного нам порта.
Дальше требуется настроить конкретные ножки порта на работу в нужном нам режиме. Настройку можно делать по разному, хоть напрямую лазя в регистры устройства. Но мы воспользуемся стандартным принятым способом, который разработали до нас и предоставили его для упрощения жизни. Это структуры инициализации и процедуры настройки устройств, берущие информацию из полей структур инициализации.
В программе заполняются 5 полей структуры инициализации порта, указываются ножки которые настраиваем, режим работы, скорость порта и подтяжку резисторами к одной из шин питания. Затем командой GPIO_Init собственно и настраивается на работу, конкретный нужный нам порт. Это GPIOG. До этого момента у нас были только настроечные телодвижения. А вот теперь порт готов к выводу в него информации.
Строка: GPIOG->ODR |= GPIO_Pin_14; собственно и выводит на 14-ю ножку порта G 1-цу, так как к этой ножке подключен светодиод, то появление лог единицы на ножке, приводит к подаче на диод напряжения 3.3В и светодиод загорается. В нашем конкретном случае красным цветом.
Финальный вариант кода проекта выглядит так:
Теперь остается только нашему Вальтеру все попробовать.
Да, Игорь, или Рома, пожалуйста создайте новую ветку "Проекты на МК" в уголке самодельщика. А то в Разное не очень хорошо отправлять эту тему.