В данной статье создадим первый рабочий проект в среде uVision от Keil, откомпилируем его, прошьем отладочную плату STM32VLDiscovery, рассмотрим некоторые «подводные камни», которые будут по мере работы над проектом. Ничего особенно писать не будем просто помигаем светодиодами. UPD: статья довольно старая, но информация в ней актуальна и для последней на данный момент версии Keil 5.23.Итак начнем. Для начала создаем пустой новый проект, в меню выбираем PROJECT -> New uVision Project, сохраняем его (проект имеет расширение .uvproj), выбираем в окне наш МК, в STM32VLDiscovery это STM32F100RB:
Далее нам предложат добавить в проект стартовый код, жмем «Yes»:
Создадим новый файл с исходным кодом, сохраняем его, присвоив ему расширение .c, добавляем его к проекту в новую группу, также добавляем файлы библиотеки CMSIS, зачем они нужны в следующем уроке, пока просто добавляем:
Теперь необходимо выполнить конфигурацию проекта:
В окне проекта на вкладке Target видим установки адресов памяти IROM и IRAM, эти значения устанавливаются автоматически при выборе соответствующего чипа, менять их крайне нежелательно (Здесь также желательно установить Xtal частоту, на которой работает микроконтроллер):
Идем во вкладку Output и здесь ставим галочки напротив тех типов файлов, которые мы хотим получить на выходе проекта (Debug Information необходим для отладки устройства, HEX File – прошивка микроконтроллера):
Переходим во вкладку C/C++, если наш проект использует include файлы, то здесь необходимо в поле Include Paths установить пути до этих файлов:
В нашем проекте мы будем использовать файл stm32f10x.h, указываем путь до него:
Далее у нас идет настройка вкладок Debug и Utilities, где производится установка отладчика STLINK, в прошлом уроке мы это уже делали. Все на этом настройка проекта закончена, можно приступать к написанию кода.
Сделаем простую мигалку светодиодами, которые висят у нас на порту С (PC8, PC9) попеременно через пол секунды, кстати в Keil нет функции delay, как в GCC для AVR, так что нам придется написать эту функцию самостоятельно используя таймер:
#include "stm32f10x.h" void initial (void) { RCC->APB2ENR |= 1 << 4; GPIOC->CRH &= ~GPIO_CRH_CNF8; GPIOC->CRH |= GPIO_CRH_MODE8_0; GPIOC->CRH &= ~GPIO_CRH_CNF9; GPIOC->CRH |= GPIO_CRH_MODE9_0; /*timer config*/ RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; TIM6->PSC = 8000-1; TIM6->CR1 |= TIM_CR1_OPM; } void delay_ms (uint16_t value) { TIM6->ARR = value; TIM6->CNT = 0; TIM6->CR1 = TIM_CR1_CEN; while((TIM6->SR & TIM_SR_UIF)==0){} // дождаться конца задержки TIM6->SR &= ~TIM_SR_UIF; } int main (void) { initial (); while (1) { GPIOC->BSRR |= 1 << 8; delay_ms (1000); GPIOC->BRR |= 1 << 8; GPIOC->BSRR |= 1 << 9; delay_ms (1000); GPIOC->BRR |= 1 << 9; } }
Ну что ж, можно и компилировать и собирать проект, жмем F7 и у нас выпадает следующая ошибка: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x.h(96): error: #35: #error directive: «Please select first the target STM32F10x device used in your application (in stm32f10x.h file), которая говорит нам, что необходимо выбрать процессор в файле stm32f10x.h, зачем это придумали делать вручную я не знаю, открываем в проекте это файл и раскомментируем #define с нашим процессором (UPD правильнее сделать на вкладке С/С++ -> Preprocessor Symbol -> Defines вставляем «STM32F10X_MD_VL»):
После чего компиляция происходит успешно.