Высказывания и цитаты:

В час суровой беды, испытав верность друга познаешь,
Цену друга познаешь, когда на совсем потеряешь.
Тимур Муцураев

  • 27Дек

    Доброго дня! В предыдущих моих статьях по микроконтроллерам STM32 я ничего не говорил об аппаратной части, а только о программной, касающейся больше языка СИ, показав возможности этого типа микроконтроллеров в работе с графическим дисплеем.

    Сейчас мы приступим к созданию проекта с нуля. Итак, среди большого выбора микроконтроллеров семейства STM32 мы выбрали тот, который популярен, недорог и является достаточно мощным — пусть будет все тот же STM32F103VCT6. Чтобы работать с ним нам нужны два мануала  STM32F103VCT6-STMicroelectronics.pdf (2Mb)    и    STM32 Reference manuals.pdf (10Mb). В Reference manual дается общее описание для семейства STM32 F101,F102,F103,F105,F107 — а именно, то, что имеет общее устройство и общие принципы работы. В  STM32F103VCT6-STMicroelectronics.pdf даны распиновка разных типов корпусов, адресация модулей и памяти — то есть то, что имеет частные отличия от основного описания.

    Итак скачиваем оба мануала, открываем тот, который 2Mb и смотрим Pinouts. STM32F103VCT6 выпускается в трех корпусах (64pin, 100pin, 144pin). Пусть мы будем использовать контроллер с платы HY-MINI STM32, то есть на 100 вывод0в,

    100pin

    Хочу обратить внимание, что распиновка у микроконтроллеров STM32 F101 — F107 одинаковая. Переходим к выбору среды разработки. В настоящее время среди наиболее популярных сред есть Keil, IAR и CooCox IDE. Первые две платные, а третья абсолютно бесплатна и это значит, что есть смысл начать именно с нее. Но забегу вперед. Если вы займетесь отладкой устройств на данных типах микроконтроллеров, то тут безусловный лидер Keil (о нем я немного рассказал в предыдущих уроках). А с точки зрения удобства для тех, кто только начал изучать STM32 здесь я отдаю предпочтение CooCox IDE.

    И так, если вы решили пользоваться Keil: будем считать, что он установлен на вашем компьютере (как это сделать сказано в предыдущих уроках). Создаем папку, в которой будет располагаться наш проект,  назовем ее My_project или как сами хотите. Потом нам потребуется библиотека с описанием ядра и других периферийных модулей Libraries.rar. Эта библиотека подходит для всех микроконтроллеров типа STM32F10X, так что вам не составит труда выбрать другой тип микроконтроллера. Скачиваем её и разархивируем в папку My_project.  Этого набора достаточно для того, чтобы начать писать свой проект с использованием названий, которые используются в datasheet на микроконтроллер. Без них каждому регистру, биту, пришлось бы прописывать свой адрес (об этом позже). Это было бы познавательно с точки зрения изучения, но совсем неудобно для работы, так как отнимало бы кучу времени. Благо это сделали за нас и нам достаточно будет просто их использовать.

    Скачаем еще один архив User.rar и разархивируем в папку My_project. В нем есть файл настройки частоты тактирования system_stm32f10x.c. У микроконтроллера нет фьюзов, к которым мы привыкли у PIC и AVR, поэтому первоначально микроконтроллер запускается на внутреннем RC генераторе 8Мгц. После он налету переключает настройки, в данном файле происходит настройка на частоту 72Мгц. В разархивированной папке User есть также файл stm32f10x_conf.h, который необходим для подключения тех самых модулей из Libraries, которую скачали выше. Рекомендую скачать этот архив, а потом редактировать файлы…

    Создаем третью папку в My_project под названием MDK-ARM.

    Я придерживаюсь стандартной иерархии папок, то есть в папке проекта создаю три другие папки:  User, MDK-ARM и Libraries. Папку Libraries никогда не трогаю, в User хранятся все собственные файлы и дополнительные наши библиотеки, в MDK-ARM — файлы проекта, здесь же и все его дополнительные файлы, появляющиеся по ходу компиляции. Это очень удобно, и у Вас никогда не будет путаницы. Советую сделать так (пример можете посмотреть из предыдущего урока по STM32).

    И запускаем среду разработки Keil. Выбираем из меню Project вкладку New uVision Project. Появляется окно CreateNewProject. Вводим имя и сохраняем в MDK-ARM. Далее открывается полный список микроконтроллеров — здесь производители Samsung, Cypress, Atmel, Actel, Analog Devices и другие, что не может не радовать, потому что все эти микроконтроллеры разных производителей принадлежат одному семейству ARM. Выбираем наш STMicroelectonics и там STM32F103VC. Потом среда предлагает скопировать файл startup, с которого запускается проект, соглашаемся. В окне Project отображается дерево проекта, сейчас там только файл startup. Нажимаем правой кнопкой наTarget 1 и выбираем Add Group, там создаем User. Опять нажимаем правой кнопкой на Target 1 и выбираем Manage Components. Здесь мы можем переименовать Target 1 на другое осознанное имя — какое больше нравится. На списке Groups отображается наша User. Группы мы можем удалить, переименовать, добавить новые. Создаем еще группу StdPeriph_Driver. Названия могут быть любые, просто я назвал так как называются папки. Нам сейчас надо добавить файлы в каждую группу. Сделаем это как у меня на картинке. target2

    А в группу StdPeriph_Driver добавляем все файлы из My_project\Libraries\STM32F10x_StdPeriph_Driver\src. Добавлять можно и проще в окне Project дважды щелкнув левой кнопкой мыши на нужной нам группе и выбрав сразу много файлов. Хочу обратить внимание: добавление файлов в окно Project равнозначно действию директивы #include «file».

    Если вам надо создать файл, то открываем обычным способом папку User, там нажимаем правой кнопкой мыши создать файл txt, переименовываем его и его расширение на xxx.c (обратите внимание чтобы у вас показывались расширения файлов), потом возвращаемся в Keil и добавляем указанный файл. Жмем на меню Project ->Options for Target, переходим на Output, ставим галочку Create Hex File, иначе он не будет генерироваться. Переходим на C/C++, ставим галочку на One ELF Section per Function и в Incluse Path подключаем все папки нашего проекта, иначе компилятор не будет знать где искать — нажимаем на кнопке многоточие. Получается вот так way3

    Жмем OK. Теперь на вкладке Debug надо настроить отладчик. Если Вы оставите как есть, то в процессе отладки он будет ждать ответа в нашей функции  SystemInit() и зависнет и могут возникнуть проблемы с заливкой, поэтому настраиваем так

    Debug2

    С настройками проекта закончено. Открываем файл main.c из группы User. Этот файл и является основным файлом проекта, в нем то мы и начинаем писать текст. Здесь подключен уже заголовочный файл #include «stm32f10x.h». Функция main() содержит только SystemInit(), которую можно убрать если хотите (перестройка частоты на 72 Мгц от внешнего кварца). Жмем Project->Build Target. Если вы все сделали правильно, то проект откомпилируется — выдаст: 0Errors; если нет — то проверяйте заново, возможно что-то не добавили.

    Теперь откройте файл stm32f10x_conf.h из группы User. В нем должны быть не закомментированы следующие строки

    #include «stm32f10x_gpio.h» // для работы с портами ввода-вывода
    #include «stm32f10x_rcc.h» // для работы с системой тактирования

    Далее создаем функцию void Setup_pin(void) {} выше главной функции main, в ней включим тактирование порта, как это сделать можно посмотреть в файле stm32f10x_rcc.h:

    rcc
    (строки 691-693).

    Для тактирования порта D добавляем строку: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE); //

    После настраиваем выводы. Здесь очень странная особенность — объявлять структуру нужно в самом верху функции, поэтому нам пришлось создать новую функцию Setup_pin() (иначе компилятор выдаст ошибку), поэтому функцию Setup_pin() вызываем из main() после SystemInit().

    В файле stm32f10x_gpio.h смотрим структуру настройки выводов (строки 90-100)

    gpio

    Объявляем GPIO_Struct1 структурой типа GPIO_InitTypeDef:

    GPIO_InitTypeDef GPIO_Struct1;

    У каждого вывода есть следующие параметры, такие как скорость

    speed

    тип вывода

    type

    номер вывода

    pins

    Из вышеприведенного пишем

    GPIO_Struct1.GPIO_Pin=GPIO_Pin_1; // то есть PORTD.1
    GPIO_Struct1.GPIO_Speed=GPIO_Speed_2MHz; // работает со скоростью 2 Мгц. Чем больше скорость тем больше расход тока
    GPIO_Struct1.GPIO_Mode=GPIO_Mode_Out_PP; // на выход с подтягиванием к нулю или напряжению питания
    GPIO_Init(GPIOD , &GPIO_Struct1); // инициализация выше написанного

    Из того же файла stm32f10x_gpio.h  функции работы с портами  func_pinМигание реализуем в функции while (1), чтобы оно было бесконечно

    GPIO_SetBits(GPIOD, GPIO_Pin_1); // установить бит
    Delay(500000); // задержка, иначе мигание мы не увидим
    GPIO_ResetBits(GPIOD, GPIO_Pin_1); // сбросить бит
    Delay(500000); // 500 тысяч тактов

    Чтобы работала функция Delay(), ее надо создать
    void Delay(int i) {for (; i != 0; i—);} и разместить выше функции main().

    В итоге должно получиться вот так и откомпилироваться.
    Result1

    Как видим очень много того, на что терять время и не стоило — обычно берется шаблон какой-нибудь программы и переделывается. Для тех у кого не получилось, можете скачать архив после проделывания всех этих махинаций My_project.rar.

     


     

    Теперь вернемся к CooCox IDE.Скачиваем среду разработки отсюда CooCox IDE. Нажимаем на Download through CoCenter (Recommend). Вводим адрес эл.почты любой даже не ваш. В первой строчке, где написано CooCox CoIDE нажимаем Download. Весит более 400Мб. Как скачается, устанавливаем.
    Потом ищем gcc компилятор. Справа в колонке Download скачиваем файл ***.exe и устанавливаем. Открываем программу CooCox CoIDE, на меню Project выбираем вкладку Select Toolchain Path. Указываем путь к файлу arm-none-eabi-gcc.exe (по-умолчанию ищем его в Program Files\GNU Tools ARM Embedded\4.9 2014q4\bin). Всё — мы установили среду CooCox IDE.

    Теперь повторим то же что мы сделали в Keil.

    Как только запускаем CooCox открывается страница Welcome. На ней выбираем Browse in Repository. Потом ST. Потом свой микроконтроллер STM32F103VC и у нас открывается список подключаемых библиотек

    components

    Как мы видим, такого удобного подключения библиотек в Keil просто нет, там все библиотеки мы подключаем вручную!!! Я думаю, что вы это попробовали выше.

    Для нашей первой программы понадобится: CMSIS core, CMSIS Boot, RCC, GPIO.  CMSIS core и CMSIS Boot — системные, подключить обязательно. RCC — для работы с системой тактирования, GPIO — для работы с портами ввода-вывода.

    Потом из меню View->Configuration на вкладке Debugger выбираем адаптер. Программного отладчика здесь нет, чего нельзя сказать о Keil, а вот это большой недостаток CooCox!!!! Надеемся, когда-нибудь они его исправят. Из аппаратных отладчиков я рекомендую St-link, так он самый популярный и его можно использовать в среде Keil или вообще отдельно от среды разработки — с утилитой STM32 ST-LINK utility для заливки/сливки прошивки.

    В окне Project открываем файл main.c, в начале которого добавляем строки

    #include «stm32f10x_gpio.h»
    #include «stm32f10x_rcc.h»

    Как и в примере для Keil размещаем функццию задержки

    void Delay(int i) {for (; i != 0; i—);}

    Настраивать частоту мы здесь не будем, поэтому настройку портов пишем сразу в функции main(). Вообще файлы на си взаимозаменяемы. И можете файлы оттуда разместить здесь, а из этой среды туда. Скорее, даже не потребуются изменения. Вот что у нас получается

    res_coo

    Еще обе среды разработки чувствительны к регистру — если поменять заглавную на строчную, то при компиляции появится ошибка.


    Всего Вам доброго.

     

1 комментарий

WP_Cloudy
  • steroids anabolic buy пишет:

    […] Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online Buy Steroids Online […]

Ваш ответ

Внимание: Модератор оставляет за собой право редактировать или удалять комментарии.

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: