CMSIS2000
0.0.7
|
CMSIS – Cortex Microcontroller Software Interface Standard (стандарт на интерфейс ПО микроконтроллеров Cortex) ARM Обеспечивает в качестве части CMSIS следующие программные уровни доступные в реализациях для нескольких компиляторов
Программные уровни предоставляемые партнёрами по производству Чипов представлены как:
CMSIS определяет для Микроконтроллерных Систем на базе Cortex-M:
Используя CMSIS совместимые программные компоненты пользователь может легче повторно использовать шаблонный код. CMSIS стремиться обеспечить комбинацию нескольких программных компонентов от нескольких поставщиков промежуточного ПО.
CMSIS рекомендует следующие правила для идентификаторов:
Требования к комментариям:
Комментарии Функций обеспечивают для каждой функции следующую информацию:
Пример Doxygen:
/** * @brief Enable Interrupt in NVIC Interrupt Controller * @param IRQn interrupt number that specifies the interrupt * @return none. * Enable the specified interrupt in the NVIC Interrupt Controller. * Other settings of the interrupt such as priority are not affected. */
/**
HAL Cortex-M использует стандартные типы данных из заголовочного файла стандарта ANSI <stdint.h>. Описатели типа ВВ используются для доступа к периферийным переменным. Описатели типа ВВ составлены для использования автоматической генерации отладочной информации от периферийных регистров.
IO Type Qualifier | #define | Описание |
__I | volatile const | Доступны только на чтение |
__O | volatile | Доступны только на запись |
__IO | volatile | Доступны на чтение и на запись |
Файлы core_cm0.h, core_cm3.h, core_cm4.h содержат номера версии CMSIS в виде следующих определений:
Файлы core_cm0.h, core_cm3.h, core_cm4.h содержат номер версии ядра Cortex в виде следующих определений:
Далее описаны созданные в проекте CMSIS файлы, для того чтобы обеспечивать доступ к ядру Cortex-M и периферии.
File | Сопровождающий | Описание |
device.h | Device specific (provided by silicon partner) | Defines the peripherals for the actual device. The file may use several other include files to define the peripherals of the actual device. |
core_cm0.h | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Определяет основную периферию под ЦП семейства Cortex-M0 CPU. |
core_cm3.h | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Определяет основную периферию под ЦП семейства Cortex-M3 CPU. |
core_cm4.h | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Определяет основную периферию под ЦП семейства Cortex-M4 CPU. |
core_cm4_simd.h | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Определяет SIMD функции для ядра Cortex-M4. |
core_cmFunc.h | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Определяет функции доступа к регистрам ядра Cortex-M. |
core_cmInstr.h | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Определяет инструкции для ядра Cortex-M. |
core_cm0.c | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Обеспечивает вспомогательные функции для доступа к регистрам ядра. |
core_cm3.c | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Обеспечивает вспомогательные функции для доступа к регистрам ядра. |
core_cm4.c | ARM (для компиляторов RealView ARMCC, IAR, и GNU GCC) | Обеспечивает вспомогательные функции для доступа к регистрам ядра. |
startup_device | ARM (адаптировано партнёром соответствующего компилятора / производителем чипов) | Provides the Cortex-M startup code and the complete (device specific) Interrupt Vector Table |
system_device | ARM (адаптировано производителем чипов) | Обеспечивает устройство-специфичный файл настройки для устройства. Настраивает устройство, запуская обычно тактовый генератор (ФАПЧ), являющийся частью микроконтроллерного устройства. |
Файл device.h создаётся производителем чипов и является главным фалом, который вкладывает и использует программист в коде на языке Си. Файл содержит:
Настройки для core_cm0.h / core_cm3.h / core_cm4.h: Путём настройки и включения заголовочных файлов core_cm0.h / core_cm3.h / core_cm4.h is обеспечивается доступ к регистрам процессора и периферии.
Для доступа к спецефичным для устройства прерываниям файл device.h определяет номера прерываний IRQn для всего устройства используя enum typedef как показано далее
Следующие определения специфичные для устройств устанавливаются в заголовочном файле устройства и используются для настройки ядра Cortex-M. Некоторые из настроек отражены уровнем CMSIS в виде использования #define как описано далее.
Несколько опций в core_cm#.h настраиваются следующими определениями, которые должны быть определены перед командой препроцессора include <core_cm#.h>. Если определения пропущены то используются настройки по умолчанию.
#define | Ядро | Значение | По умолчанию | Определение |
__CM0_REV | M0 | 0x0000 | 0x0000 | номер ревизии ядра ([15:8] номер ревизии , [7:0] номер заплатки) |
__CM3_REV | M3 | 0x0101 | 0x0200 | 0x0200 | номер ревизии ядра ([15:8] номер ревизии , [7:0] номер заплатки) |
__CM4_REV | M4 | 0x0000 | 0x0000 | номер ревизии ядра ([15:8] омер ревизии, [7:0] номер заплатки) |
__NVIC_PRIO_BITS | M0, M3, M4 | 2 .. 8 | 2 (M0) 4 (CM3, CM4) | Число битов приоритета реализованных в NVIC (специфично для устройства) |
__MPU_PRESENT | M0, M3, M4 | 0 | 1 | 0 | Определяет наличие MPU |
__FPU_PRESENT | M4 | 0 | 1 | 0 | Определяет наличие FPU |
__Vendor_SysTickConfig | M0, M3, M4 | 0 | 1 | 0 | Когда определение установлено в 1 функция SysTickConfig в core_cm3.h исключается. В этом случае файл device.h должен содержать реализацию данной функции определяемую поставщиком чипа. |
Каждая периферия использует префикс который состоит из<аббревиатуры устройства>_ и <имени периферии>_ для обозначения регистров которые предоставляет доступ к соответствующей перифериии. Суть этого состоит в том чтобы избежать коллизий происходящий из-за коротких имён. Если существует более чем одно периферийное устройство одного типа, идентификаторы должны иметь суффикс (число или букву). Например:
Для доступа к периферийным регистра и соответствующей функции в устройстве файлы и device.h and core_cm0.h / core_cm3.h определяют как минимум:
Эти определения позволяют иметь доступ к периферийным регистром из кода пользователя простым присваиванием в виде:
Дополнительно файл device.h может определять:
Шаблонный файл для запуска устройства сопровождается ARM для каждого поддерживаемого компилятор. Он адаптируется производителем чипов для включения векторов прерываний под все специфичные для устройства обработчики прерываний. Каждый обработчик прерывания объявлен как функция типа weak как пустой обработчик. Однако обработчик прерывания может быть использован прямо в прикладном ПО без каких либо требования для доработки файла запуска (файл startup_device).
Следующие имена исключений зафиксированы и определены в начале таблицы векторов прерываний для Cortex-M0:
Следующие имена исключений зафиксированы и определены в начале таблицы векторов прерываний для Cortex-M3:
Далее представлены примеры перываний специфичных для конекретных устройств
Устройствоспецифичные прерывания должны иметь неопределённые обработчики, которые могут быть переопределены в коде разработчика. Далее представлен пример таких неопределенных функций.
Приложение пользователя может просто определить функцию обработки прерывания используя имя обработчика, как показано далее:
/**
Шаблон файла system_device предоставляется ARM, но адаптируется производителем чипов для соотвествия их конкретному устройству. В качесве минимальных требований файл должен обеспечивать функцию конфигурации устройства, а также глобальную переменную настройки частоты. Он настраивает устройство и обычно инициализирует тактовый генератор (ФАПЧ) который является частью микроконтроллерного устройства.
Файл system_device.c должен обеспечивать в как минимум функцию SystemInit как показано далее.
Определение функции | Описание |
void SystemInit (void) | Установка микроконтроллерной системы. Обычно эта функция устаноавливает тактовый генератор (ФАПЧ), являющийся частью микроконтроллера. Для систем с переменной частотой часов функция также обнавляет значение переменной SystemCoreClock. SystemInit вызвается и файла запуска. |
void SystemCoreClockUpdate (void) |
Обновляет переменную SystemCoreClock и должна быть вызываема всегда когда частота ядра меняется в течений выполнения программы. SystemCoreClockUpdate() оценивает настройки регистра часов и вычисляет текущую частоту ядра. |
Также частью файла system_device.c является переменная SystemCoreClock, которая содержит текущую частоту ядра ЦП как показано далее.
Определение переменной | Описание |
uint32_t SystemCoreClock |
Содержит частоту ядра (ту которая обеспечивает частоту вызова системного таймера SysTick и частоту процессора). Эта переменная может быть использована приложениями пользователя для установки системного таймера или для настройки других параметров. Она также может быть использована отладчиком для опроса частоты во время выполнения отладки или для настройки скорости отладки. SystemCoreClock устанавливается в правильное предопредленное значение. Компилятор должен быть настроен так, чтобы не удалять эту переменную даже если приложение ее не использует. Для отладочных систем важно, чтобы переменная физически присутсвовала в памяти так, чтобы отладчик мог быть сконфигурирован ею. |
Замечание: