UDK-32F107V для самых маленьких, или "С чего начать?"

Учитывая вопросы юных эмбеддеров, начинающих работать с нашей платой, выкладываю сей опус.
В нем пойдет речь о том, как собрать идущие в комплекте с платой проекты, «прошить» микроконтроллер и заставить все это работать.

Сама статья написана на примере простейшей программы мигания светодиодом, компилируемой в IAR, и представляет собой пошаговую инструкцию для тех, кто никогда раньше этого не делал.
Итак, всех, кому это интересно, приглашаю под КАТ.

Для того, чтобы выполнить то, что описано в этой статье, кроме самой платы, нам понадобится среда разработки
IAR Embedded Workbench for ARM 6.21, провод USB>miniUSB и внутрисхемный отладчик.
В данный момент опробована работа платы совместно с отладчиками JetLink 5, JetLink 8, JetLink Pro, TE-ST-LINK
и встроенного отладчика STM32F4-Discovery.

Приступим…
Первым делом запускаем IAR Embedded Workbench, выбираем меню «Project» и нажимаем «Create new project».

В открывшемся диалоговом окне выбираем шаблон C++ main и жмем “OK”.

Указываем название и путь для размещения проекта и нажимаем “Сохранить”.

Теперь следует настроить саму среду разработки. Щелкаем правой кнопкой на названии проекта и выбираем “Options”.

Во вкладке General Options / Target выбираем тип микроконтроллера ST STM32F10xV.

Во вкладке C/C++ Compiler / Preprocessor в окошко Additional include directories вбиваем следующие строки:
$PROJ_DIR$\CMSIS\CM3\CoreSupport\
$PROJ_DIR$\CMSIS\CM3\DeviceSupport\ST\STM32F10x\

А в окно Defined symbols
STM32F10X_CL


Идем во вкладку Linker/Config, в поле ”Linker configuration file” устанавливаем флажок “Override default” и нажимаем кнопку ”Edit”
Во вкладке ”Vector Table” в графе “.intvec start” устанавливаем адрес начала FLASH-памяти
0×08000000


Во вкладке “Memory Regions” устанавливаем границы FLASH-памяти
0×08000000…0x0803FFFF
и границы SRAM
0×20000000…0x2000FFFF


Во вкладке “Stack/Heap Sizes” задаем размер стека и кучи:

И нажимаем кнопку “Save”. В появившемся диалоговом окне указываем файл для сохранения установок линкера.

Затем идем во вкладку ”Debugger/Setup” и выбираем используемый отладчик

Во вкладке “Debugger/Download” устанавливаем флажок “Use flash loader(s)”

Во вкладке “ST-LINK/ST-LINK” выбираем интерфейс отладчика. Плата спроектирована так, что будет работать любой из них, JTAG или SWD.

Нажимаем ”OK”. Среда настроена.
Теперь идем в директорию
..\stm32f105_107_usb_fw.zip\STM32F105_107_AN3354_FW_V1.0.0\Libraries
и копируем оттуда в каталог с нашим проектом папку CMSIS – это стандартная библиотека функций языка Си для
микроконтроллеров STM32F10x.
Добавляем файл заголовка stm32f10x.h в проект.

Пробуем скомпилировать проект, нажав кнопку ”Make”

В появившемся диалоговом окне указываем файл для сохранения Workspace и жмем “Сохранить”.

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

Появившиеся ошибки связанны с тем, что CMSIS писался для IAR 5.2, а в IAR 6.2, которым пользуюсь я, некоторые функции CMSIS есть в своих библиотеках. Поэтому нам придется конфликтные функции из CMSIS удалить. Дважды щелкаем по первой ошибке – откроется файл core_cm3.h, в котором нужно перевести в комментарий следующие строчки:
static __INLINE  void __WFI()       { __ASM («wfi»); }
static __INLINE  void __WFE()       { __ASM («wfe»); }
static __INLINE  void __SEV()       { __ASM («sev»); }
static __INLINE  void __CLREX()     { __ASM («clrex»); }
extern                              uint32_t __get_PSP(void);
extern                              void __set_PSP(uint32_t topOfProcStack);
extern                              uint32_t __get_MSP(void);
extern                              void __set_MSP(uint32_t topOfMainStack);
extern                              uint32_t __REV16(uint16_t value);
extern                              uint32_t __RBIT(uint32_t value);
extern                              uint32_t __STREXB(uint8_t value, uint8_t *addr);
extern                              uint32_t __STREXH(uint16_t value, uint16_t *addr);

После исправлений пробуем еще раз скомпилировать проект. В этот раз все получается.

Теперь остается собственно написание маленького приложения для мигания светодиодом.
Зачем-то после сброса процессора все его порты отключены от тактового сигнала. Поэтому
первым делом нужно включить тактирование порта GPIOD. Делается это вот такой строчкой:
RCC->APB2ENR|=RCC_APB2ENR_IOPDEN;

Светодиод подключен катодом к GPIOD12.
Зададим частоту переключения 50МГц:
GPIOD->CRH|=GPIO_CRH_MODE12;

Дальше следует сконфигурировать порт на выход с открытым коллектором:
GPIOD->CRH|=GPIO_CRH_CNF12_0;
GPIOD->CRH&=~GPIO_CRH_CNF12_1;

И, собственно, сам цикл мигания светодиодом:
while(1)
{
GPIOD->BRR|=GPIO_BRR_BR12;
for (unsigned int i=0; i<300000; i++) {}
GPIOD->BSRR|=GPIO_BSRR_BS12;
for (unsigned int i=0; i<300000; i++) {}
}

В итоге, все должно выглядеть так:

Нажимаем ”Make”, а затем “Download and debug”.

Запустится окно отладчика. Для запуска программы на исполнение следует нажать кнопку “Go”.

Радуемся миганию светодиода на плате.

0 comments

Only registered users can comment.