Создаем свой первый проект в Keil

В данной статье создадим первый рабочий проект в среде uVision от Keil, откомпилируем его, прошьем отладочную плату STM32VLDiscovery, рассмотрим некоторые «подводные камни», которые будут по мере работы над проектом. Ничего особенно писать не будем просто помигаем светодиодами. UPD: статья довольно старая, но информация в ней актуальна и для последней на данный момент версии Keil 5.23.Итак начнем. Для начала создаем пустой новый проект, в меню выбираем PROJECT -> New uVision Project, сохраняем его (проект имеет расширение .uvproj), выбираем в окне наш МК, в STM32VLDiscovery это STM32F100RB:

Keil создание проекта

Далее нам предложат добавить в проект стартовый код, жмем «Yes»:

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

Keil ARM STM32

Теперь необходимо выполнить конфигурацию проекта:

В окне проекта на вкладке Target видим установки адресов памяти IROM и IRAM, эти значения устанавливаются автоматически при выборе соответствующего чипа, менять их крайне нежелательно (Здесь также желательно установить Xtal частоту, на которой работает микроконтроллер):

Идем во вкладку Output и здесь ставим галочки напротив тех типов файлов, которые мы хотим получить на выходе проекта (Debug Information необходим для отладки устройства, HEX File – прошивка микроконтроллера):

Keil project config

Переходим во вкладку 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»):

После чего компиляция происходит успешно.