вторник, 3 марта 2020 г.

LedBlink (stm32f103-bluepill, iar)

Пинаут платы "bluepill" на базе микроконтроллера stm32f103c8:


В отладочной плате есть два светодиода, один из которых показывает наличие питания, другой доступен для управления с gpio-пина PC13:


Проект будем делать на ide iar 7.5 kickstarter edition. Для описания периферии понадобятся файлы из подпроекта CMSIS, которые можно взять, например, из библиотеки STM32F10x standard peripheral library или из проекта STM32VLDISCOVERY firmware package, или STM32CubeF1.

1. Создадим проект при помощи мастера в iar в соответствии с 1.

Вся следующая информация есть в datasheet'е на проц. Используемый проц stm32f103c8 имеет 64Kb флеш-памяти, ROM (память для размещения программы) и 20Kb SRAM (оперативная память). Начала областей: ROM - 0x0800 0000, RAM - 0x2000 0000. В настройки линковщика можем прописать следующие границы областей памяти:

ROM: 0x0800 0000 + (64 * 1024) — 1 = 0x0800 FFFF
RAM: 0x2000 0000 + (20 * 1024) — 1 = 0x2000 4FFF
intvec start: 0x0800 0000

Файлы CMSIS возьмем из упомянутого проекта stm32f10x standart peripheral library. Я предпочитаю скопировать всю папку Libraries из указанного проекта в свой проект, а потом включить нужные файлы в компиляцию.

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport\core_cm3.c

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport\core_cm3.h

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.h

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar\startup_stm32f10x_hd_vl.s

В начале файла stm32f10x.h надо раскАментить дефайн, соответствующий используемому контроллеру. Для нас это #define STM32F10X_MD_VL, так как stm32f103c8 относится к Medium density value line devices.

Компилируем пустой main в iar 7.3 и получаем ошибку "declaration is incompatible with "__nounwind __interwork __softfp unsigned long __get_PSP(void) core_cm3.h".

Надо удалить файлы из проекта и совсем core_cm3.c, core_cm3.h и подключить в настройках проекта использование встроенной в IAR библиотеки CMSIS  "General Options"-"Library Configuration"-"Use CMSIS". Тогда все соберется. Подробности здесь.

2. Напишем прогу, которая будет включать/выключать выходной gpio-пин PC13. В настройках проекта надо добавить в "С/С++ Compiler"-"Preprocessor"-"Additional include directories" путь к папке проекта "." для того, чтобы компилятор нашел, где лежит файл stm32f10x.h.

Регистры RCC_APB2ENR_IOPCEN для включения тактирования GPIOC:

Верхний регистр GPIOC_CRH, в котором выставляется состояние пина GPIOC13 (устанавливаем биты  CNF13 в режим 00: Push-Pull, MODE13 в режим 01: Output mode, max speed 10 MHz.):


Конкретное переключение выходного уровня на GPIOC13 делаем через регистр GPIOC_ODR:

#include "stm32f10x.h"

void main(void)
{
  unsigned long d;
  
  //Enabling clock for GPIOC
  RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
  //Configuring GPIO13 as push-pull output
  //refer to datasheet for details
  GPIOC->CRH&=~GPIO_CRH_CNF13_0;
  GPIOC->CRH&=~GPIO_CRH_CNF13_1;
  GPIOC->CRH&=~GPIO_CRH_MODE13_0;
  GPIOC->CRH|=GPIO_CRH_MODE13_1;
  
  while (1)
  { 
    //switching the LEDs
    if (GPIOC->ODR & GPIO_ODR_ODR13)
    {
      GPIOC->ODR&=~GPIO_ODR_ODR13;
    }
    else
    {
      GPIOC->ODR|=GPIO_ODR_ODR13;
    }
    //simple delay
    for (d=0; d<1000000UL; ++d);
  }
}

Подробнее о регистрах в этой статье.

Официальные мануалы:
1) datasheet на STM32F103x8 STM32F103xB
https://www.st.com/resource/en/datasheet/stm32f103c8.pdf
2) reference manual на STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx https://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf
3) user manual на STM32VLDISCOVERY (отладочная плата с микроконтроллером той же серии stm32f1xx)
https://www.st.com/en/evaluation-tools/stm32vldiscovery.html

Статьи с примерами создания проекта под iar, keil (настройки периферии берутся из библиотеки cmsis) и реализацией мигания светодиода:
1) http://we.easyelectronics.ru/STM32/stm32-vldiscovery-moy-variant-bystrogo-starta.html
2) http://easyelectronics.ru/arm-uchebnyj-kurs-iar-ewarm-sozdanie-proekta.html
3) http://easyelectronics.ru/arm-uchebnyj-kurs-iar-ewarm-sozdanie-proekta-chast-2-cmsis-i-standard-peripherals-library.html
4) http://narodstream.ru/stm-urok-1-ustanovka-keil-%CE%BCvision/
5) (установка keil) http://easyelectronics.ru/arm-uchebnyj-kurs-keil-cmsis-sozdanie-proekta.html

Генерация файлов для настройки периферии на stm32cubemx:
1) Настройка проекта для ide coocox https://habr.com/ru/post/385385/
2) Настройка проекта для ide atollic truestudio http://mypractic.ru/urok-3-ustanovka-programmnogo-obespecheniya-pervyj-opyt-v-konfiguracii-mikrokontrollera-sozdanii-proekta-kompilyacii-proshivke.html

Сравнение arm (lpc (nxp), stm32 (st)):
1) http://easyelectronics.ru/arm-uchebnyj-kurs-podklyuchenie-kontrollera-i-demoplata.html

Подробные серии уровков по stm32:
1) http://narodstream.ru/programmirovanie-mk-stm32/
2) https://habr.com/ru/post/406839/
3) http://easyelectronics.ru/category/arm-uchebnyj-kurs
4) https://www.youtube.com/watch?v=CIBe6rxMU8s
5) http://mypractic.ru/urok-1-vvedenie-obshhie-svedeniya-skoree-vpechatleniya-ob-stm32.html

Ledblink с использованием либы mbed:
1) https://os.mbed.com/users/hudakz/code/STM32F103C8T6_Hello/

Разработка под stm32 на linux кросс-компиляторе arm-none-eabi-as (ассемблер) и соответствующем линкере arm-none-eabi-ld:
1) https://habr.com/ru/post/354670/

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

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