Оглавление
Memory Pool¶
Import programcmsis_rtos_queue — main.cpp
00001 #include "mbed.h" 00002 #include "cmsis_os.h" 00003 00004 typedef struct { 00005 float voltage; 00006 float current; 00007 uint32_t counter; 00008 } message_t; 00009 00010 osPoolDef(mpool, 16, message_t); 00011 osPoolId mpool; 00012 00013 osMessageQDef(queue, 16, message_t); 00014 osMessageQId queue; 00015 00016 void send_thread (void const *args) { 00017 uint32_t i = 0; 00018 while (true) { 00019 i++; 00020 message_t *message = (message_t*)osPoolAlloc(mpool); 00021 message->voltage = (i * 0.1) * 33; 00022 message->current = (i * 0.1) * 11; 00023 message->counter = i; 00024 osMessagePut(queue, (uint32_t)message, osWaitForever); 00025 osDelay(1000); 00026 } 00027 } 00028 00029 osThreadDef(send_thread, osPriorityNormal, DEFAULT_STACK_SIZE); 00030 00031 int main (void) { 00032 mpool = osPoolCreate(osPool(mpool)); 00033 queue = osMessageCreate(osMessageQ(queue), NULL); 00034 00035 osThreadCreate(osThread(send_thread), NULL); 00036 00037 while (true) { 00038 osEvent evt = osMessageGet(queue, osWaitForever); 00039 if (evt.status == osEventMessage) { 00040 message_t *message = (message_t*)evt.value.p; 00041 printf("\nVoltage: %.2f V\n\r" , message->voltage); 00042 printf("Current: %.2f A\n\r" , message->current); 00043 printf("Number of cycles: %u\n\r", message->counter); 00044 00045 osPoolFree(mpool, message); 00046 } 00047 } 00048 }
[Repository ‘/users/mbed_official/code/rtx/docs/tip/structos__pool__def.html’ not found]
Introduction
This user manual describes the CMSIS DSP software library, a suite of common signal processing functions for use on Cortex-M and Cortex-A processor based devices.
The library is divided into a number of functions each covering a specific category:
- Basic math functions
- Fast math functions
- Complex math functions
- Filtering functions
- Matrix functions
- Transform functions
- Motor control functions
- Statistical functions
- Support functions
- Interpolation functions
- Support Vector Machine functions (SVM)
- Bayes classifier functions
- Distance functions
The library has generally separate functions for operating on 8-bit integers, 16-bit integers, 32-bit integer and 32-bit floating-point values.
Function Classification
The functions can be classified into two segments
- Legacy functions supporting ARM’s internal symmetric quantization(8 bits).
- Functions that support TensorFlow Lite framework with symmetric quantization(8 bits).
The legacy functions can be identified with their suffix of _q7 or _q15 and are no new development is done there. The article in describes in detail how to run a network using the legacy functions.
The functions supporting TensorFlow Lite framework is identified by the _s8 suffix and can be invoked from TFL micro. The functions are bit exact to TensorFlow Lite. Refer to the TensorFlow’s documentation in on how to run a TensorFlow Lite model using optimized CMSIS-NN kernels.
GPIO.CPP
В конструкторе класса сохраняется ссылка на порт и тактируется выбранный порт.
В методе конфигурации сохраняем заданный режим в переменную pin_m. Это нужно для того, чтобы при использовании методов setPin()/resetPin() и заданном режиме альтернативной функции эти методы не управляли выводом, так как в данном случае управление должно осуществляться из модуля альтернативной функции.
Далее проверяем задан ли режим входа с подтяжкой. Если задан то меняем переменную pin_mode так как для обоих режимов входа с подтяжкой биты пина конфигурируются одинаково, а выбор подтяжки к питанию или земле осуществляется записью в регистр ODR 1 или 0.
В условии if ( pin_nomber < 8 ) и аналогичном if ( pin_nomber > 7 ) рассчитываем смещение относительно начала регистра CRL или CRH соответственно, учитывая, что на вывод отводится 4 бита, и кладем в переменную offset. Затем сначала затираем биты конфигурации маской GPIO BIT MASK, а затем записываем новые биты конфигурации вывода.
if ( pin_mode == INPUT_PULL_UP ) — проверяем, если задан режим подтяжки к питанию, то выставляем в регистре ODR единицу. Аналогично проверяем режим подтяжки к земле и скидываем бит, если условие верно.
В методе setPin() сначала проверяем не задана ли альтернативная функция. Если да, то выходим ничего не делая. Далее в регистре BSSR устанавливаем 1 на соответствующий вывод.
В методе resetPin() все аналогично предыдущему, за исключением того, что пишем в регистр BRR тем самым скидывая вывод.
В методе getPin() создаем маску для сравнения, сравниваем регистр IDR с маской. Если тру — возвращаем 1, иначе 0.
Применяется все это дело так :
Программное обеспечение для работы с контроллером
Keil Uvision 4
Для ARM архитектуры разработано множество сред разработки. К самым известным и дорогостоящим относятся инструменты фирм Keil и IAR System. Программы этих компаний предлагают самые продвинутые инструментарии для оптимизации кода. Также дополнительно существуют различные системы – USB стеки, TCP/IP-стеки и прочие. Применяя системы Keil, пользователь получает хороший уровень технической поддержки.
Также для STM32 используется среда разработки Eclipse и построенные на ней системы Atollic TrueStudio (платная) и CooCox IDE (CoIDE) (бесплатная). Обычно используется последняя. Ее преимущества перед другими средами разработки:
- Свободно распространяемое программное обеспечение;
- Удобство использования;
- Имеется много примеров, которые можно загрузить.
Единственный недостаток среды разработки CooCox IDE – сборка есть только под Windows.
GPIO.H
У выводов контроллера есть несколько режимов работы. Они задаются в регистрах GPIOx_CRL ( для выводов от 0 до 7 ) и GPIOx_CRH ( для выводов от 8 до 15 ). На каждый вывод в этих регистрах отводится по 4 бита, которые и задают режим работы. Чтобы не вспоминать каждый раз какие биты нужно прописать на каком месте для определенного режима, удобно переписать все возможные комбинации в макроопределения, что я и сделал. В последствии эти константы будут передаваться в методы для задания режима.
Далее по коду объявляем класс GPIO. Конструктор класса принимает ссылку на порт (GPIOA, GPIOB и т.д.) и сохраняет ее в приватной переменной GPIOx. Это нужно для того, чтобы при создании объекта и вызове его методов, методы знали с каким портом работать.
После конструктора следуют публичные методы класса, образующие интерфейс.
-
pinConf ( uint8_t pin_nomber, uint8_t pin_mode ) принимает номер вывода порта и режим работы, который задается макроопределениями в начале файла.
-
setPin( uint8_t pin_nomber ) устанавливает вывод в 1. Принимает номер пина порта.
-
resetPin( uint8_t pin_nomber ) сбрасывает вывод. Принимает номер вывода.
-
getPin ( uint8_t pin_nomber ) возвращает состояние вывода порта (читает регистр IDR)
CMSIS для STM32
Библиотека стандартных периферийных устройств STM32F10x v3.1.0 (StdPeriph_Lib) была написана в соответствии с форматом Doxygen, что значительно упрощает процесс создания документации и ее использования. Вся документация для этой библиотеки была включена в файл справки, а не в том виде, в котором она ранее применялась STMicroelectronics в отдельном файле PDF. Новый тип документации облегчил просмотр ее содержимого и поиск информации.
Вместе с архивом библиотеки StdPeriph_Lib мы получаем шаблоны проектов для трех самых популярных компиляторов (сред): IAR, Keil и ARM-GCC.
Структура файлов проекта, например, с использованием аналого-цифрового преобразователя, построенного на основе шаблона проекта для среды uVision, показана на рис. 2
Рис. 2. Файловая структура среды uVision для проекта с использованием аналого-цифрового преобразователя
Если шаблон проекта копируется в текущий каталог, то компилятор должен быть проинформирован о том, где искать соответствующие файлы, и используемые источники должны быть добавлены в проект. Мы делаем это (в среде uVision), щелкая правой кнопкой мыши на имени проекта и выбирая опцию Manage Component из контекстного меню (рис. 2). Затем мы находим нужные файлы на диске и добавляем их.
Как упоминалось выше, для правильной компиляции проекта необходимо обновить места (пути), где компилятор будет искать заголовочные файлы * .h. Для этого выберите меню Project / Options for Target …, после чего откроется окно, в котором на вкладке C / C ++ редактируем путь для поиска файлов заголовков.
Generate CMSIS Pack for Release
This GitHub development repository contains already pre-built libraries (stored in Git-LFS) of various software components (DSP, RTOS, RTOS2).
These libraries are validated for release. Git-LFS needs to be installed to retrieve the actual binary files, please see https://git-lfs.github.com/.
To build a complete CMSIS pack for installation the following additional tools are required:
- doxygen.exe Version: 1.8.6 (Documentation Generator)
- mscgen.exe Version: 0.20 (Message Sequence Chart Converter)
- 7z.exe (7-Zip) Version: 16.02 (File Archiver)
Using these tools, you can generate on a Windows PC:
- CMSIS Documentation using the batch file gen_doc.sh (located in ./CMSIS/Doxygen).
-
CMSIS Software Pack using the batch file gen_pack.sh (located in ./CMSIS/Utilities).
The bash script does not generate the documentation. The pre-built libraries for RTX4 and RTX5
are not included within this repository.
The file ./CMSIS/DoxyGen/How2Doc.txt describes the rules for creating API documentation.
Описание SPI
Serial Peripheral Interface (SPI) — это последовательный, синхронный, полнодуплексный протокол передачи данных между главным (master) контроллером (обычно микроконтроллером или другими устройством с программируемой функциональностью) и несколькими ведомыми (slave) устройствами. Как мы увидим далее, SPI позволяет передавать данные как в полнодуплексном, так и в полудуплексном режиме. Спецификация SPI стандарт в протоколах передачи данных и была разработана в конце 70-х компанией Motorola и на данный широко используется как протокол передачи данных для многих цифровых микросхем. В отличие от протокола I2C, SPI не задает жестких условий в протоколе передачи данных по шине, давая ведомым (slave) устройствам полную свободу в структуре сообщений обмена данными.
Рисунок 1: Архитектура типовой SPI шины.
Типовая шина SPI содержит 4 сигнала, как показано на рисунке 1, даже, если возможно управлять некоторыми SPI устройствами, используя лишь 3 сигнала (в таком случае мы говорим о 3-проводном SPI).
- SCK: сигнал, используемый для генерации тактовой частоты синхронизации передачи данных по SPI. Генерируется master устройством и это означает, что каждая передача по шине SPI всегда начинается по инициативе master устройства. В отличие от I2C SPI более быстрый интерфейс передачи данных и тактовая частота обычно в районе нескольких мегагерц. В наше время вполне обычно найти SPI устройства со скоростью обмена данными от 100 МГц и выше. Более того, протокол SPI позволяет работать в одной шине на различных скоростях в одно и то же время.
- MOSI: расшифровывается как Master Output Slave Input и используется для передачи данных от главного (master) устройства к ведомому (slave). В отличие от I2C, где для обмена между устройствами используется лишь один провод, в SPI предусмотрено две линии передачии данных.
- MISO: расшифровывается как Master Input Slave Output и используется для передачи данных от ведомого (slave) устройства к главному (master).
- SSn: Slave Select используется для адресации устройств в шине SPI, где „n“ — количество линий адресации. В отличие от I2C, SPI не использует адреса ведомых (slave) устройств, а использует физические линии адресации, которые устанавливаются в низкий логический уровень для выбора устройства. В типовой SPI шине только одно ведомое (slave) устройство может быть активно в одно время путем установки линии SS в низкий уровень. В этом причина того, что в одной и той же шине могут быть устройства с разной скоростью передачи данных.
Имея две раздельные шины данных, MOSI и MISO, SPI по сути является полнодуплексным интерфейсом передачи данных, таким образом ведомое (slave) устройство может отдавать данные главному (master) пока одновременно принимает данные от него же. В одноранговых шинах (когда одно главное (master) и одно ведомое (slave) устройства), сигнал SS может не использоваться, лишь достаточно его подтянуть к «земле» резистором на несколько килоом, линии MISO/MOSI соединяются в одно общую линию Slave In/Slave Out (SISO). В таком случае мы говорим о двухпроводном SPI, хотя по существу он конечно же трехпроводной.
Рисунок 2: Как передаются данные по шине SPI в полнодуплексном режиме
Каждая транзакция в шине начинается с подачи тактирования в линию SCK в соответствии с допустимой тактовой частотой ведомого (slave) устройства. В то же время главное (master) устройство устанавливает LOW уровень на линии SS и передача данных начинается. Обычно обмен данными подразумевает использование двух регистров (в основном 8-битные, хотя некоторые slave устройства поддерживают 16-битный размер слова), одного в главном (master) устройстве и один в ведомом (slave). Данные побитно сдвигаются в сдвиговом регистре, начиная со старшего бита, пока младший бит сдвигается в этот же самый регистр. В это же самое время, данные от ведомого (slave) устройства сдвигаются в младший бит регистра данных. Когда все биты регистра будут сдвинуты в одну и другую сторону обмен данными будет осуществлен. Если необходимо передать более одного слова данных, сдвиговые регистры обнуляются и процесс повторяется. Обмен данными может продолжаться сколько угодно большое количество циклов тактового генератора. Когда обмен завершен master выключает тактовый сигнал и линия SS возвращается в исходное состояние высокого логического уровня.
Рисунок 2 показывает процесс обмена данными в полнодуплексном режиме, рисунок 3 же демонстрирует процесс в полудуплексном режиме.
Рисунок 3: Как передаются данные по шине SPI в полудуплексном режиме
Instructors
Israel Gbati
Embedded Firmware Engineer
- 4.2 Instructor Rating
- 10,821 Reviews
- 75,051 Students
- 36 Courses
My name is Israel, I have been researching and working in the embedded system space for over 7 years. On Udemy I have trained tens of thousands of students in embedded systems focusing on topics such as Assembly Programming, Real-time Operating Systems Design, Firmware Development and Digital Signal Processing. I am able to teach these topics because in my everyday work I apply concepts from these topics.
Join one of my courses and see how it goes. You can always request a refund.
Show moreShow less
BHM Engineering Academy
21st Century Engineering Academy
- 4.2 Instructor Rating
- 6,409 Reviews
- 47,316 Students
- 22 Courses
Bohobiom Engineering is a 21st century Computer Engineering online Academy based in London U.K.
We have experienced instructors in the areas of Assembly Programming, Hardware Engineering, Signal & Image Processing, Embedded Firmware Development, Deep Learning and other high demand 21st century skills.
As of today we have trained over 35,000 happy pupils. Please take a look at our available courses and message us if you have any questions.
Show moreShow less
Что такое STM32
STM32 – это платформа, в основе которой лежат микроконтроллеры STMicroelectronics на базе ARM процессора, различные модули и периферия, а также программные решения (IDE) для работы с железом. Решения на базе stm активно используются благодаря производительности микроконтроллера, его удачной архитектуре, малом энергопотреблении, небольшой цене. В настоящее время STM32 состоит уже из нескольких линеек для самых разных предназначений.
История появления
Серия STM32 была выпущена в 2010 году. До этого компанией STMicroelectronics уже выпускались 4 семейства микроконтроллеров на базе ARM, но они были хуже по своим характеристикам. Контроллеры STM32 получились оптимальными по свойствам и цене. Изначально они выпускались в 14 вариантах, которые были разделены на 2 группы – с тактовой частотой до 2 МГц и с частотой до 36 МГц. Программное обеспечение у обеих групп одинаковое, как и расположение контактов. Первые изделия выпускались со встроенной флеш-памятью 128 кбайт и ОЗУ 20 кбайт. Сейчас линейка существенно расширилась, появились новые представители с повышенными значениями ОЗУ и Flash памяти.
Достоинства и недостатки STM32
Основные преимущества:
- Низкая стоимость;
- Удобство использования;
- Большой выбор сред разработки;
- Чипы взаимозаменяемы – если не хватает ресурсов одного микроконтроллера, его можно заменить на более мощной, не меняя самой схемы и платы;
- Высокая производительность;
- Удобная отладка микроконтроллера.
Недостатки:
- Высокий порог вхождения;
- На данный момент не так много литературы по STM32;
- Большинство созданных библиотек уже устарели, проще создавать свои собственные.
Минусы STM32 не дают пока микроконтроллеру стать заменой Ардуино.
Signals¶
The Signal Management function group allow to control or wait signal flags. Each thread has assigned signal flags.
Import programcmsis_rtos_signals — main.cpp
00001 #include "mbed.h" 00002 #include "cmsis_os.h" 00003 00004 DigitalOut led(LED1); 00005 00006 void led_thread(void const *args) { 00007 while (true) { 00008 00009 osSignalWait(0x1, osWaitForever); 00010 led = !led; 00011 } 00012 } 00013 osThreadDef(led_thread, osPriorityNormal, DEFAULT_STACK_SIZE); 00014 00015 int main (void) { 00016 osThreadId tid = osThreadCreate(osThread(led_thread), NULL); 00017 00018 while (true) { 00019 osDelay(1000); 00020 osSignalSet(tid, 0x1); 00021 } 00022 }
Contributions and Pull Requests
Contributions are accepted under Apache 2.0. Only submit contributions where you have authored all of the code.
Issues and Labels
Please feel free to raise an issue on GitHub
to report misbehavior (i.e. bugs) or start discussions about enhancements. This
is your best way to interact directly with the maintenance team and the community.
We encourage you to append implementation suggestions as this helps to decrease the
workload of the very limited maintenance team.
We will be monitoring and responding to issues as best we can.
Please attempt to avoid filing duplicates of open or closed items when possible.
In the spirit of openness we will be tagging issues with the following:
-
bug – We consider this issue to be a bug that will be investigated.
-
wontfix — We appreciate this issue but decided not to change the current behavior.
-
enhancement – Denotes something that will be implemented soon.
-
future — Denotes something not yet schedule for implementation.
-
out-of-scope — We consider this issue loosely related to CMSIS. It might by implemented outside of CMSIS. Let us know about your work.
-
question – We have further questions to this issue. Please review and provide feedback.
-
documentation — This issue is a documentation flaw that will be improved in future.
-
review — This issue is under review. Please be patient.
-
DONE — We consider this issue as resolved — please review and close it. In case of no further activity this issues will be closed after a week.
-
duplicate — This issue is already addressed elsewhere, see comment with provided references.
-
Important Information — We provide essential informations regarding planned or resolved major enhancements.
CPUのみを使う場合
- 不要ファイルの除外
下記ファイルをコンパイル対象から除外する。
(他の.cファイルをインクルードするだけのファイル。コンパイル対象とすると2重定義でエラーになる。)
— Source/BasicMathFunctions/BasicMathFunctions.c
— Source/CommonTables/CommonTables.c
— Source/ComplexMathFunctions/ComplexMathFunctions.c
— Source/ControllerFunctions/ControllerFunctions.c
— Source/FastMathFunctions/FastMathFunctions.c
— Source/FilteringFunctions/FilteringFunctions.c
— Source/MatrixFunctions/MatrixFunctions.c
— Source/StatisticsFunctions/StatisticsFunctions.c
— Source/SupportFunctions/SupportFunctions.c
— Source/TransformFunctions/TransformFunctions.c
NEONを使用する場合
「32ビットSIMD命令を使う場合」に加え、下記の変更を行う。IARだとビルドエラーになる。
- FPUのオプションの変更
コンパイラのFPUのオプションを»-mfpu=neon»に設定する。 - コンパイラオプションの追加
コンパイラのオプションに以下を追加する。
«-DARM_MATH_NEON» - エラーファイルの修正 (GCCの場合)
下記ファイルが型に関するエラーが発生するので修正する。
— Source/DistanceFunctions/arm_canberra_distance_f32.c
コード修正箇所 arm_canberra_distance_f32.c の「#if(1) neon test」を参照。 - エラーファイルの修正 (Arm Compiler 6の場合)
下記ファイルがエラーとなるので修正する。
— Source/TransformFunctions/arm_bitreversal2.S
コード修正箇所 «arm_bitreversal2.S» の「/* Arm Compiler 6 */」を参照。
arm_canberra_distance_f32.c
float32_t arm_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize) { float32_t accum=0.0, tmpA, tmpB,diff,sum; uint32_t i,blkCnt; float32x4_t a,b,c,d,accumV; float32x2_t accumV2; int32x4_t isZeroV; float32x4_t zeroV = vdupq_n_f32(0.0); accumV = vdupq_n_f32(0.0); blkCnt = blockSize >> 2; while(blkCnt > 0) { a = vld1q_f32(pA); b = vld1q_f32(pB); c = vabdq_f32(a,b); a = vabsq_f32(a); b = vabsq_f32(b); a = vaddq_f32(a,b); #if(1) // neon test isZeroV = (int32x4_t)vceqq_f32(a,zeroV); #else isZeroV = vceqq_f32(a,zeroV); #endif /* * May divide by zero when a and b have both the same lane at zero. */ a = vinvq_f32(a); /* * Force result of a division by 0 to 0. It the behavior of the * sklearn canberra function. */ #if(1) // neon test a = (float32x4_t)vbicq_s32((int32x4_t)a,isZeroV); #else a = vbicq_s32(a,isZeroV); #endif c = vmulq_f32(c,a); accumV = vaddq_f32(accumV,c); pA += 4; pB += 4; blkCnt --; } == omit == }
HAL_SPI модуль
Для программирования SPI HAL определяет С структуру SPI_HandleTypeDef:
Давайте проанализируем наиболее важные поля данной структуры.
- Instance: указатель на дескриптор SPI, который мы будем использовать. Например, SPI1 — это дескриптор первого SPI интерфейса.
- Init: объект C структуры SPI_InitTypeDef, которая используется для настройки интерфейса, далее мы рассмотрим ее более подробно.
- ptxBuffPtr, pRxBuffPtr: указатели на временные буферы для принимаемых и отправляемых данных SPI. Они используются, когда SPI работает в режиме прерывания и не могут быть изменены из программы пользователя.
- hdmatx, hdmarx: указатели на объекты DMA_HandleTypeDef структуры, используемой, когда SPI работает в режиме с DMA.
Настройка SPI производится с использованием объекта структуры SPI_InitTypeDef:
- Mode: параметр, определяющий в каком режиме, master или slave работает SPI интерфейс. Может принимать два значения SPI_MODE_MASTER и SPI_MODE_SLAVE.
- Direction: параметр, задающий работу SPI интерфейса либо в 4-проводном режиме (2 отдельные линии для входных и выходных данных соответсвенно), либо в 3-проводном режиме (одна I/O линия). Может принимать следующие значения: SPI_DIRECTION_2LINES или полнодуплексный 4-проводной режим; SPI_DIRECTION_2LINES_RXONLY или полудуплексный 4-проводной режим; SPI_DIRECTION_1LINE или полудуплексный 3-проводной режим.
- DataSize: параметр, задающий размер данных, передаваемых по шине SPI. Может принимать два следующих значения: SPI_DATASIZE_8BIT и SPI_DATASIZE_16BIT.
- CLKPolarity: настройка SCK CPOL, принимает значения SPI_POLARITY_LOW (CPOL=0) и SPI_POLARITY_HIGH (CPOL=1).
- CLKPhase: настройка фазы тактового сигнала SCK, принимает также два значения SPI_PHASE_1EDGE (CPHA=0) и SPI_PHASE_2EDGE (CPHA=1).
- NSS: параметр, задающий поведение линии NSS. Принимает значения SPI_NSS_SOFT для программного управления NSS, SPI_NSS_HARD_INPUT и SPI_NSS_HARD_OUTPUT для настройки NSS сигнала в аппаратном режиме.
- BaudRatePrescaler: делитель частоты шины APB, определяет максимальную тактовую частоту линии SCK. Может принимать значения SPI_BAUDRATEPRESCALER_2, SPI_BAUDRATEPRESCALER_4,…,SPI_BAUDRATEPRESCALER_256.
- FirstBit: параметр, определяющий порядок передачи данных по шине SPI: SPI_FIRSTBIT_MSB или SPI_FIRSTBIT_LSB.
- TIMode: включение/выключение режима поддержки протокола TI. Значения: SPI_TIMODE_DISABLE или SPI_TIMODE_ENABLE.
- CRCCalculation и CRCPolynomial: во всех микроконтроллерах STM32 SPI периферия может аппаратно генерировать CRC контрольную сумму. Значение CRC может передаваться последним байтом в режиме передачи или автоматическая проверка на ошибку CRC может быть произведена с последним принятым байтом данных. Значение CRC вычисляется с использованием нечетного программируемого многочлена на каждом бите. Вычисление происходит на определяемом параметрами CPHA и CPOL фронте тактовой частоты каждой выборки. Вычисленное CRC проверяется автоматически в конце блока данных. Когда появляется ошибка между вычисленным значением CRC от принятых данных и CRC, переданной от передающего устройства, устанавливается состояние ошибки. CRC не доступно в режиме работы SPI с DMA в циклическом режиме. Для более подробной информации рекомендуется ознакомиться с референс мануалом на конкретный микроконтроллер.
Как обычно, для конфигурации SPI мы используем функцию:
HAL_StatusTypeDef HAL_SPI_Init (SPI_HandleTypeDef * hspi);
которая принимает в качестве входного параметра указатель на объект структуры SPI_HandleTypeDef, рассмотренной выше.
Создание проекта
Создаем новый проект1986ВЕ92
- Startup_MDR1986BE9x;
- PORT;
- RST_CLK.
Настройки проекта для 1986ВЕ9х
Теперь подключим в проект саму ОСРВ RTOS2. Ниже будут рассмотрены два варианта подключения: автоматическое и ручное.
Автоматическое подключение ОСРВ RTOS2 к программному проекту
RTOS2«Manage Run-Time Environment»
- CMSIS > CORE;
- CMSIS > RTOS2 (API) > Keil RTX5 (вариант Library);
- Device > Startup.
«Manage Run-Time Environment»RTOS2 CMSISRTX_CMx.librtx_lib.cRTX_Config.cRTX_Config.h.
Стоит отметить, что RTX_CMx.lib для ядра Cortex-M1 такой же, как и для ядра Cortex-M0, поэтому, например, для микроконтроллеров 1986ВЕ1Т/1986ВЕ3Т (RISC-ядро, которое схоже с Cortex-M1) подключится файл RTX_CM0.lib. Связано это с тем, что ядра Cortex-M0 и Cortex-M1 имеют одну архитектуру ARMv6-M, а также одинаковый набор инструкций. Убедиться в этом можно здесь ARM Cortex-M instruction variations. Кроме этого, применимость RTX_CM0.lib для ядра Cortex-М1 обозначена в документации к RTOS CMSIS-RTOS RTX Library Files.
rtx_os.h#includeRTX_Config.h«Configuration Wizard»
Ручное подключение ОСРВ RTOS2 к программному проекту
Программное обеспечение МиландрIDE Keil1.5.3RTOS2 «Manage Run-Time Environment»IDE Keil
- C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Source\rtx_lib.c
- C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Library\ARM\RTX_CM0.lib
- C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Config
- RTX_Config.c
- RTX_Config.h
RTX_Config.cRTX_Config.h
При этом важно для корректной сборки не забыть указать компилятору пути до основных файлов RTOS2 во вкладке «C/C++» настроек проекта, как это показано на рисунке 4: