Библиотека CMSIS стандартизуриется компанией ARM Limited, но кроме стандартизации фирма ARM выпускает код для ядра CORTEX-M. Конкретный производитель контроллеров с ARM-ядром, средствами своих программистов или сторонних сообществ дополняет библиотеку CMSIS файлами с описанием периферийных модулей, которыми они нафаршировали свои контроллеры. Фирма ST на данный  поставляет через свой сайт библиотеки standard peripherals library (каждая для своей серии). Выпуская очередную версию библиотеки она включает в нею CMSIS версии, которая была на то время действующей.

На данный момент последней версией библиотеки STM32F10x standard peripheral library (для серии STM32F0xx), является версия 3.5.0, выпущеная в 2011-ом году. В эту библиотеку включены файлы описания ядра CMSIS версии 1.30 (выпущены ARM в 2009ом). Последней же версией CMSIS, которую можно скачать на сайте ARM, на сегодня является версия 3.01. С момента 1.30 в CMSIS было исправлено несколько ошибок. В частности это известная ошибка из файла core_cm3.c использования одинаковых регистров:

Error: registers may not be the same -- `strexh r0,r0,[r1]'
Error: registers may not be the same -- `strexb r0,r0,[r1]'

Ошибка стала выдаваться новыми версиями компиляторов, так как данный код не безопасен, и работники ARM быстро исправили его в новых версиях и компиляторы подхватили эту концепцию, а вот ST так и не торопится обновить версию своей библиотеки. Ошибка обычно вылазит при включении оптимизации, так как без оптимизации, видимо компилятор не использует эти инструкции.

Не знаю, возможно скоро ST обновит standard peripheral library, но пока она этого не сделала я предлагаю выполнить обновление CMSIS самому.

Итак в STM32F10x Standard Peripherals Library 3.50 описание ядра находится в двух файлах, находящихся в папке Library/CMSIS/CM3/CoreSupport/:

  • core_cm3.c
  • core_cm3.h

Что бы обновить CMSIS до версии 3.01, нужно всего на всего удалить эти файлы из каталога, в котором их находит компилятор а вместо них скопировать новые (в этот же каталог). Библиотека стандартизирована и при этом обладает отличной обратной совместимостью, по этому такая замена не приведет ни к каким проблемам. Итак, удалив старые два файла нужно скачать новую версию CMSIS. Сделать это можно на сайте http://www.arm.com, (не буду давать точную ссылку, так как она может меняться). Вместо этого я дам копию архива: CMSIS-SP-00300-r3p1-00rel0.zip

Архив весит аж 40 МБ, этот размер обусловлен тем, что в библиотеке есть:

  • CMSIS-CORE: интерфейс для ядер Cortex-M0, Cortex-M3, Cortex-M4, SC000, и SC300, то что нам собственно и нужно
  • CMSIS-DSP: Библиотека с функциями цифровой обработки сигналов (оптимизированные математические функции, максимально использующие функциональность ядра)
  • CMSIS-RTOS API: Стандартизированный интерфейс для ОС реального времени (примитивное управление потоками, ресурсами, временим.
  • CMSIS-SVD: System View Description XML - какой-то просмотрщик контроллеров их периферии.

Файлы описания ядра в версии 3.01 находятся в папке CMSIS/Include/ архива. Файла core_cm3.c там уже вовсе нет, так как от него отказались. Вместо него код распихали в .h файлы. Для ядра Cortex-M3 нужно скопировать в папку прошлых, такие файлы:

  • core_cm3.h
  • core_cmFunc.h
  • core_cmInstr.h

На этом процесс обновления закончен: можно пере-компилировать проекты, и быть уверенным в безопасности и работоспособности кода.

ARM CMSIS DSP Library

Если вы хотите попробовать "продвинутую" математику от ARM CMSIS DSP Library, можете взять еще пару файлов из папки Include/:   

  • arm_math.h
  • arm_common_tables.h

Что бы использовать функции DSP, нужно также скопировать скомпилированную статическую библиотеку из каталога Lib/GCC/, файл с названием libarm_cortexM3l_math.a (например в каталог проекта), и указать ее линкеру в качестве дополнительного элемента для сборки. В eclipse это будет выглядеть следующим образом:

armcmsisdspattach.jpg

Потом можно подключать arm_math.h, но перед этим нужно объявить что вы используете функции именно для Cortex-M3:

#define ARM_MATH_CM3
#include "arm_math.h"

Вместо явного дефайна, можно определить символ ARM_MATH_CM3 в параметрах компилятора. Ну а суть работы с библиотекой DSP, вы можете почитать в документации и hразобрать на различных примерах.