CMSIS STM32 Урок 1. Создание проекта

Этот курс рассчитан, прежде всего, на профессионалов, кто уже имеет опыт разработки на HAL для STM32 и планирует освоить более низкий уровень для достижения жесткой оптимизации. Кроме того, низкоуровневая разработка для STM32 позволит со временем легко справляться с другими микроконтроллерами ARM Cortex-M для которых не существует библиотеки абстракции HAL. Проще говоря, этот цикл статей позволяет стать независимым от HAL. Здесь я объясняю только самые основные возможности и никак не претендую на какой-то расширенный обучающий курс. Главное преимущество моих уроков в том, что все я проверяю на реальном железе. Этих статей вам не будет достаточно для всеобъемлющего изучения разработки STM32 с CMSIS. Где-то вам придется нагугливать дополнительно техническую документацию, такую как Datasheet'ы, Reference Manual'ы. Хотя я стараюсь здесь приводить скриншоты оттуда. Для удобства разработки мы будем использовать Keil MDK, с помощью мастера создания проекта мы можем создать пустой проект и настроить его как будет удобно. Далее, в качестве примера, я буду использовать микроконтроллер STM32F103C6 с 32 кБ Flash и 10 кБ ОЗУ (серия Low density).

Наверняка вам понадобятся средства разработки. Давайте сразу же набьем карманы, чтобы не тратить время на поиски.

Keil 5.36 СКАЧАТЬ — в trial версии ограничение по коду, 32 кБ.

Поддержка микросхем STM32F1 для Keil (Pack) СКАЧАТЬ – Типа расширение, устанавливается после полной установки самого кейла.

Программатор ST-Link V2 ищите на маркетплейсах. Желательно белый большой. В нем уже есть вывод SWO, который вам в жизни пригодится. Но для этих уроков достаточно будет и «свистка».

STM32 ST-Link Utility СКАЧАТЬ – прошивалка и драйвера для программатора ST-Link. Еще с ее помощью можно обновить ПО программатора.

Запускаем keil. Переходим в меню Project → New uVision Project. Создаем папку проекта по нужному пути (в пути не должно быть кириллицы), называем файл проекта. Откроется мастер выбора устройства:

Выбираем конечно же STM32F103C6 и нажимаем Ok.

Далее, для разработки с помощью CMSIS понадобится сам CMSIS и startup файл к нему.

Клацаем две птички и нажимаем Ok.

Автоматически будет сгенерирован не только ассемблерный файл startup_stm32f10x_ld.s, но и еще пара файлов: system_stm32f10x.c, RTE_Device.h. Последний, RTE_Device.h, я не буду использовать, просто удаляю из него весь текст, так как сам файл удалить из проекта я не могу. А внутри system_stm32f10x.c я оставляю только сброс регистров системы тактирования, остальное удаляю.

#include "stm32f10x.h"

/* Uncomment the following line if you need to relocate your vector Table in Internal SRAM. */ 
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x0 /*!< Vector Table base offset field. This value must be a multiple of 0x200. */

void SystemInit (void) {
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  RCC->CR |= (uint32_t)0x00000001; 	// Set HSION bit 
  RCC->CFGR &= (uint32_t)0xF8FF0000;	// Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits 
  RCC->CR &= (uint32_t)0xFEF6FFFF; 	// Reset HSEON, CSSON and PLLON bits 
  RCC->CR &= (uint32_t)0xFFFBFFFF; 	// Reset HSEBYP bit 
  RCC->CFGR &= (uint32_t)0xFF80FFFF; 	// Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits 
  RCC->CIR = 0x009F0000; 			// Disable all interrupts and clear pending bits 
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; // Vector Table Relocation in Internal FLASH. 
}

Теперь необходимо создать файлы main.c и main.h. Внутри main.h минимум такой:

#include <stdbool.h>
#include <stdint.h>
#include "stm32f10x.h"

Внутри main.c тоже немного

#include "main.h"
 
int main(void) {
	while(1) {		
	}
}

Внутри startup файла объявлены векторы всех прерываний. Пожалуй, создадим отдельно файлы, обслуживающие нужные нам прерывания, it.c и it.h Пример it.h

#ifndef IT_H_
#define IT_H_
#include "main.h"

void SysTick_Handler(void);	// Прерывание от системного таймера (счетчика миллисекунд)
void HardFault_Handler(void);	// Прерывание от критической ошибки

#endif
/* Векторы прерываний */
#include "it.h"

void SysTick_Handler(void) {
}

void HardFault_Handler(void) {
	for (;;) {
	}
}

Еще немного настроим keil. Кликните по Project → Options for Target … На вкладке Debug выберите свой программатор/отладчик

Для того чтобы при компилировании генерировалась прошивка в формате HEX, поставьте такую галочку

Теперь даже можно откомпилировать полученный шаблон клавишей F7, а так же войти в режим отладки Ctrl + F5. Если все получилось, то поздравляю. Подготовка шаблона для разработки закончена.

Обсудить эту статью можно здесь https://t.me/ipasoftel/25 

Следующий урок 

Tags: ,