пятница, 18 апреля 2014 г.

Квадрокоптер. Часть 1. CooCox, STM

Всем привет. Мы продолжаем свой цикл публикаций о постройке квадрокоптера. В прошлой статье мы рассказали о подготовке проекта, поиске о заказе необходимых деталей.

Платы нам пришли, детали из Китая идут полным ходом (надеюсь, идут туда, куда, нужно), пора писать новую статью. В этой статье – начальное описание платы STM32f3discovery,  установка необходимого ПО для работы с STM32F3discovery, и первая программа – для перемигивания огоньков.


STM32 – что это?

(Информация ниже представляет собой перевод страницы официального сайта, пользовательского руководства и других документов. Ставим ©. 4-copter.blogspot.ru – скажем нет плагиату!)

Официальная информация.

STM32f3discovery включает в себя все необходимое для начинающих и опытных пользователей, позволяя не тратить время на ненужные распайку и подключение и решительно приступить к работе.
Построенная на основе STM32F303VCT6, плата включает в себя встроенный инструмент отладки ST-LINK/V2, акселерометр, гироскоп, электронный компас ST MEMS, USB-разъем, светодиоды и кнопки.



Полезные документы -  user manual (схемы подключения, архитектура), programming manual (как и что программировать), reference manual, datasheet на чип stm32f303vc

В нашем проекте понадобятся

  • трехосевой MEMS-гироскоп с цифровым выходом L3GD20;
  • МЭМС e-Compass с трехосевым акселерометром и трехосевым магнитным датчиком LSM303DLHC.

CooCox

Мы пользуемся средой программирования CocCox, скачать здесь (напрямую) или здесь (через CoCenter).

Дополнительно надо скачать и установить драйвер ST-LINK/V2.
Еще дополнительно - GCC  (о да!).

Среда довольно приятная, есть много удобных фич, упрощающих нашу заполненную стрессами жизнь.

Испортим дефолтную прошивку. 

Попробуем написать первую прогу. Пусть светодиоды завораживающе загораются.
Открываем CoIDE, идем Project -> New Project.

Придумываем имя проекта. Жмем далее
Здесь мастер предложит выбрать, под что будет создаваться программа - под конкретную плату или под чип. В случае с STM32f3discovery - выбираем chip. Далее.

 Выбираем ST->STM32F303->STM32F303VC. Финиш.

Подключаем необходимые библиотеки - библиотеки работы с периферией RCC, библиотека работы с портами GPIO, остальные нужные библиотеки подключатся сами.
На плате есть светодиоды LD1 - LD10. LD1 и LD2 - системные, а LD3-LD10 можно помигать.

На этом рисунке - в нижней части в белом круге.
Они как бы подсоединены к выводам платы (которые по бокам), на discovery-плате это реализовано внутрисхемно.
Так, надо узнать - к каким выводам.
Лезем в user manual. Ищем подпункт LED's и видим:

Т.е, LED'ы подцеплены к порту E на выводы 8-15. Отлично.

Открываем main.c  и пишем такой код:


//подключаем библиотеки 
#include "stm32f30x_gpio.h" 
#include "stm32f30x_rcc.h" 
#include "stm32f30x.h" 

#define DELAY_TIME       1000000 

//Инициализация светодиодов (настройка порта на вывод информации) 
void initGPIOE() 
{  
    GPIO_InitTypeDef gpio; //структура для инициализации порта 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);  //включаем тактирование 
    //заполняем структуру  
    gpio.GPIO_Mode = GPIO_Mode_OUT; 
    gpio.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_10 |  GPIO_Pin_15 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_8; 
    //инициализируем порт 
    GPIO_Init(GPIOE, &gpio); 
} 
 
//Функция задержки времени 
void simpleDelay(unsigned int delayTime) 
{ 
       unsigned int i;   
       for (i = 0; i < delayTime; i++); 
} 
 
 
int main(void) 
{ 
 initGPIOE(); 
 
    while(1) 
    { 
      GPIO_SetBits(GPIOE, GPIO_Pin_9);    //посылаем на вывод 1 - светодиод загорается 
      simpleDelay(DELAY_TIME);            //ждем 
      GPIO_SetBits(GPIOE, GPIO_Pin_10);   //загорается следующий 
      simpleDelay(DELAY_TIME); 
      GPIO_SetBits(GPIOE, GPIO_Pin_11); 
      simpleDelay(DELAY_TIME); 
      GPIO_SetBits(GPIOE, GPIO_Pin_12); 
      simpleDelay(DELAY_TIME); 
      GPIO_SetBits(GPIOE, GPIO_Pin_13); 
      simpleDelay(DELAY_TIME); 
      GPIO_SetBits(GPIOE, GPIO_Pin_14); 
      simpleDelay(DELAY_TIME); 
      GPIO_SetBits(GPIOE, GPIO_Pin_15); 
      simpleDelay(DELAY_TIME); 
      GPIO_SetBits(GPIOE, GPIO_Pin_8); 
      simpleDelay(DELAY_TIME); 
      GPIO_ResetBits(GPIOE, GPIO_Pin_9  | GPIO_Pin_10 |
                            GPIO_Pin_11 | GPIO_Pin_12 | 
                            GPIO_Pin_13 | GPIO_Pin_14 | 
                            GPIO_Pin_15 | GPIO_Pin_8);  //сбрасываем выводы - диоды гаснут 
   }
}  
Описание функций можно найти в библиотеках GPIO и RCC.
Должно заработать. Все, пока. В следующий раз - подключение акселерометра-компаса-гироскопа.

Комментариев нет:

Отправить комментарий