STM32F407(STM32F4-DISCOVERY) - Стандартты емес тәсіл - Стандартты кітапхана бөлігі 1. Макрос анықтамаларын пайдаланып STM32F10x SPL конфигурациялау

Осы уақытқа дейін біз стандартты ядролық кітапхананы - CMSIS қолдандық. Портты қажетті жұмыс режиміне конфигурациялау үшін бізге белгілі бір функцияға жауапты регистрді табу, сонымен қатар осы процеске қатысты басқа ақпаратты үлкен құжат арқылы іздеу керек болды. Таймермен немесе ADC арқылы жұмыс істей бастағанда, жағдай одан да ауыр және әдеттегідей болады. Ондағы регистрлердің саны енгізу/шығару порттарына қарағанда әлдеқайда көп. Қолмен орнатукөп уақытты алады және қателесу мүмкіндігін арттырады. Сондықтан көптеген адамдар стандартты перифериялық кітапханамен жұмыс істеуді жөн көреді - StdPeriph. Ол не береді? Бұл қарапайым - абстракция деңгейі артады, құжаттамаға кіріп, көп жағдайда регистрлер туралы ойлаудың қажеті жоқ. Бұл кітапханада МК перифериясының барлық жұмыс режимдері мен параметрлері құрылымдар түрінде сипатталған. Енді перифериялық құрылғыны конфигурациялау үшін сізге тек толтырылған құрылыммен құрылғыны инициализациялау функциясын шақыру қажет.

Төменде абстракция деңгейлерінің схемалық көрінісі бар сурет берілген.

Микроконтроллердің қалай жұмыс істейтінін көрсету үшін біз CMSIS-пен (ол ядроға «ең жақын») жұмыс істедік. Келесі қадам - ​​стандартты кітапхана, біз оны қазір пайдалануды үйренеміз. Содан кейін құрылғы драйверлері келеді. Олар кез келген құрылғыны басқаруға ыңғайлы бағдарламалық интерфейсті қамтамасыз ететін *.c \ *.h файлдары ретінде түсініледі. Мысалы, бұл курста біз сізге max7219 чипі мен esp8266 WiFi модуліне арналған драйверлерді береміз.

Стандартты жоба келесі файлдарды қамтиды:


Біріншіден, әрине, бұл стандартты кітапханаға ядромен жұмыс істеуге мүмкіндік беретін CMSIS файлдары, біз олар туралы жоғарыда айттық. Екіншіден, стандартты кітапхана файлдары. Үшіншіден, пайдаланушы файлдары.

Кітапхана файлдарын мақсатты MK-ға арналған бетте (біз үшін бұл stm32f10x4), бөлімде табуға болады. Дизайн ресурстары(CooCox IDE ішінде бұл файлдар әзірлеу ортасының репозиторийінен жүктеледі). Әрбір перифериялық құрылғы екі файлға сәйкес келеді - тақырып (*.h) және бастапқы код(*.c). Егжей-тегжейлі сипаттамавеб-сайттағы кітапханамен бірге мұрағатта орналасқан қолдау файлынан табуға болады.

  • stm32f10x_conf.h - кітапхана конфигурация файлы. Пайдаланушы модульдерді қоса немесе ажырата алады.
  • stm32f10x_ppp.h - перифериялық тақырып файлы. Ppp орнына gpio немесе adc болуы мүмкін.
  • stm32f10x_ppp.c - Си тілінде жазылған перифериялық құрылғы драйвері.
  • stm32f10x_it.h - барлық ықтимал үзу өңдеушілерін (олардың прототиптерін) қамтитын тақырып файлы.
  • stm32f10x_it.c — Cortex M3 жүйесіндегі ерекше жағдайларға арналған үзу қызметінің тәртібін (ISR) қамтитын үлгі бастапқы код файлы. Пайдаланушы пайдаланылған перифериялық құрылғылар үшін өзінің жеке ISR қоса алады.

Стандартты кітапхана мен перифериялық құрылғыларда функциялар мен белгілерді атау шарты бар.

  • PPP - ADC сияқты перифериялық құрылғылардың аббревиатурасы.
  • Жүйе, тақырып және бастапқы код файлдары - stm32f10x_ деп бастаңыз.
  • Бір файлда қолданылатын тұрақтылар сол файлда анықталады. Бірден көп файлда қолданылатын тұрақтылар тақырып файлдарында анықталған. Перифериялық кітапханадағы барлық константалар көбіне ЖОҒАРЫ әріппен жазылады.
  • Регистрлер тұрақтылар ретінде қарастырылады және оларды БАС әріптер деп те атайды.
  • Перифериялық арнайы функция атаулары USART_SendData() сияқты аббревиатураны қамтиды.
  • Әрбір перифериялық құрылғыны конфигурациялау үшін PPP_Init() функциясына берілетін PPP_InitTypeDef құрылымы пайдаланылады.
  • Инициализациялау (мәнді әдепкіге орнату) үшін PPP_DeInit() функциясын пайдалануға болады.
  • Перифериялық құрылғыларды қосуға немесе өшіруге мүмкіндік беретін функция PPP_Cmd() деп аталады.
  • Үзуді қосу/өшіру функциясы PPP_ITConfig деп аталады.

МЕН толық тізімкітапхананың қолдау файлын қайта қарауға болады. Енді стандартты перифериялық кітапхана арқылы жыпылықтайтын жарық диодты қайта жазайық!

Жұмысты бастамас бұрын stm32f10x.h файлын қарап, жолды табайық:

#USE_STDPERIPH_DRIVER анықтау

Жүктеп алынған мұрағаттағы кітапхана файлдарын пайдаланып жобаны нөлден бастап конфигурацияласаңыз, онда бұл жолдан түсініктеме алу қажет болады. Бұл стандартты кітапхананы пайдалануға мүмкіндік береді. Бұл анықтама (макрос) препроцессорға stm32f10x_conf.h файлын қосуға бұйрық береді:

#ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h" #endif

Бұл файлда модульдер бар. Егер сізге тек нақтылар қажет болса, қалғандарын өшіріңіз, бұл компиляция кезінде уақытты үнемдейді. Бізге, сіз ойлағандай, RTC және GPIO модульдері қажет (бірақ болашақта бізге _bkp.h, _flash, _pwr.h, _rtc.h, _spi.h, _tim.h, _usart.h қажет болады):

#include "stm32f10x_flash.h" // init_pll() үшін #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h"

Өткен жолы сияқты, алдымен B портының сағатын қосу керек. Бұл stm32f10x_rcc.h файлында жарияланған функция арқылы орындалады:

Жарамсыз RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

FunctionalState нөмірлері stm32f10x.h ішінде анықталған:

Typedef enum (DISABLE = 0, ENABLE = !DISABLE) FunctionalState;

Аяғымызды орнатуға арналған құрылымды жариялайық (оны stm32f10x_gpio.h файлынан таба аласыз):

GPIO_InitTypeDef жарық диоды;

Енді біз оны толтыруымыз керек. Бұл құрылымның мазмұнын қарастырайық:

Typedef құрылымы ( uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; ) GPIO_InitTypeDef;

Барлық қажетті тізімдер мен тұрақтыларды бір файлдан табуға болады. Содан кейін қайта жазылған init_leds() функциясы келесі пішінді алады:

Void led_init() ( // RCC_APB2PeriphClockCmd сағатын қосу(RCC_APB2Periph_GPIOB, ENABLE); // Құрылымды жариялаңыз және оны толтырыңыз GPIO_InitTypeDef LED; LED.GPIO_Pin = GPIO_Pin_0; LED.GPIO_Pin_0; LED.GPIO_ed IO_Mode _Out_PP //; GPIO_Init (GPIOB,&LED) портын инициализациялау;

main() функциясын қайта жазайық:

Int main(void) ( led_init(); while (1) (GPIO_SetBits(GPIOB, GPIO_Pin_0); delay(10000000); GPIO_ResetBits(GPIOB, GPIO_Pin_0); кідіріс(10000000); ) )

Ең бастысы - инициализация тәртібін сезіну: перифериялық сағатты қосыңыз, құрылымды жариялаңыз, құрылымды толтырыңыз, инициализация әдісін шақырыңыз. Басқа перифериялық құрылғылар әдетте осындай жолмен конфигурацияланады.

Бұл жарияланымда мен STMicroelectronics өндіруші компаниясының стандартты перифериялық құрылғыларының кітапханасына негізделген STM32F10x микроконтроллерлерімен жылдам жұмыс істеудің негізгі тармақтарына назар аударуға тырысамын.

Мақалада Eclipse CDT өңдеу ортасы ретінде пайдаланылады. Негізгі назар бағдарлама кодында болатындықтан, Code::Blocks ішіндегі барлық манипуляцияларды қауіпсіз орындауға болады.

ARM микроконтроллерлерінің жалпы жоба құрылымы менің мақаламда сипатталған.

Мұнда мен сізге ARM микроконтроллерлеріне (әсіресе STM32F10x) арналған жобаны құру үшін сілтеме сценарийі мен C-Startup файлы қажет екенін қысқаша еске саламын.

Байланыстырушы скрипт микроконтроллердің жадында программалық код пен мәліметтерді орналастыру нұсқаулары бар файл болып табылады. Ол бағдарлама кодын Flash бағдарлама жадына немесе SRAM деректер жадына жүктеуге бұйрық бере алады.

Бағдарламаның және деректер жадысының әртүрлі көлемі бар микроконтроллерлер әртүрлі орналасу сценарийлерін қажет етеді. Оларды микроконтроллер өндірушісінен алуға болады - STMicroelectronics.
STM32F10x стандартты перифериялық кітапханасын ARM_Toolchain/Lib/stm32f10x_stdperiph_lib.zip мұрағатынан шығарыңыз.
Онда әртүрлі әзірлеу орталарына арналған мысал жобалары бар (IAR EWB, Keil uVision, Atollic True Studio және т.б.). Біз үшін ең жақыны - Atollic True Studio, өйткені бұл Eclipse модификациясы.
Project/StdPeriph_Template/TrueSTUDIO каталогына өтіңіз, онда бірнеше ішкі каталогтар бар, олардың атаулары STM3210x-EVAL әзірлеу тақталарының атауларына сәйкес келеді.

Осы тақталардың қайсысы сіздікі сияқты бірдей микроконтроллер желісін қолданатынын табыңыз. Сәйкес каталогтан stm32_flash.ld файлын жобаңызға көшіріңіз.

Сондай-ақ пайдаланылатын микроконтроллерге сәйкес бағдарлама мен деректер жадының көлемі ғана өзгертілетін әмбебап сценарийді жасауға болады.

STM32 микроконтроллерлеріне арналған іске қосу коды (C-Startup) C немесе Assembler тілінде жазылуы мүмкін.
STM32F10x стандартты перифериялық кітапханасы (қысқартылған STM32F10x SPL) қателері үшін жиі сынға ұшырағанымен, бұл STM32 бағдарламалауды бастаған кезде жылдам бастаудың ең оңай жолы.
Бірақ сіз әрқашан балама түрі болғанын қалайсыз. Шындығында, олардың көпшілігі бар, мысалы, ассемблер тілінде бағдарламалау :)

Бұл ең қиын және мағынасыз жол. Екінші әдіс - әртүрлі микроконтроллердің перифериялық құрылғыларына қол жеткізу үшін Си тілінің құрылымдарына қол жеткізу үшін синтаксисті қамтамасыз ететін CMSIS кітапханасын пайдалану. Ең қарапайым және логикалық әдіс (менің ойымша) кітапханаларды пайдалану.

Егер сіз STM32F10x SPL-ге үзілді-кесілді қарсы болсаңыз, онда сіз үшін басқа балама бар - libopencm3 кітапханасы. Онда мысалдардың негізгі бөлігі STM32F10x микроконтроллерлерінің негізгі серияларының айналасында шоғырланған, бірақ басқа серияларға (STM32F2xx/4xx) мысалдар пайда болғанша уақыт мәселесі ғана. Сіз әрқашан libopencm3 жобасына қосыла аласыз және бұл процесті жылдамдата аласыз.

CMSIS стандарты бағдарламаларда пайдалану үшін қосымша болып табылады.
Си программалау тілінде HAL (Аппараттық абстракция қабаты) деңгейін енгізу үшін біраз күш пен уақыт жұмсау арқылы онсыз да жасай аласыз.

Кейбір жағдайларда бұл әдіс жалғыз болуы мүмкін қол жетімді жолмен. Мысалы, ұйымыңыз ARM әзірлеген есептеу ядроларына және салаға тән перифериялық құрылғыларға негізделген реттелетін чиптерді пайдаланады.

Немесе ARM9 ядросы бар микроконтроллерлерге арналған бағдарламалық құралды C тілінде енгізу қажет, ол үшін өндірушілер дайын өнімді пайдалануға назар аударады. операциялық жүйелер(Linux, QNX, Windows CE), сондықтан өндірушілер Си тілінде бағдарламалау үшін кітапханаларды таза түрде немесе жеңілірек RTOS жүйесімен бірге қамтамасыз ете алмайды.

Бақытымызға орай, Cortex-M3 ядросына негізделген микроконтроллерлерді өндірушілер әзірлеушілерге көптеген кодтық кітапханаларды ұсынады. Бұл STM32 микроконтроллерлеріне де қатысты.
STM32F10x SPL кітапханасын қарастыруды жалғастырайық. Біз оны мысал арқылы қарастырамыз.
Не болып жатқанын толық түсіну үшін осы мысалды ашуға немесе өз жобаңызды нөлден жасауға болады.

Екінші жағдайда мен қажетті қадамдарды тізімдеймін:

  • Eclipse бағдарламасында жаңа бос жоба жасаңыз
  • Құрастыру сценарийін көшіріп, жобаға файлды бастаңыз
  • Жаңасын жасаңыз немесе Makefile үлгісін көшіріңіз
  • Үлгі ретінде менің мысалдағы Makefile файлын пайдаланған кезде жобаның ішінде src, inc, bin, obj каталогтарын жасау керек және bin және obj каталогтарында Debug және Release ішкі каталогтарын жасау керек.
  • CMSIS және STM32F10x SPL кітапханаларынан қажетті бастапқы және тақырып файлдарын көшіріңіз.
  • Егер қолданылса, Makefile үлгісінің пайдаланушы параметрлері бөліміне қажетті өзгерістерді енгізіңіз.
  • Eclipse «мақсат жасау» терезесінде «Debug», «cleanDebug», «Release», «cleanRelease», «Program» жаңа мақсаттарын жасаңыз.
  • «Debug» мақсатын іске қосыңыз және оның орындалуын «Консоль» терезесінде бақылаңыз.

Материалды жақсырақ түсіну үшін мен мақаланы бірнеше тәуелсіз абзацтарға бөлдім, олардың әрқайсысы STM32F10x SPL кітапханасымен жұмыс істеудің бір ғана аспектісін сипаттайды.

Макрос анықтамаларын пайдаланып STM32F10x SPL конфигурациялау

Кітапхананы конфигурациялау үшін алдын ала анықталған макрос мәндері пайдаланылады, біз қазір оларды қарастырамыз.
Оларды препроцессор директивасы арқылы тақырып файлдарының ішіне орнатуға болады #анықтаунемесе кілт арқылы макроанықтамалардың мәндерін өткізіңіз GCC компиляторы.
Менің мысалда мен екінші әдісті қолданамын.
Makefile айнымалысында АНЫҚТАУ STM32F10x SPL кітапханасын құрастыруға қажетті макростарды қамтиды.
Макро анықтамасы STM32F10X_MDпайдаланылатын микроконтроллердің желіге жататынын анықтайды Орташа тығыздық.
Бұған 64-тен 128 кБ дейінгі флеш жады бар микроконтроллерлер кіреді.
Төмендегі кестеде микроконтроллерлердің әртүрлі сериялары үшін макростардың атаулары берілген:

Серия аты Макро Сипаттама
Төмен тығыздық мән сызығы STM32F10X_LD_VL флэш жады сыйымдылығы 16 - 32 кБ
Төмен тығыздық STM32F10X_LD
флэш жады сыйымдылығы 16 - 32 кБ
Орташа тығыздық мән сызығы STM32F10X_MD_VL Flash - жады
64 - 128 кБ
Орташа тығыздық STM32F10X_MD 64 - 128 кБ флэш жады бар STM32F101xx, STM32F102xx, STM32F103xx серияларының микроконтроллерлері
Жоғары тығыздық мән сызығы STM32F10X_HD_VL көлемі бар STM32F100xx сериялы микроконтроллерлер
Flash - жады 256 - 512 кБ
Жоғары тығыздық STM32F10X_HD көлемімен
Флэш жады 256 - 512 кБ
XL-тығыздығы STM32F10X_XL
Флэш жады 512 - 1024 кБ
Қосылу сызығы STM32F10X_CL

Микроконтроллердің тактілік жиілігін орнату үшін system_stm32f10x.c файлында қажетті тактілік жиілік мәні бар макросқа түсініктеме беру керек.

#анықталған болса (STM32F10X_LD_VL) || (анықталған STM32F10X_MD_VL) || (анықталған STM32F10X_HD_VL) #define SYSCLK_FREQ_24MHz 24000000 #else /* #define SYSCLK_FREQ_HSE HSE_VALUE *//* #define SYSCLK_FREQ_24MHz /SYSC003/SYSC_03 20 МГц 360 00000 */ /* #анықтау SYSCLK_FREQ_48MHz 48000000 */ /* #анықтау SYSCLK_FREQ_56MHz 56000000 * / #SYSCLK_FREQ_72MHz анықтау 72000000 #endif

#анықталған болса (STM32F10X_LD_VL) || (анықталған STM32F10X_MD_VL) || (анықталған STM32F10X_HD_VL)

/* #SYSCLK_FREQ_HSE HSE_VALUE анықтау */

#SYSCLK_FREQ_24MHz 24000000 анықтау

#басқа

/* #SYSCLK_FREQ_HSE HSE_VALUE анықтау */

/* #define SYSCLK_FREQ_24MHz 24000000 */

/* #define SYSCLK_FREQ_36MHz 36000000 */

/* #define SYSCLK_FREQ_48MHz 48000000 */

/* #define SYSCLK_FREQ_56MHz 56000000 */

#SYSCLK_FREQ_72MHz 72000000 анықтау

#endif

Мақсатты пайдалану кварц резонаторыбарлық негізгі үшін 8 МГц жиілігімен
25 МГц кварц резонаторын орнату қажет Connectivity желісін қоспағанда, микроконтроллерлер сериясы.
Егер басқа жиілік мәндері бар кварц резонаторларын пайдалансаңыз, stm32f10x.h тақырып файлындағы HSE_VALUE макросының мәнін өзгертіп, барлық тәуелді функцияларды сәйкесінше бейімдеуіңіз керек.
USE_STDPERIPH_DRIVER макросының мақсатын болжау қиын емес - STM32F10x стандартты перифериялық кітапханасын пайдалану.
USE_FULL_ASSERT – бағдарламаны жөндеу үшін ASSERT макросын пайдаланыңыз.

Кітапханадағы assert_param макросын пайдалану

Барлық STM32F10x SPL кітапхана функциялары аргументтерін тексеру үшін assert_param макросын пайдаланады.
Бұл макрос нөлге теңдік үшін тексерілетін функция аргументі бар өрнекті тексереді. Егер өрнектің мәні нөлге тең болса, онда assert_failed аргумент қатесін өңдеу функциясы шақырылады, әйтпесе (өрнек нөл емес), аргументтерді тексеру сәтті орындалады.
Бағдарламаңызда assert_failed функциясын енгізу керек.
Ол қате туралы хабарды, файл атауын және қатені тудырған код жолының нөмірін көрсетеді.
debug_printf макросы стандартты new_lib кітапханасын немесе, мысалы, Чен мырзаның кітапханасын пайдаланып USART арқылы шығара алады.

#define debug_printf xprintf /* printf */ #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* файл, uint32_t жолы) ( debug_printf("Қате параметр мәні: %s файлы %d\r\n жолында", файл, (int)line) while (1) ( ) )/* assert_failed */ #endif/*USE_FULL_ASSERT*/

#define debug_printf xprintf /* printf */

#ifdef ҚОЛДАНУ_ТОЛЫҚ_АСЕРТ

void assert_failed (uint8_t * файл, uint32_t жолы)

debug_printf( "Қате параметрлер мәні: %s файлы %d\r\n жолында", файл , (int ) жолы );

while(1)

) /* assert_failed */

#endif/*ТОЛЫҚ_АҚСЕРТ ҚОЛДАНУ*/

Кодыңызда іске асырылған assert_failed функциясы USE_FULL_ASSERT макросы жарияланған кезде ғана пайдаланылады. Әйтпесе, барлық түзету коды көзден шығарылады. Бұл функция stm32f10x_conf.h драйвер кітапханасының параметрлері тақырып файлында жүзеге асырылады.

#ifdef USE_FULL_ASSERT #define assert_param(expr) ((expr) ? (void)0: assert_failed((uint8_t *)__FILE__, __LINE__)) void assert_failed(uint8_t* файл, uint32_t жолы); #else #define assert_param(expr) ((void)0) #endif /* USE_FULL_ASSERT */

#ifdef ҚОЛДАНУ_ТОЛЫҚ_АСЕРТ

#define assert_param(expr) ((expr) ? (void)0: assert_failed((uint8_t *)__FILE__, __LINE__))

void assert_failed (uint8_t * файл, uint32_t жолы);

#басқа

#define assert_param(expr) ((void)0)

#endif /* USE_FULL_ASSERT */

Мұнда түсіндіретін көп нәрсе жоқ. assert_param пайдалану мысалын қарастырайық.

void set_param(uint8_t * param, uint8_t мәні) (assert_param(param != NULL); *парам = мән; )/*set_param*/

void set_param (uint8_t * param, uint8_t мәні)

assert_param (парам != NULL );

* параметр = мән;

) /*set_param*/

Функция параметр мәнін аргумент ретінде берілген көрсеткіш арқылы орнатады. Егер USE_FULL_ASSERT макросы жарияланбаса, онда жолдар деп болжауға болады.
assert_param(param != NULL) жай ғана кодта жоқ, әйтпесе параметр осы анықтамада тексеріледі.
Көрсеткіш анықталмаған болса, онда мән параметрі != NULL жалған болады және USART арқылы файл атауын және қатесі бар жол нөмірін шығаратын assert_failed функциясы іске қосылады, содан кейін цикл, осылайша мәннің болуын болдырмайды. жадтағы анықталмаған адреске тағайындалады.
Кодыңызда assert_param макросын пайдалану міндетті емес, бірақ кітапхана кодында
STM32F10x SPL ол барлық жерде қолданылады.
set_param функциясын assert_param қолданбай аргумент қатесін тексеру арқылы жүзеге асыруға болады.

#define ERROR (-1) #define OK (0) int set_param(uint8_t * param, uint8_t мәні) (int r = ERROR; if (param == NULL) қайтару r; *param = мән; r = OK; қайтару r )/*set_param*/

#ҚАТЕні анықтау (-1)

#define OK (0)

int set_param (uint8_t * param, uint8_t мәні)

int r = ERROR;

егер (парам == NULL )

қайтару r;

* параметр = мән;

r = Жарайды;

қайтару r;

) /*set_param*/

STM32F10x SPL кітапханасындағы C-Startup файлы

Бастау кодында микроконтроллер бастапқыда инициализацияланады, стек конфигурацияланады, BSS бөлімі қалпына келтіріледі және main() негізгі функциясы шақырылады.
Бастапқы кодтың STM32F10x SPL кітапханасына тікелей қатысы жоқ. Дегенмен, бұл жүктеу кодында бағдарламаның main() функциясын шақырмас бұрын, CMSIS бөлігі болып табылатын микроконтроллерді инициализациялау SystemInit() функциясы шақырылады.
Оны CMSIS кітапханасында оңай табуға болады.
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO каталогына өтіп, қажетті файлды көшіріңіз. Жобаңызда қолданылатын микроконтроллердің қай желіге жататынын анықтау ғана қалады.
Ол үшін келесі кестені қараңыз:

Серия аты Файл атауы Сипаттама
Төмен тығыздық мән сызығы startup_stm32f10x_ld_vl.s көлемі бар STM32F100xx сериялы микроконтроллерлер
Флэш жады 16 - 32 кБ
Төмен тығыздық startup_stm32f10x_ld.s STM32F101xx, STM32F102xx, STM32F103xx микроконтроллерлер сериялары
флэш жады сыйымдылығы 16 - 32 кБ
Орташа тығыздық мән сызығы startup_stm32f10x_md_vl.s STM32F100xx сериялы микроконтроллерлер
Орташа тығыздық startup_stm32f10x_md.s STM32F101xx, STM32F102xx, STM32F103xx микроконтроллерлер сериялары
флэш жады сыйымдылығы 64 - 128 кБ
Жоғары тығыздық мән сызығы startup_stm32f10x_hd_vl.s STM32F100xx сериялы микроконтроллерлер
Жоғары тығыздық startup_stm32f10x_hd.s STM32F101xx, STM32F103xx сериялы микроконтроллерлер
Флэш жады сыйымдылығы 256 - 512 кБ
XL-тығыздығы startup_stm32f10x_xl.s STM32F101xx, STM32F103xx сериялы микроконтроллерлер
флэш жады сыйымдылығы 512 - 1024 кБ
Қосылу сызығы startup_stm32f10x_cl.s STM32F105xx және STM32F107xx серияларының микроконтроллерлері

Іске қосу файлында үзіліс және ерекшелік векторының өңдегіштерінің атаулары бар, бірақ тек қалпына келтіру векторының өңдеушісі ғана жүзеге асырылады, оның ішінде негізгі() функциясын шақыру алдында барлық бастапқы инициализация орындалады.
Барлық басқа ерекшелік өңдеушілердің орындалуына қолданбалы бағдарламашы жауапты. Егер сіздің бағдарламаңыз өңдеушілерді қолданбаса, оларды тіркеудің қажеті жоқ. Ерекшелік орын алса, әдепкі өңдеуші пайдаланылады - бағдарлама кодын айналдыру.

CMSIS кітапханасының құрамы

Осы жарияланымда бұрын жазылғандай, CMSIS кітапханасы Си тілінің құрылымдарының элементтерін пайдаланып микроконтроллердің перифериялық модульдеріне қол жеткізуді қамтамасыз етеді.
Бұл кітапхананы іске асыру екі бөлікке бөлінеді. Бірінші бөлік Cortex-M3 ядросының перифериясына қол жеткізуді қамтамасыз етеді, ал екінші бөлігі периферияға қол жеткізуді қамтамасыз етеді. арнайы модельмикроконтроллер.
CMSIS стандарты Cortex-M3 ядросы бар барлық микроконтроллерлер үшін бірдей болғандықтан, бірінші бөліктің орындалуы барлық өндірушілер үшін бірдей болады, бірақ әрбір өндіруші үшін екінші бөлік әртүрлі болады.
CMSIS бірнеше тақырып және бастапқы файлдарды қамтиды. Бірінші бөлім файлдарды қамтиды:

  • core_cm3.h
  • core_cm3.c

CMSIS екінші бөлігі C-Startup файлын, сондай-ақ келесі файлдарды қамтиды:

  • stm32f10x.h
  • system_stm32f10x.h
  • system_stm32f10x.c

stm32f10x.h тақырып файлында stm32f10x микроконтроллерлерінің перифериялық модульдеріне қол жеткізуге арналған макрос анықтамалары бар.
system_stm32f10x.h және system_stm32f10x.c файлдары микроконтроллердің бастапқы инициализациясын жүзеге асырады.

STM32F10x SPL кітапханасының құрамы және конфигурациясы

Кітапхана stm32f10x_ префиксі бар перифериялық модульдермен бірдей бастапқы және тақырып файлдарынан тұрады.
Мысалы, USART модулімен өзара әрекеттесу stm32f10x_usart.h және stm32f10x_usart.c файлдарында қамтылған.
Кітапхана элементтерін атауға арналған конвенциялар және құжаттамада сипатталған кейбір кодтау ережелері бар.
Кітапханада перифериялық микроконтроллер модульдері үшін драйверлерді іске асыру бар.
Кітапхана элементтерінің атаулары перифериялық модульдер үшін келесі қысқартуларды пайдаланады:

Акроним Перифериялық модуль
ADC аналогты-сандық түрлендіргіш
BKP резервтік регистрлер
БОЛАДЫ CAN интерфейсі
ОСК тұтыну реттегіші
CRC бақылау сомасын есептеу модулі
DAC сандық-аналогтық түрлендіргіш
DBGMCU микроконтроллерді жөндеу
DMA жадқа тікелей кіру контроллері
EXTI сыртқы үзу контроллері
FSMC сыртқы жад контроллері
ЖАРЫҚ Flash бағдарламасының жадысы
GPIO жалпы мақсаттағы енгізу/шығару порттары
I2C I2C интерфейсі
I2S I2S (дыбыс) интерфейсі
IWDG тәуелсіз бақылаушы таймері
NVIC кірістірілген үзу контроллері
PWR қуат контроллері
RCC қалпына келтіру және сағат контроллері
RTC нақты уақыт контроллері (сағат)
SDIO SDIO интерфейсі
SPI SPI интерфейсі
SysTick жүйелік таймер
TIM негізгі немесе қосымша таймер
USART әмбебап сериялық синхронды-асинхронды
қабылдағыш
WWDG терезе күзетшісі

Осы аббревиатуралардың негізінде кітапхананың бағдарламалық модульдерінің атаулары қалыптасады. Кітапханадағы барлық модульдерді пайдаланудың қажеті жоқ.
Жобада тек қажетті модульдерді пайдалану үшін кітапхана конфигурациялануы керек.
Осы мақсаттар үшін STM32F10x SPL кітапханасын пайдаланатын әрбір жобада stm32f10x_conf.h тақырып файлы болуы керек.

#include "stm32f10x_gpio.h" //#include "stm32f10x_i2c.h" //#include "stm32f10x_iwdg.h" //#include "stm32f10x_pwr.h" #include "stm32f10x_pwr.h" #include "stm32fcc._r"x"

#қосуға "stm32f10x_gpio.h"

//#include "stm32f10x_i2c.h"

//#include "stm32f10x_iwdg.h"

//#include "stm32f10x_pwr.h"

#қосуға "stm32f10x_rcc.h"

Қажетті модульді қосу үшін директиваға түсініктеме алу керек #қосусәйкес тақырып файлдарымен.
stm32f10x_conf.h тақырып файлы stm32f10x.h ішіне кіреді, сондықтан STM32F10x SPL кітапханасының функцияларын пайдалану үшін бастапқы кодқа тек бір ғана stm32f10x.h тақырып файлын қосу керек.

// stm32f10x.h файлында #ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h" #endif

Қайталап айтамын, жоба сонымен қатар USE_STDPERIPH_DRIVER, USE_FULL_ASSERT макростарын және пайдаланылған микроконтроллердің сериясын көрсететін макросты анықтауы керек (мысалы, Орташа тығыздық сызығы үшін STM32F10X_MD).
Егер стандартты кварц жиілігі мәнін пайдалансаңыз және контроллер 72 МГц максималды тактілік жиілікте жұмыс істесе, басқа ештеңені өзгертудің қажеті жоқ.
Makefile файлына құрастыру үшін кітапхана файлдарының тізімін қосу керек.
Мысалы:

SRC += stm32f10x_rcc.c SRC += stm32f10x_gpio.c

SRC += stm32f10x_rcc . в

SRC += stm32f10x_gpio. в

STM32F10x SPL кітапханасын пайдалану. Жұмыс механизмдері

Перифериялық кітапхананы пайдаланып бағдарламалауды бастаудың ең оңай жолы - кітапханамен бірге берілген мысалдарды қарау. Дегенмен, осы мысалдардың кодын түсіну үшін сізде кітапхананы пайдалану және синтаксис туралы негізгі білім болуы керек.
Бұрын аталған перифериялық микроконтроллердің барлық модульдері бастапқыда өшірілген, оларға тактілік сигнал берілмейді және олар электр энергиясын тұтынбайды.
Перифериялық модульді пайдалану үшін алдымен оған тактілік сигнал беру керек. Сағат сигналы RCC сағаты мен қалпына келтіру модулімен қамтамасыз етіледі.
Осы мақсатта кітапхана келесі функцияларды орындайды:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ҚОСУ); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ҚОСУ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ҚОСУ);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ҚОСУ);

RCC_APB2PeriphClockCmd (RCC_APB2Periph_PPPx, ҚОСУ) ;

RCC_APB1PeriphClockCmd (RCC_APB1Periph_PPPx, ҚОСУ) ;

Мұнда PPP модуль актонимінің атын білдіреді (мысалы, ADC немесе USART), ал x - перифериялық модульдің нөмірі.
Ең алдымен, сіз пайдаланып жатқан модуль қай автобусқа қосылғанын анықтауыңыз керек.
Барлығы Cortex-M3 негізгі архитектурасы бар микроконтроллерлерде үш автобус бар:
нұсқаулық шинасы, деректер шинасы және жүйелік шинасы. Нұсқау шинасы ядроны Flash бағдарламасының жадысына қосады. Деректер мен жүйелік шиналар негізгі жиілікте жұмыс істейтін AHB (ARM Hi-Speed ​​​​Bus) шиналық матрицасына біріктірілген. Дегенмен, AHB шинасы жиілігін бөлгіштерді орнату арқылы азайтуға болады. AHB шинасы ядро ​​және DMA модулі сияқты жоғары жылдамдықты құрылғыларды қосады.
Енгізу/шығару құрылғылары AHB шинасына APB1 және APB2 аралық шиналары (ARM Peripheral Bus) арқылы қосылады.
APB2 шинасының максималды жұмыс жиілігі 72 МГц, APB1 шинасының жиілігі
36 МГц-пен шектелген.
Сіз пайдаланып жатқан перифериялық модуль автобустардың қайсысына қосылғанын құжаттамадан біле аласыз немесе stm32f10x_rcc.h тақырып файлын қараңыз.
Бұл файлды ашып, RCC_AHBPeriph, RCC_APB1Periph және RCC_APB2Periph мәндерін ретімен іздеңіз.

#анықтаңыз RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) #анықтаңыз RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) #анықтаңыз RCC_AHBPeriph_SRAM ((uint32_t)0x00000000 RCC_0000 ((uint32_t )0x00000010) #анықтау RCC_AHBPeriph_CRC ((uint32_t)0x00000040)

#анықтау RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001)

#анықтау RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002)

#RCC_AHBPeriph_SRAM анықтау ((uint32_t)0x00000004)

#RCC_AHBPeriph_FLITF анықтау ((uint32_t)0x00000010)

#RCC_AHBPeriph_CRC анықтау ((uint32_t)0x00000040)

Макростардың атаулары бойынша қандай модульдер қай автобустарға қосылғанын анықтаймыз. Сондай-ақ, қай шинаның үшеуінің біріне жататынын анықтау үшін ақыл-ойды қолдануға болады. Мысалы, USART модулі енгізу/шығару құрылғысы болып табылады, яғни ол APB шиналарының біріне қосылған. USART өте төмен жылдамдықты интерфейс, сондықтан ол APB1 шинасына қосылған болуы мүмкін.

#анықтаңыз RCC_APB1Periph_USART2 ((uint32_t)0x00020000) #анықтаңыз RCC_APB1Periph_USART3 ((uint32_t)0x00040000) #анықтаңыз RCC_APB1Periph_UART4 ((uint32_t)0x0000000000000 RCC ph_UART 5 ((uint32_t)0x00100000)

Перифериялық модульге сағат сигналын жібергеннен кейін инициализация функциясын шақыру арқылы оның параметрлерін конфигурациялауға болады:

PPP_Init(PPP, &PPP_InitStructure);

PPP_Init (PPP, & amp; PPP_InitStructure);

Перифериялық модульді инициализациялау үшін көптеген параметрлерді инициализациялау функциясына беру керек болғандықтан, құрылымға көрсеткіш аргумент ретінде пайдаланылады. Құрылымның өзі инициализациялау функциясын шақырмас бұрын жадта құрылуы керек, құрылымның элементтеріне қажетті мәндер тағайындалуы керек:

PPP_InitTypeDef PPP_InitStructure = (val1, val2, ..., valN);/* жарияланған кезде құрылымды инициализациялау */

Сіз алдымен құрылым жасай аласыз, содан кейін оның элементтеріне қажетті мәндерді тағайындай аласыз:

PPP_InitTypeDef PPP_InitStructure; PPP_InitStructure.member1 = val1; PPP_InitStructure.member2 = val2; PPP_InitStructure.memberN = valN;

PPP_InitTypeDef PPP_InitStructure;

PPP_InitStructure. мүше1 = val1;

PPP_InitStructure. мүше2 = val2;

PPP_InitStructure. мүшеN = valN;

stm32f10xQuickstart жобасынан мысалды қарастырайық:

GPIO_InitTypeDef GPIO_InitStructure; #ifdef USE_STM32H_103 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ҚОСУ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed ​​= GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitTypeDef GPIO_InitStructure;

#ifdef USE_STM32H_103

RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ҚОСУ) ;

GPIO_InitStructure. GPIO_Pin = GPIO_Pin_12 ;

GPIO_InitStructure. GPIO_Speed ​​= GPIO_Speed_50MHz;

GPIO_InitStructure. GPIO_Mode = GPIO_Mode_Out_PP ;

GPIO_Init(GPIOC, & GPIO_InitStructure);

GPIO_InitStructure құрылымының элементтеріне пин нөмірі, порттың режимі және жылдамдығының мәні тағайындалады.
GPIO_Init функциясын шақыру арқылы GPIOC портының 12 жолы инициализацияланады.
GPIO_Init функциясының бірінші аргументі GPIO_TypeDef құрылымына көрсеткішке түрлендірілетін GPIOC перифериялық құрылғысының жады аймағының көрсеткіші болып табылады.

// stm32f10x.h #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #анықтау GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #анықтау APB2PERIPH_BASE (PERIPH_BASE + 0x1000ine PER_define.) 00000 typedef) құрылымы ( __IO uint32_t CRL; __IO uint32_t CRH __IO uint32_t ODR __IO uint32_t LCKR;

// stm32f10x.h

#GPIOC анықтау ((GPIO_TypeDef *) GPIOC_BASE)

#GPIOC_BASE анықтау (APB2PERIPH_BASE + 0x1000)

#APB2PERIPH_BASE анықтау (PERIPH_BASE + 0x10000)

#PERIPH_BASE анықтау ((uint32_t)0x40000000)

typedef құрылымы

IO uint32_t CRL ;

IO uint32_t CRH ;

IO uint32_t IDR ;

IO uint32_t ODR ;

IO uint32_t BSRR ;

IO uint32_t BRR ;

IO uint32_t LCKR ;

) GPIO_TypeDef;

GPIO_InitStructure құрылымы тақырып файлында сипатталған GPIO_InitTypeDef типті
stm32f10x_gpio.h:

//stm32f10x_gpio.h typedef құрылымы ( uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; )GPIO_InitTypeDef; typedef enum (GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz )GPIOSpeed_TypeDef; typedef enum ( GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_xOD = GPIO_PPOD_0, 1C , GPIO_Mode_AF_PP = 0x18 )GPIOMode_TypeDef;

//stm32f10x_gpio.h

typedef құрылымы

uint16_t GPIO_Pin;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOMode_TypeDef GPIO_Mode;

) GPIO_InitTypeDef;

typedef нөмірлері

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

) GPIOSpeed_TypeDef;

typedef нөмірлері

(GPIO_Mode_AIN = 0x0,

GPIO_Mode_IN_FLOATING = 0x04,

GPIO_Mode_IPD = 0x28,

GPIO_Mode_IPU = 0x48,

GPIO_Mode_Out_OD = 0x14,

GPIO_Mode_Out_PP = 0x10,

GPIO_Mode_AF_OD = 0x1C,

GPIO_Mode_AF_PP = 0x18

) GPIOMode_TypeDef;

Көріп отырғаныңыздай, инициализацияланған құрылымның деректер типтері ретінде пайдалануға болады реттелетін түрлері, GPIOSpeed_TypeDef сияқты және GPIOMode_TypeDef сияқты перифериялық регистрлерді инициализациялау ыңғайлылығы үшін арнайы мәндері бар деректер түрлері.
Әрбір GPIO істікшесін конфигурациялау үшін 4 бит бөлінген.
Келесі суретте GPIO нөлдік биті пішімі көрсетілген:

Режим – шығыс жұмыс режимі (кіріс/шығыс). Дәлірек айтқанда, бұл мәндер шығыс порттары шығыс сигналының максималды жиілігінде шектеулер болғандықтан конфигурацияланған порттар;

Режим Сипаттама
00 Кіру
01 шығыс жиілігі 10 МГц дейін
10 шығу жиілігі 2 МГц дейін
11 шығу жиілігі 50 МГц дейін

CNF – шығыс конфигурация биттері. Жұмыс режиміне байланысты:

Бұл конфигурация тізілімінің құрылымымен конфигурацияның барлық биттерін өзіңіз орнату өте қолайсыз болатынымен келісіңіз. Мұны GPIO_Init кітапханасы функциясы арқылы орындау әлдеқайда оңай болады.
Перифериялық модульді іске қосқаннан кейін оны PPP_Cmd функциясы арқылы белсендіру керек:

PPP_Cmd(PPP, ҚОСУ);

PPP_Cmd(PPP, ҚОСУ);

Бұл функция GPIO модульдері үшін жоқ, инициализациядан кейін GPIO түйреуіштерін бірден пайдалануға болады. Кітапхана тек микроконтроллердің аппараттық құралына интерфейсті қамтамасыз ететінін есте ұстаған жөн. Аппараттық модульде белсендіру/өшіру жалаушасы болмаса, функция шақырылады PPP_Cmd(PPP, ҚОСУ)мүмкін емес.
Шығу режимінде GPIOx істікшелі күйін басқару және кіріс немесе шығыс режимінде мәнді оқу үшін кітапхана келесі функцияларды қамтамасыз етеді:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

void GPIO_SetBits (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin) ;

uint16_tGPIO_ReadOutputData(GPIO_TypeDef* GPIOx) ;

uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin) ;

uint16_tGPIO_ReadInputData(GPIO_TypeDef* GPIOx) ;

Қалған перифериялық модульдер дәл осылай конфигурацияланады және жұмыс істейді. Дегенмен, нақты аппараттық модульдің ерекшеліктеріне байланысты кейбір айырмашылықтар бар, сондықтан мен алдымен STM32F10x SPL кітапханасы үшін таңдалған модульді пайдалану мысалдарын қарауды ұсынамын.

Үзілістерді және ерекше жағдайларды өңдеу

Cortex-M3 өзегі кірістірілген векторланған үзу контроллерін қамтиды. Контроллер процессор ядросының үзілістерін тудыруы мүмкін 240 көзге дейін қолдайды. Белгілі бір микроконтроллер үлгісінде мүмкін болатын 240 вектордың қаншасы орындалатыны өндірушіге байланысты. Stm32f10x микроконтроллерлерінде осы векторлардың 43-ке дейін болуы мүмкін. Бұл үзу сызықтары маскирленетін деп аталады. Бұған қоса, Cortex-M3 негізгі үзілістерінің 15 векторы және бір сыртқы маскаланбайтын EXTI үзілуі бар.
Контроллер кірістірілген үзулерді қолдайды, мұнда бір өңдегіште басқа үзу орын алуы мүмкін. Осыған байланысты әрбір үзу көзінің өзіндік басымдығы бар. 16 үзу басымдылық деңгейіне қолдау көрсетіледі.
Cortex-M3 негізгі үзіліс векторлары ең жоғары басым мәндерге ие.
Үзілістің ең жоғары үш деңгейі векторларға тағайындалады және оларды өзгерту мүмкін емес:

Сан Өңдеуші Басымдық Сипаттама
1 Reset_Handler -3(ең жоғары) Векторды қалпына келтіру
2 NMI_Handler -2 Маскаланбайтын үзу
3 HardFault_Handler -1 Төтенше жағдайлар

Барлық басқа үзіліс векторларына 0-ден 15-ке дейінгі басымдық деңгейлері тағайындалуы мүмкін.
Ең жоғары басымдық деңгейі төменгі мәнге сәйкес келеді. Басымдық деңгейі жеке векторға ғана емес, сонымен қатар векторлардың бүкіл тобына да тағайындалуы мүмкін. Бұл мүмкіндік үзіліс векторларының көп санымен жұмыс істеуді жеңілдетеді.
Басымдылық тобын орнату үшін STM32F10x SPL кітапханасының функциясы пайдаланылады.

Ұзақ уақыт бойы, тіпті өте ұзақ уақыт бойы, біздің мақалада жаңа мақалалар болған жоқ, сондықтан қуып жетудің уақыты келді 😉 Бүгін біз STM32F4 зерттеуді бастаймыз. Мүмкін, біз осы контроллерлер үшін жаңа жоба жасаудан бастайтын шығармыз, бірақ шынымды айтсам, мен бұл туралы мақала жазғым келмеді, өйткені жаңа жобамұнда ол, негізінен, STM32F103 () сияқты жасалады. Бірақ әлі де STM32F4-де кейбір қиындықтар туындайды, сондықтан осы процесті егжей-тегжейлі қарастырайық)

Сонымен, Кейлді іске қосыңыз, жаңа жоба жасаңыз - Жоба -> Жаңа uVision жобасы.Біз жаңа жобаны кейбір қалтаға сақтаймыз, содан кейін бізден пайдаланылатын микроконтроллерді таңдау сұралады. Ал, таңдайық, бұл STM32F407VG болсын:

Дайын, пайда болған диалогтық терезеде «Иә» түймесін басыңыз және бірінші файл жобамызға қосылады - startup_stm32f4xx.s. Бұрынғыдай біз кітапханаларды пайдаланамыз CMSISЖәне Стандартты перифериялық кітапхана, бірақ, әрине, STM32F4xx контроллерлері үшін. Сондықтан біз міндетті түрде оларды жүктеп алып, әлі бос жобамызға қажетті файлдарды қосуымыз керек. Айтпақшы, мен әртүрлі адамдардан F4 үшін кейбір «олай емес» кітапханаларды кездестіретінін бірнеше рет естідім, тіпті ең қарапайым жоба да біріктірілмеген. Мен мұны кездестірген жоқпын, бірақ мен өзім қолданатын тексерілген кітапханалар:

Сонымен, жүктеп алдық, бәрі дайын, енді файлдарды жобаға қосамыз. Сурет сізге не қажет екенін көрсетеді:

Ал, дайындық аяқталды, енді біздің кодты қамтитын жаңа .c файлын жасайық. барайық Файл->Жаңа, бос файл Keil-де ашылады, басыңыз Файл-> Басқаша сақтаужәне оны, мысалы, test.c атауымен сақтаңыз. Сақтау кезінде файл кеңейтімін (.c) көрсетуді ұмытпаңыз. Файл жасалды, тамаша, бірақ біз оны жобамызға қосуымыз керек. Шын мәнінде, бұл жерде күрделі ештеңе жоқ 😉 Осы файлға бос сынақ бағдарламасын жазайық:

#"stm32f4xx.h" қосу # "stm32f4xx_rcc.h" қосу # "stm32f4xx_gpio.h" қосу /*******************************************************************/ int main() ( while (1 ) ( __NOP() ; ) ) /*******************************************************************/

Барлығы дерлік дайын, тек жоба параметрлерін қарау ғана қалады - Жоба->Мақсатты опциялар…Көптеген қойындылары бар терезе ашылады, мұнда бізді тек кейбіреулері қызықтырады. Қойындыны ашыңыз C/C++және Define өрісінде біз жазамыз:

Ал, далада жобаға енгізілген барлық файлдарға жолдарды қосу керек. Бұл қадамды аяқтағаннан кейін F7 (Құру) пернесін басуға болады, сонда жоба қателерсіз немесе ескертулерсіз құрастырылады. Көріп отырғаныңыздай, күрделі ештеңе жоқ)

Бірақ, жалпы, мен жеке басқаша істеймін. Бұл тәсілдің кемшілігін қараңыз. Сонымен, біз CMSIS және SPL кітапханаларын бір жерден жүктеп алдық, осы қалталардан файлдарды қостық, файлдарға баратын жолдарды жаздық, бәрі жақсы. БІРАҚ! Жоба басқа компьютерде құрылмайды, өйткені жолдардың барлығы абсолютті, яғни олар сіздің компьютеріңіздегі белгілі бір қалталарды көрсетеді. Ал басқа машинада жаңа жобаны жасау үшін қадамдарды қайта орындауға тура келеді. Бұл үлкен минус. Сондықтан мен әдетте жаңа жоба үшін жеке қалта жасаймын, онда мен CMSIS, SPL және басқа пайдаланылған кітапханалар үшін ішкі қалталарды жасаймын және осы қалталарға әрбір нақты жобаға қажетті барлық файлдарды саламын. Мысалы, жаңа жобамыз үшін STM32F4_Test қалтасын және ондағы келесі қалталарды жасайық:

Мен барлығын CMSIS және SPL қалталарына қойдым қажетті файлдар, біз мақаланың басында жобаны жасау кезінде қостық. Енді біз Keil-ді іске қосамыз, жаңа жоба жасаймыз және оны жобаның ішкі қалтасында сақтаймыз, сонда барлық жоба файлдары бір жерде және хаос тудырмайды)

Жоба жасалды, енді бұрынғыдай біз оған STM32F4_CMSIS және STM32F4_SPL қалталарындағы барлық файлдарды қосамыз. Негізгі() функциясы бар сынақ .c файлын Source қалтасына салып, оны жобаға қосамыз. Параметрлерді конфигурациялау ғана қалады =) Барлығы бірдей - анықтау өрісінде біз жазамыз:

USE_STDPERIPH_DRIVER,STM32F4XX



Біз жобаны жинаймыз - қателер жоқ, ұшу қалыпты! Негізінде, соңында біз бірдей нәрсені алдық, бірақ енді жоба кез келген басқа компьютерде еш қиындықсыз бірден жиналады және бұл өте ыңғайлы және пайдалы) Барлық жоба файлдары қазір жақын жерде, бір қалтада, және жолдар салыстырмалы айналды және өзгерту қажет емес.
Мұның бәрі, шын мәнінде, жақын арада біз STM32F4 бағдарламалау үшін бірдеңе жасаймыз, сөзсіз, жақын арада кездескенше!;)

Мысал мақаласынан толық жоба -

Мен стандартты кітапхананың жүйеге қосылғанын көрсеттім. Іс жүзінде CMSIS қосылған - МК жалпыланған құрылымдық ұсыну жүйесі, сондай-ақ SPL - стандартты перифериялық кітапхана. Олардың әрқайсысын қарастырайық:

CMSIS
Бұл тақырып файлдарының жиынтығы және МК өзегі мен перифериясымен жұмысты біріктіру және құрылымдау үшін кодтың шағын жиынтығы. Шын мәнінде, бұл файлдарсыз МК-мен қалыпты жұмыс істеу мүмкін емес. Кітапхананы МК үшін ілеспе құжаттама бетінен алуға болады.
Бұл кітапхана, егер сіз сипаттамаға сенсеңіз, Cortex отбасының кез келген МК-мен жұмыс істеу кезінде интерфейстерді біріктіру үшін жасалған. Алайда, іс жүзінде бұл тек бір өндірушіге қатысты екені белгілі болды, яғни. Басқа компанияның микроконтроллеріне ауысу арқылы сіз оның перифериялық құрылғыларын нөлден бастап зерттеуге мәжбүрсіз.
МК процессорының өзегіне қатысты файлдар барлық өндірушілерден бірдей болса да (тек оларда процессордың негізгі моделі бірдей болғандықтан - ARM IP блоктары түрінде берілген).
Сондықтан регистрлер, нұсқаулар, үзулер және сопроцессорлық блоктар сияқты ядроның бөліктерімен жұмыс істеу барлығы үшін стандартты болып табылады.
Периферияға келетін болсақ, STM32 және STM8 (кенеттен) дерлік ұқсас және бұл ST шығарған басқа МК үшін де ішінара дұрыс. Практикалық бөлімде мен CMSIS пайдалану қаншалықты оңай екенін көрсетемін. Дегенмен, оны пайдаланудағы қиындықтар адамдардың құжаттаманы оқуға және МК дизайнын түсінуге құлықсыздығымен байланысты.

SPL
Стандартты перифериялық кітапхана – стандартты перифериялық кітапхана. Аты айтып тұрғандай, бұл кітапхананың мақсаты - МК шеткі бөлігі үшін абстракция жасау. Кітапхана МК перифериялық құрылғыларын конфигурациялау және олармен жұмыс істеу үшін адам оқи алатын константалар жарияланған тақырып файлдарынан, сонымен қатар перифериялық құрылғылармен операциялар үшін кітапхананың өзінде жинақталған бастапқы код файлдарынан тұрады.
SPL - бұл CMSIS бойынша абстракция, ол пайдаланушыға тек бір өндірушінің ғана емес, сонымен қатар Cortex-Mxx процессорының ядросы бар барлық MCU құрылғыларының барлығына ортақ интерфейсті ұсынады.
Жаңадан бастағандар үшін бұл ыңғайлы деп саналады, өйткені... перифериялық құрылғылардың қалай жұмыс істейтіні туралы ойламауға мүмкіндік береді, бірақ кодтың сапасы, тәсілдің әмбебаптығы және интерфейстердің шектелуі әзірлеушіге белгілі бір шектеулер қояды.
Сондай-ақ, кітапхананың функционалдығы белгілі бір жағдайларда USART (әмбебап синхронды-асинхронды сериялық порт) сияқты кейбір компоненттердің параметрлерін дәл конфигурациялауға әрқашан мүмкіндік бермейді. Практикалық бөлімде мен кітапхананың осы бөлігімен жұмыс істеуді сипаттаймын.

Бәріңе сәлем. Өткен мақалада біз орнатқанымыз есіңізде бағдарламалық пакет STM32 микроконтроллерлерімен жұмыс істеу және бірінші бағдарламаны құрастыру. Бұл постта біз осы тақтаның архитектурасымен, микроконтроллермен және жұмыс істеуге арналған қолжетімді кітапханалармен танысамыз.

Төменде тақтаның суреті берілген STM32F3 ашу , мұндағы: 1 — MEMS сенсоры. L3GD20 3 осьті сандық гироскоп. 2 - 3 осьті сандық сызықтық акселерометр және LSM303DLHC 3 осьті сандық геомагниттік сенсоры бар MEMS жүйесі. 4 – LD1 (PWR) – 3,3В қуат көзі. 5 – LD2 – қызыл/жасыл жарық диоды. Әдепкі қызыл. Жасыл түс ST-LINK/v2 (немесе V2-B) мен ДК арасындағы байланысты білдіреді. Менде ST-LINK/v2-B, сондай-ақ реттелетін дисплей бар USB порты. 6. -LD3/10 (қызыл), LD4/9 (көк), LD5/8 (қызғылт сары) және LD6/7 (жасыл). Соңғы хабарламада біз LD4 жарық диоды жарқыратып жібердік. 7. – Екі түйме: пайдаланушы пайдаланушы және қалпына келтіру RESET. 8. - Mini-B қосқышы бар USB USER.

9 - USB отладчик/бағдарламашы ST-LINK/V2. 1 0. - Микроконтроллер STM32F303VCT6. 11. — 8 МГц сыртқы жоғары жиілікті генератор. 12. – Мұнда төмен жиілікті генератор болуы керек, өкінішке орай ол дәнекерленбеген. 13. – SWD – интерфейс. 14. – Сыртқы немесе ішкі контроллерлерді бағдарламалауды таңдауға арналған секіргіштерді бірінші жағдайда алып тастау керек. 15 – Jumper JP3 – контроллердің тұтынуын өлшеу үшін амперметрді қосуға арналған секіргіш. Ол жойылса, тасымыз басталмайтыны анық. 16. – STM32F103C8T6 жөндеу тақтасы бар. 17. - LD3985M33R реттегіші төмен кернеудің төмендеуі және шу деңгейі, 150мА, 3,3В.

Енді STM32F303VCT6 микроконтроллерінің архитектурасын толығырақ қарастырайық. Оның техникалық сипаттамалар: LQFP-100 корпусы, ARM Cortex-M4 ядросы, максималды жиілік 72 МГц, бағдарлама жады сыйымдылығы 256 КБ, жад түрі FLASH бағдарламалары, көлемі жедел жады SRAM 40 кбайт, RAM 8 кбайт, кіріс/шығыс саны 87, интерфейстер (CAN, I²C, IrDA, LIN, SPI, UART/USART, USB), перифериялық құрылғылар (DMA, I2S, POR, PWM, WDT), ADC/DAC 4 *12 бит/2*12бит, қоректендіру кернеуі 2...3,6 В, жұмыс температурасы –40...+85 С. Төмендегі суретте пинут бар, онда біз 87 кіріс/шығыс портын көреміз, олардың 45-і. Қалыпты енгізу/шығару (TC, TTa), 42 5 вольтты төзімді енгізу/шығару (FT, FTf) – 5 В-пен үйлесімді (тақтада оң жақта 5 В түйреуіштер, сол жақта 3,3 В түйреуіштер бар). Әрбір сандық енгізу/шығару желісі жалпы енгізу/шығару желісі ретінде қызмет ете алады.
тағайындау немесе балама функция. Жобалар ілгерілеген сайын біз перифериямен біртіндеп танысатын боламыз.

Төмендегі блок-схеманы қарастырыңыз. Жүрек - 72 МГц-ке дейін жұмыс істейтін 32 биттік ARM Cortex-M4 өзегі. Оның кірістірілген қалқымалы нүкте блогы FPU және жад қорғау блогы MPU, кірістірілген макробақылау ұяшықтары - енгізілген Trace Macrocell (ETM), микроконтроллер ішіндегі негізгі бағдарламаның орындалу процесін бақылау үшін пайдаланылуы мүмкін. Олар құрылғы жұмыс істеп тұрған кезде бұл бақылауларды ETM контактілері арқылы үздіксіз шығаруға қабілетті. NVIC (Nested vectored interrupt controller) – үзуді басқару модулі. TPIU (Trace Port Interface Unit). Құрамында FLASH жады – 256 КБ, SRAM 40 КБ, ЖЖҚ 8 КБ. Ядро мен жад арасында құрылғыларды тікелей қосуға мүмкіндік беретін автобус матрицасы бар. Сондай-ақ, біз AHB және APB автобус матрицасының екі түрін көреміз, мұнда біріншісі өнімдірек және жоғары жылдамдықты байланыс үшін қолданылады. ішкі компоненттер, ал соңғысы перифериялық құрылғыларға арналған (енгізу/шығару құрылғылары). Контроллерде 4 12-биттік ADC (ADC) (5Мбит/с) және температура сенсоры, 7 компаратор (GP Comparator1...7), 4 бағдарламаланатын операциялық күшейткіш (OpAmp1...4) (PGA (Programmable Gain Array)) бар. ), 2 12-биттік DAC арнасы (DAC), RTC (нақты уақыт сағаты), екі бақылаушы таймер – тәуелсіз және терезелі (WinWatchdog және Ind. WDG32K), 17 жалпы мақсаттағы және көп функциялы таймер.

Жалпы алғанда, біз контроллер архитектурасын қарастырдық. Енді қол жетімді бағдарламалық құрал кітапханаларын қараңыз. Шолуды жасағаннан кейін біз мыналарды бөліп аламыз: CMSIS, SPL және HAL. Жарық диодты жыпылықтаудың қарапайым мысалын пайдаланып, әрқайсысын қарастырайық.

1). CMSIS(Cortex Microcontroller Software Interface Standard) - Cortex®-M стандартты кітапханасы. Құрылғыны қолдауды қамтамасыз етеді және жеңілдетеді бағдарламалық интерфейстер. CMSIS дәйекті және қамтамасыз етеді қарапайым интерфейстерядроға, оның перифериялық құрылғыларына және нақты уақыттағы операциялық жүйелерге арналған. Оны пайдалану бағдарламаларды жазудың кәсіби тәсілі, өйткені... регистрлерге тікелей жазуды қамтиды және сәйкесінше деректер парақтарын үнемі оқу және зерттеу қажет. Аппараттық құрал өндірушісінен тәуелсіз.
CMSIS келесі компоненттерді қамтиды:
- CMSIS-CORE: Жүйені жүйелі түрде іске қосу және перифериялық кіру мүмкіндігі;
- CMSIS-RTOS: нақты уақыт режиміндегі бағдарламалық қамтамасыз етуді анықтау бағдарламалық қамтамасыз етушынайы уақыт);
- CMSIS-DSP: цифрлық сигналды өңдеуді жылдам енгізу цифрлық өңдеусигналдар);
- CMSIS-Driver: аралық бағдарламалық құрал мен қолданбалы кодқа арналған жалпы перифериялық интерфейстер (орта және қолданбалы кодқа арналған жалпы перифериялық интерфейстер);
- CMSIS-Pack: қайта пайдалануға болатын бағдарламалық құрал құрамдастарына оңай қол жеткізу бағдарламалық қамтамасыз ету компоненттері);
- CMSIS-SVD: Құрылғы мен перифериялық құрылғылардың тұрақты көрінісі перифериялық құрылғылар);
- CMSIS-DAP: құны төмен бағалау аппараттық құралына қосылу. Түзету бағдарламалық құралы.

Мысалы, бағдарламаны жазайық - жарық диодты жыпылықтайды. Ол үшін регистрлерді сипаттайтын құжаттама қажет. Менің жағдайда RM0316 Анықтамалық нұсқаулық STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC, STM32F398xE кеңейтілген ARM ® негізіндегі MCUs, сондай-ақ ол жауапты болатын нақты аяқтың сипаттамасы DS9118: ARM® негізіндегі Cortex®-M4 32b MCU+FPU, 256 КБ дейін Flash+ 48 КБ SRAM, 4 ADC, 2 DAC арнасы, 7 комп, 4 PGA, таймерлер, 2,0-3,6 В.Бастау үшін біз бағдарламадағы портты сағаттаймыз, өйткені Әдепкі бойынша, бәрі өшірілген, бұл қуат тұтынуды азайтады. Анықтамалық нұсқаулықты ашып, «Қалпына келтіру және сағатты басқару» бөлімін, содан кейін RCC тіркеу картасын қараңыз және IOPEEN қосу үшін қандай тізілім жауапты екенін қараңыз.

Осы регистрдің перифериялық құрылғыларының тактісінің сипаттамасына көшейік AHB перифериялық сағатты қосу регистрі (RCC_AHBENR), мұнда біз бұл порттың 21-ші биттің астында екенін көреміз. Оны RCC->AHBENR|=(1<<21) . Далее сконфигурируем регистры GPIO. Нас интересует три: GPIOE_MODER и GPIOx_ODR . C помощью них повторим программу с предыдущей статьи, затактируем PE8. Первый отвечает за конфигурацию входа выхода, выбираем 01: General purpose output mode. GPIOE->MODER|=0×10000 . Екіншісі - аяқтың төменгі/жоғары деңгейін қосуға арналған. Төменде бағдарлама:

#include "stm32f3xx.h " //Микроконтроллер тақырып файлы
unsigned int i;
void delay() (
үшін (i=0;i<500000;i++);
}
int негізгі (жарамсыз) (
RCC->AHBENR|=(1<<21);
GPIOE->MODER|=0×10000;
(1)(
delay();
GPIOE->ODR|=0×100;
delay();
GPIOE->ODR&=~(0×100);
} }

2). SPL(Стандартты перифериялық кітапхана)- бұл кітапхана ST Electronics компаниясының барлық процессорларын біріктіруге арналған. Кодтың тасымалдануын жақсартуға арналған және ең алдымен бастаушы әзірлеушілерге арналған. ST HAL-мен үйлесімді "төменгі қабат" деп аталатын SPL ауыстырумен жұмыс істейді. Төмен деңгей (LL) драйверлері HAL-ға қарағанда аппараттық құралға жақынырақ дерлік жеңіл, сарапшыға бағытталған қабатты қамтамасыз етуге арналған. HAL-дан басқа, LL API интерфейстері де қол жетімді. SPL-дегі бірдей бағдарламаның мысалы.

#қосу
#қосу
#қосу
#диодты GPIO_Pin_8 анықтау
int main() (
ұзақ i;
GPIO_InitTypeDef gpio;
// Көк жарық диоды E портына қосылған, pin 8 (AHB шинасы)
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ҚОСУ);
// E портын конфигурациялау (LED)
GPIO_StructInit(&gpio); //деректер құрылымының айнымалы мәнін жариялау және инициализациялау
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_Pin = LED;
GPIO_Init(GPIOE, &gpio);
// Жыпылықтайтын жарықдиодты шамдар
(1) (
//Қосу
GPIO_SetBits(GPIOE, LED);
үшін (i = 0; i< 500000; i++);
// Барлығы өшірулі
GPIO_ResetBits(GPIOE, LED);
үшін (i = 0; i< 500000; i++);
} }

Әрбір функция техникалық құжаттамада сипатталған UM1581 пайдаланушы нұсқаулығы STM32F30xx/31xx стандартты перифериялық кітапханасының сипаттамасы. Мұнда біз қажетті деректерді, құрылымдарды, қалпына келтіруді және синхрондауды басқару функцияларын, сондай-ақ енгізу/шығару порттарын конфигурациялау үшін үш тақырыптық файлды қосамыз.

3). ХАЛ- (Аппараттық құралға қол жеткізу деңгейі, аппараттық абстракция деңгейі)- Дамытуға арналған тағы бір ортақ кітапхана. Соңғы мақалада біз пайдаланған конфигурацияға арналған CubeMX бағдарламасы да шығарылды. Сондай-ақ біз осы кітапхана арқылы жарық диодты жыпылықтау бағдарламасын жаздық. Төмендегі суретте көріп отырғанымыздай, текше HAL және CMSIS драйверлерін жасайды. Енді пайдаланылатын негізгі файлдарды сипаттайық:
- system_stm32f3x.c және system_stm32f3x.h- уақыт жүйесін конфигурациялау үшін функциялардың минималды жиынын қамтамасыз ету;
— core_cm4.h – ядро ​​мен оның перифериялық құрылғыларының регистрлеріне қол жеткізуді қамтамасыз етеді;
- stm32f3x.h - микроконтроллердің тақырыптық файлы;
— startup_system32f3x.s — іске қосу коды, үзу векторларының кестесін және т.б.

#"main.h" қосу
#қосуға "stm32f3xx_hal.h"
void SystemClock_Config(жарамсыз); /*Сағат конфигурациясының функцияларын жариялау*/
статикалық void MX_GPIO_Init(жарамсыз); /*Енгізу/шығаруды инициализациялау*/
int негізгі (жарамсыз) (
/*Барлық перифериялық құрылғыларды қалпына келтіру, Flash интерфейсін және жүйені инициализациялайды.*/
HAL_Init();
/* Жүйе сағатын конфигурациялаңыз */
SystemClock_Config();
/* Барлық конфигурацияланған перифериялық құрылғыларды инициализациялау */
MX_GPIO_Init();
(1) (
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8); //Аяқтың күйін ауыстырыңыз
HAL_Delay(100); )
}
void SystemClock_Config (жарамсыз){
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSISstate = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLSstate = RCC_PLL_NONE;
егер (HAL_RCC_OscConfig (&RCC_OscInitStruct) != HAL_OK){

}
/**CPU, AHB және APB автобустарының сағаттарын инициализациялайды */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
егер (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){
_Error_Handler(__FILE__, __LINE__);
}
/**Жүйені үзу уақытын конфигурациялау*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Жүйені конфигурациялау */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn үзу конфигурациясы */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/** түйреуіштерді EVENT_OUT EXTI аналогтық кіріс шығысы ретінде конфигурациялау */
статикалық жарамсыз MX_GPIO_Init (жарамсыз){
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO порттарының сағатын қосу */
__HAL_RCC_GPIOE_CLK_ENABLE();
/*GPIO пин шығыс деңгейін конфигурациялау */
HAL_GPIO_WritePin (GPIOE, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11)
|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
/*GPIO түйреуіштерін конфигурациялау: PE8 PE9 PE10 PE11 PE12 PE13 PE14 PE15 */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed ​​= GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
void _Error_Handler(char * файл, int жолы){
(1) (
} }
#ifdef ҚОЛДАНУ_ТОЛЫҚ_АСЕРТ

Жарамсыз assert_failed (uint8_t* файлы, uint32_t жолы){
}
#endif
Мұнда, алдыңғы мысалдағыдай, біз құжаттамадағы әрбір функцияның сипаттамасын көре аламыз, мысалы UM1786 пайдаланушы нұсқаулығы STM32F3 HAL және төмен деңгейлі драйверлердің сипаттамасы.

Біз CMSIS-ті қолданатын бірінші нұсқаның қиын емес екенін қорытындылай аламыз. Әр кітапхананың құжаттары бар. Келесі жобаларда біз STCube конфигурациялау бағдарламасын пайдалана отырып, HAL және CMSIS қолданамыз және мүмкін болса, регистрлерді бағдарламалық қамтамасыз етуді орауышсыз тікелей пайдаланамыз. Бүгін сонда тоқталайық. Келесі мақалада құрылыстың негізгі принциптерін қарастырамыз ақылды үй. Бәріңе сау бол.




Жоғарғы