STM32F407(STM32F4-DISCOVERY) - සම්මත නොවන ප්‍රවේශය - සම්මත පුස්තකාලය 1 කොටස. සාර්ව නිර්වචන භාවිතයෙන් STM32F10x SPL වින්‍යාස කිරීම

මේ මොහොත දක්වා, අපි සම්මත කර්නල් පුස්තකාලය - CMSIS භාවිතා කර ඇත. අපේක්ෂිත මෙහෙයුම් මාදිලියට වරායක් වින්‍යාස කිරීම සඳහා, යම් කාර්යයක් සඳහා වගකිව යුතු ලේඛනය සොයා ගැනීමට අපට හැරවීමට සිදු වූ අතර, මෙම ක්‍රියාවලියට අදාළ වෙනත් තොරතුරු සඳහා විශාල ලේඛනයක් හරහා සෙවිය යුතුය. අපි ටයිමරයක් හෝ ADC සමඟ වැඩ කිරීම ආරම්භ කරන විට දේවල් වඩාත් වේදනාකාරී සහ පුරුද්දක් වනු ඇත. එහි ඇති රෙජිස්ටර් ගණන I/O ports වලට වඩා බොහෝ වැඩිය. අතින් සැකසුමබොහෝ කාලයක් ගත වන අතර වැරැද්දක් කිරීමේ අවස්ථාව වැඩි කරයි. එමනිසා, බොහෝ අය සම්මත පර්යන්ත පුස්තකාලය සමඟ වැඩ කිරීමට කැමැත්තක් දක්වයි - StdPeriph. එය ලබා දෙන්නේ කුමක්ද? එය සරලයි - වියුක්ත කිරීමේ මට්ටම වැඩි වේ, ඔබට ලේඛනගත කිරීමට සහ බොහෝ දුරට රෙජිස්ටර් ගැන සිතීමට අවශ්‍ය නැත. මෙම පුස්තකාලය තුළ, MK පරිධියේ සියලුම මෙහෙයුම් මාතයන් සහ පරාමිතීන් ව්යුහයන් ආකාරයෙන් විස්තර කෙරේ. දැන්, පර්යන්ත උපාංගයක් වින්‍යාස කිරීම සඳහා, ඔබට පිරවූ ව්‍යුහයක් සමඟ උපාංග ආරම්භක කාර්යය ඇමතීමට පමණක් අවශ්‍ය වේ.

පහත දැක්වෙන්නේ වියුක්ත මට්ටම්වල ක්‍රමානුරූප නිරූපණයක් සහිත පින්තූරයකි.

ක්ෂුද්‍ර පාලකය ක්‍රියා කරන ආකාරය පෙන්වීමට අපි 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 - C භාෂාවෙන් ලියා ඇති පර්යන්ත උපාංග ධාවකය.
  • stm32f10x_it.h - හැකි සියලුම බාධා හසුරුවන්න (ඒවායේ මූලාකෘති) ඇතුළත් ශීර්ෂ ගොනුව.
  • stm32f10x_it.c යනු Cortex M3 හි ව්‍යතිරේක අවස්ථාවන් සඳහා බාධා කිරීමේ සේවා චර්යාව (ISR) අඩංගු අච්චු මූලාශ්‍ර කේත ගොනුවකි. භාවිතා කරන පර්යන්ත සඳහා පරිශීලකයාට ඔහුගේම ISR එකතු කළ හැක.

සම්මත පුස්තකාලය සහ පර්යන්තවල ශ්‍රිත නම් කිරීම සහ අංකනය කිරීමේ සම්මුතියක් ඇත.

  • PPP යනු ADC වැනි පර්යන්ත සඳහා කෙටි යෙදුමකි.
  • පද්ධතිය, ශීර්ෂකය සහ මූල කේත ගොනු - stm32f10x_ සමඟ ආරම්භ කරන්න.
  • එක් ගොනුවක භාවිතා වන නියතයන් එම ගොනුවේ අර්ථ දක්වා ඇත. ගොනු එකකට වඩා භාවිතා කරන නියතයන් ශීර්ෂ ගොනු වල අර්ථ දක්වා ඇත. පර්යන්ත පුස්තකාලයේ සියලුම නියතයන් බොහෝ විට ලියා ඇත්තේ UPPER අකුරෙනි.
  • රෙජිස්ටර් නියතයන් ලෙස සලකනු ලබන අතර කැපිටල් අකුරු ලෙසද හැඳින්වේ.
  • පර්යන්ත-විශේෂිත ශ්‍රිත නාමවලට ​​USART_SendData() වැනි කෙටි යෙදුමක් ඇතුළත් වේ.
  • එක් එක් පර්යන්ත උපාංගය වින්‍යාස කිරීම සඳහා, PPP_InitTypeDef ව්‍යුහය භාවිතා කරනු ලැබේ, එය PPP_Init() ශ්‍රිතයට යවනු ලැබේ.
  • deinitialize කිරීමට (අගය පෙරනිමියට සකසන්න), ඔබට PPP_DeInit() ශ්‍රිතය භාවිතා කළ හැක.
  • පර්යන්ත සක්රිය හෝ අක්රිය කිරීමට ඔබට ඉඩ සලසන ශ්රිතය PPP_Cmd() ලෙස හැඳින්වේ.
  • බාධා කිරීම් සක්‍රීය/අබල කිරීමේ කාර්යය PPP_ITConfig ලෙස හැඳින්වේ.

සමග සම්පූර්ණ ලැයිස්තුවඔබට නැවත පුස්තකාල ආධාරක ගොනුව දෙස බැලිය හැක. දැන් අපි සම්මත පර්යන්ත පුස්තකාලය භාවිතයෙන් LED දැල්වීම නැවත ලියමු!

වැඩ ආරම්භ කිරීමට පෙර, අපි stm32f10x.h ගොනුව දෙස බලා රේඛාව සොයා ගනිමු:

#USE_STDPERIPH_DRIVER නිර්වචනය කරන්න

ඔබ බාගත කළ සංරක්ෂිතයෙන් පුස්තකාල ගොනු භාවිතයෙන් ව්‍යාපෘතිය මුල සිටම වින්‍යාස කරන්නේ නම්, ඔබට මෙම පේළියෙන් අදහස් දැක්වීම ඉවත් කිරීමට අවශ්‍ය වනු ඇත. එය ඔබට සම්මත පුස්තකාලය භාවිතා කිරීමට ඉඩ සලසයි. මෙම නිර්වචනය (මැක්රෝ) stm32f10x_conf.h ගොනුව ඇතුළත් කිරීමට පෙර සැකසුම්කරුට අණ කරයි:

#ifdef USE_STDPERIPH_DRIVER #ඇතුළත් "stm32f10x_conf.h" #endif

මෙම ගොනුවේ මොඩියුල අඩංගු වේ. ඔබට විශේෂිත ඒවා පමණක් අවශ්‍ය නම්, ඉතිරිය අක්‍රිය කරන්න, මෙය සම්පාදනය කිරීමේදී කාලය ඉතිරි කරයි. අපට, ඔබ අනුමාන කර ඇති පරිදි, RTC සහ GPIO මොඩියුල අවශ්‍ය වේ (කෙසේ වෙතත්, අනාගතයේදී අපට _bkp.h, _flash, _pwr.h, _rtc.h, _spi.h, _tim.h, _usart.h):

#init_pll() සඳහා "stm32f10x_flash.h" // ඇතුලත් කරන්න #"stm32f10x_gpio.h" #ඇතුළත් කරන්න "stm32f10x_rcc.h"

පසුගිය වතාවේ මෙන්, පළමුව ඔබ B වරායේ ඔරලෝසු කිරීම සක්‍රීය කළ යුතුය. මෙය සිදු කරනු ලබන්නේ stm32f10x_rcc.h හි ප්‍රකාශ කර ඇති ශ්‍රිතය මගිනි:

අවලංගු RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

FunctionalState enum stm32f10x.h හි අර්ථ දක්වා ඇත:

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

අපගේ පාදය සැකසීම සඳහා ව්‍යුහයක් ප්‍රකාශ කරමු (ඔබට එය stm32f10x_gpio.h ගොනුවෙන් සොයාගත හැක):

GPIO_InitTypeDef LED;

දැන් අපි එය පිරවිය යුතුයි. මෙම ව්යුහයේ අන්තර්ගතය දෙස බලමු:

Typedef struct (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_2Gpeed Gpeed _Mode = GPIO_Mode_ Out_PP; // GPIO_Init (GPIOB, &LED) වරාය ආරම්භ කරන්න; )

ප්‍රධාන() ශ්‍රිතය නැවත ලියමු:

Int main(void) ( led_init (); while (1) (GPIO_SetBits(GPIOB, GPIO_Pin_0); ප්‍රමාදය (10000000); GPIO_ResetBits(GPIOB, GPIO_Pin_0); ප්‍රමාදය (10000000); ) )

ප්රධාන දෙය වන්නේ ආරම්භක අනුපිළිවෙල සඳහා හැඟීමක් ලබා ගැනීමයි: පර්යන්ත ඔරලෝසුව සක්රිය කරන්න, ව්යුහය ප්රකාශ කරන්න, ව්යුහය පිරවීම, ආරම්භක ක්රමය අමතන්න. අනෙකුත් පර්යන්ත උපාංග සාමාන්‍යයෙන් වින්‍යාස කර ඇත්තේ සමාන ආකාරයකින් ය.

මෙම ප්‍රකාශනයේ, නිෂ්පාදන සමාගමක් වන STMicroelectronics වෙතින් සම්මත පර්යන්ත පුස්තකාලය මත පදනම්ව STM32F10x ක්ෂුද්‍ර පාලක සමඟ ඉක්මනින් ආරම්භ කිරීම සඳහා ප්‍රධාන කරුණු කෙරෙහි අවධානය යොමු කිරීමට මම උත්සාහ කරමි.

ලිපිය සංවර්ධන පරිසරය ලෙස Eclipse CDT භාවිතා කරනු ඇත. ප්‍රධාන අවධානය යොමු වන්නේ වැඩසටහන් කේතය වෙත බැවින්, ඔබට Code ::Blocks හි ඇති සියලුම උපාමාරු ආරක්ෂිතව කළ හැක.

ARM ක්ෂුද්‍ර පාලක සඳහා සාමාන්‍ය ව්‍යාපෘති ව්‍යුහය මගේ ලිපියේ විස්තර කර ඇත.

ARM microcontrollers (විශේෂයෙන්ම STM32F10x) සඳහා ව්‍යාපෘතියක් තැනීමට ඔබට සම්බන්ධක ස්ක්‍රිප්ට් එකක් සහ C-Startup ගොනුවක් අවශ්‍ය වන බව මෙහිදී මම ඔබට කෙටියෙන් මතක් කරමි.

ලින්කර් ස්ක්‍රිප්ට් යනු ක්‍රමලේඛ කේතය සහ දත්ත ක්ෂුද්‍ර පාලක මතකයේ තැබීම සඳහා උපදෙස් සහිත ගොනුවකි. එය ඔබගේ වැඩසටහන් කේතය ෆ්ලෑෂ් ක්‍රමලේඛ මතකයට හෝ SRAM දත්ත මතකයට පටවන ලෙස විධාන කළ හැක.

විවිධ වැඩසටහන් සහ දත්ත මතකය සහිත ක්ෂුද්‍ර පාලකයන්ට විවිධ පිරිසැලසුම් ස්ක්‍රිප්ට් අවශ්‍ය වේ. ඒවා ක්ෂුද්‍ර පාලක නිෂ්පාදකයාගෙන් ලබා ගත හැකිය - STMicroelectronics.
ARM_Toolchain/Lib/stm32f10x_stdperiph_lib.zip සංරක්ෂිතයෙන් STM32F10x සම්මත පර්යන්ත පුස්තකාලය ඉවත් කරන්න.
එහි විවිධ සංවර්ධන පරිසරයන් සඳහා උදාහරණ ව්‍යාපෘති අඩංගු වේ (IAR EWB, Keil uVision, Atollic True Studio, ආදිය). එය Eclipse වෙනස් කිරීමක් බැවින් අපට සමීපතම එක Atolic True Studio වේ.
Project/StdPeriph_Template/TrueSTUDIO බහලුම වෙත යන්න, එහි උප බහලුම් කිහිපයක් තිබේ, ඒවායේ නම් STM3210x-EVAL සංවර්ධන පුවරු වල නම් වලට අනුරූප වේ.

ඔබගේ එම ක්ෂුද්‍ර පාලක රේඛාව භාවිතා කරන්නේ කුමන පුවරුද යන්න සොයා බලන්න. stm32_flash.ld ගොනුව සුදුසු නාමාවලියෙන් ඔබේ ව්‍යාපෘතියට පිටපත් කරන්න.

භාවිතා කරන ක්ෂුද්‍ර පාලකයට අනුකූලව වැඩසටහන් ප්‍රමාණය සහ දත්ත මතක ප්‍රමාණය පමණක් වෙනස් වන විශ්ව ස්ක්‍රිප්ට් එකක් නිර්මාණය කිරීමට ද හැකිය.

STM32 ක්ෂුද්‍ර පාලක සඳහා ආරම්භක කේතය (C-Startup) C හෝ Assembler වලින් ලිවිය හැක.
STM32F10x සම්මත පර්යන්ත පුස්තකාලය (කෙටියෙන් STM32F10x SPL) එහි දෝෂ සඳහා බොහෝ විට විවේචනයට ලක් වුවද, STM32 ක්‍රමලේඛනය ආරම්භ කිරීමේදී ඉක්මනින් ආරම්භ කිරීමට ඇති පහසුම ක්‍රමය එයයි.
නමුත් ඔබට සෑම විටම යම් ආකාරයක විකල්පයක් තිබිය යුතුය. ඇත්ත වශයෙන්ම, ඒවායින් බොහොමයක් තිබේ, උදාහරණයක් ලෙස, එකලස් කිරීමේ භාෂාවෙන් වැඩසටහන්කරණය :)

මෙය වඩාත්ම දුෂ්කර හා අර්ථ විරහිත මාර්ගයයි. දෙවන ක්‍රමය නම් විවිධ ක්ෂුද්‍ර පාලක පර්යන්ත වෙත ප්‍රවේශ වීම සඳහා C භාෂා ව්‍යුහයන් වෙත ප්‍රවේශ වීම සඳහා වාක්‍ය ඛණ්ඩය සපයන CMSIS පුස්තකාලය භාවිතා කිරීමයි. සරලම හා වඩාත්ම තාර්කික මාර්ගය (මගේ මතය අනුව) පුස්තකාල භාවිතා කිරීමයි.

ඔබ STM32F10x SPL සඳහා නිශ්චිතවම විරුද්ධ නම්, විශේෂයෙන් ඔබ සඳහා තවත් විකල්පයක් ඇත - libopencm3 පුස්තකාලය. එහි, උදාහරණවලින් වැඩි ප්‍රමාණයක් STM32F10x ක්ෂුද්‍ර පාලක මාලාවේ ප්‍රධාන ශ්‍රේණිය වටා සංකේන්ද්‍රණය වී ඇත, නමුත් වෙනත් ශ්‍රේණි සඳහා උදාහරණ (STM32F2xx/4xx) දර්ශනය වීමට පෙර කාලය පිළිබඳ ප්‍රශ්නයක් පමණි. ඔබට සැමවිටම libopencm3 ව්‍යාපෘතියට සම්බන්ධ වී මෙම ක්‍රියාවලිය වේගවත් කළ හැක.

CMSIS ප්‍රමිතිය ඔබේ වැඩසටහන්වල භාවිතය සඳහා ද විකල්ප වේ.
C ක්‍රමලේඛන භාෂාවේ HAL (Hardware Abstraction Layer) මට්ටම ක්‍රියාත්මක කිරීමට යම් උත්සාහයක් සහ කාලයක් වැය කිරීමෙන් ඔබට එය නොමැතිව කළ හැකිය.

සමහර අවස්ථාවලදී මෙම ක්රමය එකම එක විය හැකිය ප්රවේශ විය හැකි ආකාරයෙන්. උදාහරණයක් ලෙස, ඔබේ සංවිධානය ARM-සංවර්ධිත පරිගණක මධ්‍යයන් සහ කර්මාන්ත-විශේෂිත පර්යන්ත මත පදනම්ව අභිරුචි චිප් භාවිතා කරයි.

නැතහොත් ARM9 හරයක් සහිත ක්ෂුද්‍ර පාලක සඳහා C හි මෘදුකාංග ක්‍රියාත්මක කිරීමට අවශ්‍ය වේ, ඒ සඳහා නිෂ්පාදකයින් සූදානම්ව භාවිතා කිරීම කෙරෙහි අවධානය යොමු කරයි. මෙහෙයුම් පද්ධති(Linux, QNX, Windows CE), එබැවින් නිෂ්පාදකයින් විසින් C භාෂාවෙන් ක්‍රමලේඛනය සඳහා පුස්තකාල ලබා නොදිය හැකිය පිරිසිදු ස්වරූපයෙන් හෝ වඩා සැහැල්ලු 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" සාදන්න.
  • "ඩීබග්" ඉලක්කය දියත් කර "කොන්සෝලය" කවුළුවෙහි එහි ක්රියාත්මක කිරීම නිරීක්ෂණය කරන්න.

ද්රව්යය පිළිබඳ වඩා හොඳ අවබෝධයක් සඳහා, මම ලිපිය ස්වාධීන ඡේද කිහිපයකට බෙදා ඇත, ඒ සෑම එකක්ම STM32F10x SPL පුස්තකාලය සමඟ වැඩ කිරීමේ එක් අංගයක් පමණක් විස්තර කරයි.

සාර්ව නිර්වචන භාවිතයෙන් STM32F10x SPL වින්‍යාස කිරීම

පුස්තකාලය වින්‍යාස කිරීම සඳහා, පූර්ව නිශ්චිත සාර්ව අගයන් භාවිතා කරනු ලැබේ, එය අපි දැන් සලකා බලමු.
පෙර සැකසුම් විධානයක් භාවිතයෙන් ශීර්ෂ ගොනු තුළ ඒවා සැකසිය හැක #නිර්වචනය කරන්නහෝ යතුර හරහා සාර්ව අර්ථ දැක්වීම්වල අගයන් ලබා දෙන්න -ඩී GCC සම්පාදකය.
මගේ උදාහරණයේදී මම දෙවන ක්රමය භාවිතා කරමි.
Makefile විචල්‍යයේ නිර්වචනය කරන්න STM32F10x SPL පුස්තකාලය සම්පාදනය කිරීමට අවශ්‍ය මැක්‍රෝස් අඩංගු වේ.
මැක්රෝ නිර්වචනය STM32F10X_MDභාවිතා කරන ක්ෂුද්‍ර පාලකය රේඛාවට අයත්ද යන්න සඳහන් කරයි මධ්යම ඝනත්වය.
මෙයට 64 සිට 128 kB දක්වා ෆ්ලෑෂ් මතකය සහිත ක්ෂුද්‍ර පාලක ඇතුළත් වේ.
පහත වගුවේ විවිධ ක්ෂුද්‍ර පාලක මාලාවන් සඳහා මැක්‍රෝ නම් ලැයිස්තුගත කර ඇත:

මාලාවේ නම මැක්රෝ විස්තර
අඩු ඝනත්ව අගය රේඛාව STM32F10X_LD_VL ෆ්ලෑෂ් මතක ධාරිතාව 16 - 32 kB සමඟ
අඩු ඝනත්වය STM32F10X_LD
ෆ්ලෑෂ් මතක ධාරිතාව 16 - 32 kB සමඟ
මධ්යම ඝනත්ව අගය රේඛාව STM32F10X_MD_VL ෆ්ලෑෂ් - මතකය
64 - 128kB
මධ්යම ඝනත්වය STM32F10X_MD ෆ්ලෑෂ් මතකය 64 - 128 kB සහිත STM32F101xx, STM32F102xx, STM32F103xx ශ්‍රේණිවල ක්ෂුද්‍ර පාලක
ඉහළ ඝනත්ව අගය රේඛාව STM32F10X_HD_VL පරිමාව සහිත STM32F100xx ශ්‍රේණියේ ක්ෂුද්‍ර පාලක
ෆ්ලෑෂ් - මතකය 256 - 512kB
අධික ඝනත්වය STM32F10X_HD පරිමාව සමඟ
ෆ්ලෑෂ් මතකය 256 - 512kB
XL-ඝනත්වය STM32F10X_XL
ෆ්ලෑෂ් මතකය 512 - 1024 kB
සම්බන්ධතා රේඛාව STM32F10X_CL

ක්ෂුද්‍ර පාලකයේ ඔරලෝසු සංඛ්‍යාතය සැකසීමට, ඔබ system_stm32f10x.c ගොනුව තුළ අවශ්‍ය ඔරලෝසු සංඛ්‍යාත අගය සමඟ මැක්‍රෝව විවරණ ඉවත් කළ යුතුය.

#නිර්වචනය කර ඇත්නම් (STM32F10X_LD_VL) || (STM32F10X_MD_VL අර්ථ දක්වා ඇත) || (නිර්වචනය කරන ලද STM32F10X_HD_VL) #SYSCLK_FREQ_24MHz 24000000 නිර්වචනය කරන්න #එසේ නම් /* #SYSCLK_FREQ_HSE HSE_VALUE නිර්වචනය කරන්න */ /* #SYSCLK_FREQ_Hz 3600 0000 */ /* # SYSCLK_FREQ_48MHz 48000000 */ /* # define 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 නිර්වචනය කරන්න */

/* #නිර්වචනය SYSCLK_FREQ_24MHz 24000000 */

/* #නිර්වචනය SYSCLK_FREQ_36MHz 36000000 */

/* #නිර්වචනය SYSCLK_FREQ_48MHz 48000000 */

/* #නිර්වචනය SYSCLK_FREQ_56MHz 56000000 */

#SYSCLK_FREQ_72MHz 72000000 නිර්වචනය කරන්න

#නම් අවසන්

අපේක්ෂිත භාවිතය ක්වාර්ට්ස් අනුනාදකයසියලුම ප්රධාන සඳහා 8 MHz සංඛ්යාතයක් සමඟ
25 MHz ක්වාර්ට්ස් අනුනාදකයක් ස්ථාපනය කිරීම අවශ්‍ය වන සම්බන්ධතා රේඛාව හැර ක්ෂුද්‍ර පාලක මාලාවක්.
ඔබ වෙනත් සංඛ්‍යාත අගයන් සහිත ක්වාර්ට්ස් අනුනාදක භාවිතා කරන්නේ නම්, එවිට ඔබට stm32f10x.h ශීර්ෂ ගොනුවේ HSE_VALUE මැක්‍රෝවේ අගය වෙනස් කර ඒ අනුව සියලු පරායත්ත ශ්‍රිතයන් අනුගත කළ යුතුය.
USE_STDPERIPH_DRIVER මැක්‍රෝවේ අරමුණ අනුමාන කිරීමට අපහසු නැත - STM32F10x සම්මත පර්යන්ත පුස්තකාලය භාවිතා කිරීම.
USE_FULL_ASSERT - වැඩසටහන නිදොස් කිරීමට ASSERT මැක්‍රෝ භාවිතා කරන්න.

පුස්තකාලයේ assert_param macro භාවිතා කිරීම

සියලුම STM32F10x SPL පුස්තකාල ශ්‍රිතයන් ඔවුන්ගේ තර්ක පරීක්ෂා කිරීමට assert_param macro භාවිතා කරයි.
මෙම සාර්ව ශුන්‍යයට සමානාත්මතාවය සඳහා පරීක්‍ෂා කෙරෙන ශ්‍රිත තර්කය ඇතුළත් ප්‍රකාශනයක් පරීක්‍ෂා කරයි. ප්‍රකාශනයේ අගය ශුන්‍ය නම්, තර්ක දෝෂ හසුරුවන්න ශ්‍රිතය assert_failed ලෙස හැඳින්වේ, එසේ නොමැති නම් (ප්‍රකාශනය ශුන්‍ය නොවේ), තර්ක පරීක්ෂාව සාර්ථක වේ.
ඔබ ඔබේ වැඩසටහනේ assert_failed ශ්‍රිතය ක්‍රියාත්මක කිරීමට අවශ්‍ය වේ.
එය දෝෂ පණිවිඩය, ගොනුවේ නම සහ දෝෂයට හේතු වූ කේත රේඛාවේ අංකය පෙන්වයි.
debug_printf macro හට සම්මත new_lib පුස්තකාලය භාවිතයෙන් USART හරහා ප්‍රතිදානය කළ හැක හෝ, උදාහරණයක් ලෙස, චෙන් මහතාගේ පුස්තකාලය.

#define debug_printf xprintf /* printf */ #ifdef භාවිතා කරන්න ; අතරතුර (1) ( ) )/* assert_failed */ #endif/*USE_FULL_ASSERT*/

#debug_printf xprintf /* printf */ නිර්වචනය කරන්න

#ifdef USE_FULL_ASSERT

void assert_failed (uint8_t * ගොනුව, uint32_t රේඛාව)

debug_printf( "වැරදි පරාමිති අගය: %s ගොනුව %d\r\n පේළියේ", ගොනුව , (int ) රේඛාව );

අතරතුර (1)

) /* assert_failed */

#endif/*USE_FULL_ASSERT*/

ඔබගේ කේතයේ ක්‍රියාත්මක කරන ලද 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* file, uint32_t line); #else #define assert_param(expr) ((void)0) #endif /* USE_FULL_ASSERT */

#ifdef USE_FULL_ASSERT

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

void assert_failed (uint8_t * ගොනුව, uint32_t රේඛාව);

#වෙනත්

# define assert_param(expr) ((නිෂ්ඵල)0)

#endif /* USE_FULL_ASSERT */

මෙහි පැහැදිලි කිරීමට බොහෝ දේ නැත. assert_param භාවිතා කිරීමේ උදාහරණයක් බලමු.

void set_param(uint8_t * param, uint8_t අගය) ( assert_param(param != NULL); *param = value; )/*set_param*/

void set_param (uint8_t * param , uint8_t අගය)

assert_param (param != NULL);

* පරම් = අගය ;

) /*set_param*/

ශ්‍රිතය මඟින් පරාමිතියේ අගය තර්කයක් ලෙස සම්මත කරන ලද දර්ශකයක් හරහා සකසයි. USE_FULL_ASSERT මැක්‍රෝව ප්‍රකාශ නොකළේ නම්, එවිට අපට රේඛා යැයි උපකල්පනය කළ හැක
assert_param(param != NULL) හුදෙක් කේතයේ නොමැත, එසේ නොමැති නම් පරාමිතිය මෙම අර්ථ දැක්වීමේදී පරීක්ෂා කරනු ලැබේ.
දර්ශකය නිර්වචනය කර නොමැති නම්, පරාමිතිය != NULL අසත්‍ය වන අතර assert_failed ශ්‍රිතය ක්‍රියාත්මක වනු ඇත, එමඟින් ගොනු නාමය සහ රේඛා අංකය USART හරහා දෝෂය සමඟ ප්‍රතිදානය කර පසුව ලූප් කර අගය වීම වළක්වයි. මතකයේ ඇති නිර්වචනය නොකළ ලිපිනයකට පවරා ඇත.
ඔබගේ කේතයේ assert_param macro භාවිතා කිරීමට ඔබට කිසිසේත් අවශ්‍ය නොවේ, නමුත් පුස්තකාල කේතය තුළ
STM32F10x SPL එය සෑම තැනකම භාවිතා වේ.
set_param ශ්‍රිතය assert_param භාවිතා නොකර තර්ක දෝෂ පරීක්ෂාවකින් ක්‍රියාත්මක කළ හැක.

#දෝෂය නිර්වචනය කරන්න (-1) #හරි (0) int set_param (uint8_t * param, uint8_t අගය) නිර්වචනය කරන්න (int r = ERROR; (param == NULL) නම් ආපසු r; * param = අගය; r = OK; ආපසු r ;)/*set_param*/

#දෝෂය නිර්වචනය කරන්න (-1)

#හරි (0) අර්ථ දක්වන්න

int set_param (uint8_t * පරාමිතිය, uint8_t අගය)

int r = දෝෂය ;

නම් (පරම == NULL)

ආපසු r;

* පරම් = අගය ;

r = හරි ;

ආපසු r;

) /*set_param*/

STM32F10x SPL පුස්තකාලයේ C-ආරම්භක ගොනුව

ආරම්භක කේතයේදී, ක්ෂුද්‍ර පාලකය මුලදී ආරම්භ කර, තොගය වින්‍යාස කර, BSS කොටස නැවත සකසනු ලැබේ, සහ ප්‍රධාන කාර්යය main() ලෙස හැඳින්වේ.
ආරම්භක කේතය STM32F10x SPL පුස්තකාලයට සෘජු සම්බන්ධයක් නැත. කෙසේ වෙතත්, මෙම ඇරඹුම් කේතය තුළ, වැඩසටහනේ ප්‍රධාන () ශ්‍රිතය ඇමතීමට පෙර, CMSIS හි කොටසක් වන ක්ෂුද්‍ර පාලක ආරම්භක ශ්‍රිතය SystemInit() ලෙස හැඳින්වේ.
එය CMSIS පුස්තකාලයේ පහසුවෙන් සොයා ගත හැක.
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO බහලුම වෙත ගොස් අවශ්‍ය ගොනුව පිටපත් කරන්න. ඉතිරිව ඇත්තේ ඔබේ ව්‍යාපෘතියේ භාවිතා කරන ක්ෂුද්‍ර පාලකය අයත් වන්නේ කුමන රේඛාවටදැයි සොයා බැලීමයි.
මෙය සිදු කිරීම සඳහා, පහත වගුව දෙස බලන්න:

මාලාවේ නම ගොනු නාමය විස්තර
අඩු ඝනත්ව අගය රේඛාව startup_stm32f10x_ld_vl.s පරිමාව සහිත STM32F100xx ශ්‍රේණියේ ක්ෂුද්‍ර පාලක
ෆ්ලෑෂ් මතකය 16 - 32kB
අඩු ඝනත්වය startup_stm32f10x_ld.s ක්ෂුද්‍ර පාලක මාලාව STM32F101xx, STM32F102xx, STM32F103xx
ෆ්ලෑෂ් මතක ධාරිතාව 16 - 32 kB සමඟ
මධ්යම ඝනත්ව අගය රේඛාව startup_stm32f10x_md_vl.s ක්ෂුද්ර පාලක මාලාව STM32F100xx
මධ්යම ඝනත්වය startup_stm32f10x_md.s ක්ෂුද්‍ර පාලක මාලාව STM32F101xx, STM32F102xx, STM32F103xx
ෆ්ලෑෂ් මතක ධාරිතාව 64 - 128 kB සමඟ
ඉහළ ඝනත්ව අගය රේඛාව startup_stm32f10x_hd_vl.s ක්ෂුද්ර පාලක මාලාව STM32F100xx
අධික ඝනත්වය startup_stm32f10x_hd.s ක්ෂුද්‍ර පාලක මාලාව STM32F101xx, STM32F103xx
ෆ්ලෑෂ් මතක ධාරිතාව 256 - 512 kB සමඟ
XL-ඝනත්වය startup_stm32f10x_xl.s ක්ෂුද්‍ර පාලක මාලාව STM32F101xx, STM32F103xx
ෆ්ලෑෂ් මතක ධාරිතාව 512 - 1024 kB සමඟ
සම්බන්ධතා රේඛාව startup_stm32f10x_cl.s STM32F105xx සහ STM32F107xx ශ්‍රේණිවල ක්ෂුද්‍ර පාලක

ආරම්භක ගොනුවේ බාධා කිරීම් සහ ව්‍යතිරේක දෛශික හසුරුවන්නන්ගේ නම් අඩංගු වේ, නමුත් ප්‍රතිස්ථාපන දෛශික හසුරුවන්නා පමණක් ක්‍රියාත්මක කරනු ලැබේ, ප්‍රධාන () ශ්‍රිතය ඇමතීමට පෙර සියලු ආරම්භක ආරම්භ කිරීම් සිදු කරනු ලැබේ.
අනෙකුත් සියලුම ව්‍යතිරේක හසුරුවන්නන් ක්‍රියාත්මක කිරීම යෙදුම් ක්‍රමලේඛකයාගේ වගකීම වේ. ඔබගේ වැඩසටහන කිසිදු හසුරුවන්නක් භාවිතා නොකරන්නේ නම්, ඒවා ලියාපදිංචි කිරීමට අවශ්‍ය නොවේ. ව්යතිරේකයක් සිදුවුවහොත්, පෙරනිමි හසුරුව භාවිතා කරනු ඇත - වැඩසටහන් කේතය ලූප් කිරීම.

CMSIS පුස්තකාලයේ සංයුතිය

මෙම ප්‍රකාශනයේ කලින් ලියා ඇති පරිදි, CMSIS පුස්තකාලය C භාෂා ව්‍යුහයේ මූලද්‍රව්‍ය භාවිතා කරමින් ක්ෂුද්‍ර පාලක පර්යන්ත මොඩියුල වෙත ප්‍රවේශය සපයයි.
මෙම පුස්තකාලය ක්‍රියාත්මක කිරීම කොටස් දෙකකට බෙදා ඇත. පළමු කොටස Cortex-M3 මූලික පරිධියට ප්‍රවේශය සපයන අතර දෙවන කොටස පරිධියට ප්‍රවේශය සපයයි. නිශ්චිත ආකෘතියක්ෂුද්ර පාලකය.
CMSIS ප්‍රමිතිය Cortex-M3 හරයක් සහිත සියලුම ක්ෂුද්‍ර පාලක සඳහා සමාන වන බැවින්, පළමු කොටස ක්‍රියාත්මක කිරීම සියලුම නිෂ්පාදකයින් සඳහා සමාන වේ, නමුත් දෙවන කොටස එක් එක් නිෂ්පාදකයා සඳහා වෙනස් වේ.
CMSIS හි ශීර්ෂ සහ මූලාශ්‍ර ගොනු කිහිපයක් ඇතුළත් වේ. පළමු කොටසෙහි ගොනු ඇතුළත් වේ:

  • core_cm3.h
  • core_cm3.c

CMSIS හි දෙවන කොටසෙහි C-ආරම්භක ගොනුව මෙන්ම පහත ගොනුද ඇතුළත් වේ:

  • 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 CAN අතුරුමුහුණත
CEC පරිභෝජන පාලකය
CRC චෙක්සම් ගණනය කිරීමේ මොඩියුලය
DAC ඩිජිටල් සිට ඇනලොග් පරිවර්තකය
DBGMCU microcontroller debugging
DMA සෘජු මතක ප්රවේශ පාලකය
EXTI බාහිර බාධා පාලකය
FSMC බාහිර මතක පාලකය
සැණෙළිය ෆ්ලෑෂ් වැඩසටහන් මතකය
GPIO පොදු කාර්ය I/O වරායන්
I2C I2C අතුරුමුහුණත
I2S I2S (ශබ්ද) අතුරුමුහුණත
IWDG ස්වාධීන මුරකරු ටයිමරය
NVIC කැදැලි බාධා පාලකය
PWR බල පාලකය
RCC යළි පිහිටුවීම සහ ඔරලෝසු පාලකය
RTC තත්‍ය කාලීන පාලකය (ඔරලෝසුව)
SDIO SDIO අතුරුමුහුණත
SPI SPI අතුරුමුහුණත
SysTick පද්ධති ටයිමරය
TIM මූලික හෝ උසස් ටයිමරය
USART විශ්ව අනුක්‍රමික සමමුහුර්ත-අසමමුහුර්ත
සම්ප්රේෂකය
WWDG කවුළු මුර බල්ලා

මෙම කෙටි යෙදුම් මත පදනම්ව, පුස්තකාලයේ මෘදුකාංග මොඩියුලවල නම් සෑදී ඇත. ඔබට පුස්තකාලයේ ඇති සියලුම මොඩියුල භාවිතා කිරීමට අවශ්‍ය නැත.
ව්යාපෘතියේ අවශ්ය මොඩියුල පමණක් භාවිතා කිරීම සඳහා, පුස්තකාලය වින්යාසගත කළ යුතුය.
මෙම අරමුණු සඳහා, STM32F10x SPL පුස්තකාලය භාවිතා කරන සෑම ව්‍යාපෘතියකටම ශීර්ෂ ගොනුවක් stm32f10x_conf.h තිබිය යුතුය.

#ඇතුළත් "stm32f10x_gpio.h" //#include "stm32f10x_i2c.h" //#include "stm32f10x_iwdg.h" //#include "stm32f10x_pwr.h" #ඇතුළත් "stm32f10x_gpio.h"

#ඇතුළත් "stm32f10x_gpio.h"

//#"stm32f10x_i2c.h" ඇතුලත් කරන්න

//#"stm32f10x_iwdg.h" ඇතුලත් කරන්න

//#"stm32f10x_pwr.h" ඇතුලත් කරන්න

#ඇතුළත් "stm32f10x_rcc.h"

අවශ්‍ය මොඩියුලය සක්‍රීය කිරීමට, ඔබ විධානය ඉවත් කළ යුතුය #ඇතුළත්අනුරූප ශීර්ෂ ගොනු සමඟ.
ශීර්ෂ ගොනුව stm32f10x_conf.h stm32f10x.h හි ඇතුළත් කර ඇත, එබැවින් STM32F10x SPL පුස්තකාලයේ කාර්යයන් භාවිතා කිරීමට, ඔබ ඔබේ මූලාශ්‍ර කේතයට ඇතුළත් කළ යුත්තේ stm32f10x.h එක් ශීර්ෂ ගොනුවක් පමණි.

// ගොනුවේ stm32f10x.h #ifdef USE_STDPERIPH_DRIVER #ඇතුළත් "stm32f10x_conf.h" #endif

ව්‍යාපෘතිය විසින් මැක්‍රෝ USE_STDPERIPH_DRIVER, USE_FULL_ASSERT සහ භාවිතා කරන ලද ක්ෂුද්‍ර පාලක ශ්‍රේණිය සඳහන් කරන මැක්‍රෝ එකක් ද අර්ථ දැක්විය යුතු බව මම නැවත කියමි (උදාහරණයක් ලෙස, මධ්‍යම ඝනත්ව රේඛාව සඳහා STM32F10X_MD).
ඔබ සම්මත ක්වාර්ට්ස් සංඛ්‍යාත අගය භාවිතා කරන්නේ නම් සහ පාලකය ක්‍රියාත්මක වන්නේ උපරිම ඔරලෝසු සංඛ්‍යාත 72 MHz නම්, එවිට ඔබට වෙනත් කිසිවක් වෙනස් කිරීමට සිදු නොවේ.
Makefile වෙත සම්පාදනය කිරීමට ඔබ පුස්තකාල ගොනු ලැයිස්තුවක් එක් කළ යුතුය.
උදාහරණ වශයෙන්:

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

SRC += stm32f10x_rcc . c

SRC += stm32f10x_gpio . c

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 මූලික ගෘහ නිර්මාණ ශිල්පය සහිත ක්ෂුද්‍ර පාලකයන්ට බස් රථ තුනක් ඇත:
උපදෙස් බස්, දත්ත බස් සහ පද්ධති බස්. උපදෙස් බසය හරය ෆ්ලෑෂ් වැඩසටහන් මතකයට සම්බන්ධ කරයි. දත්ත සහ පද්ධති බස්රථ AHB (ARM Hi-Speed ​​Bus) බස් න්‍යාසයකට ඒකාබද්ධ කර ඇති අතර එය මූලික සංඛ්‍යාතයෙන් ක්‍රියාත්මක වේ. කෙසේ වෙතත්, AHB බස් සංඛ්යාතය බෙදුම්කරුවන් ස්ථාපනය කිරීමෙන් අඩු කළ හැකිය. AHB බස් රථය හරය සහ DMA මොඩියුලය වැනි අධිවේගී උපාංග සම්බන්ධ කරයි.
I/O උපාංග අතරමැදි බස්රථ APB1 සහ APB2 (ARM Peripheral Bus) හරහා AHB බසයට සම්බන්ධ වේ.
APB2 බසයේ උපරිම මෙහෙයුම් සංඛ්‍යාතය 72 MHz වේ, APB1 බසයේ සංඛ්‍යාතය
36MHz වලට සීමා වේ.
ඔබ භාවිතා කරන පර්යන්ත මොඩියුලය සම්බන්ධ කර ඇත්තේ කුමන බස් රථයකටද යන්න ලේඛනගත කිරීමෙන් හෝ stm32f10x_rcc.h යන ශීර්ෂ ගොනුවෙන් බලන්න.
මෙම ගොනුව විවෘත කර RCC_AHBPeriph, RCC_APB1Periph සහ RCC_APB2Periph අගයන් අනුපිළිවෙලින් සොයන්න.

#RCC_AHBPeriph_DMA1 නිර්වචනය කරන්න ((uint32_t)0x00000001) #RCC_AHBPeriph_DMA2 නිර්වචනය කරන්න ((uint32_t)0x00000002) #ආර්සීසී_AHBPeriph_SRAM නිර්වචනය කරන්න ((uint32_t) iph_FLITF ((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_USART2 B1Periph_UART5 ((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 . memberN = 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 ශ්‍රිතයේ පළමු තර්කය GPIOC පර්යන්තයේ මතක ප්‍රදේශයට දර්ශකයක් වන අතර එය GPIO_TypeDef ව්‍යුහයකට දර්ශකයක් බවට පරිවර්තනය කරයි.

// stm32f10x.h #GPIOC නිර්වචනය කරන්න ((GPIO_TypeDef *) GPIOC_BASE) #GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define APB2PERIPH_BASE (PERIPH_define + 0x1000000000000000000 000) typedef struct (__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;

// stm32f10x.h

#GPIOC නිර්වචනය කරන්න ((GPIO_TypeDef *) GPIOC_BASE)

#GPIOC_BASE නිර්වචනය කරන්න (APB2PERIPH_BASE + 0x1000)

#APB2PERIPH_BASE නිර්වචනය කරන්න (PERIPH_BASE + 0x10000)

#PERIPH_BASE නිර්වචනය කරන්න ((uint32_t)0x40000000)

typedef struct

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 struct (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_00GOPO_0 1C, GPIO_Mode_AF_PP = 0x18 )GPIOMode_TypeDef;

//stm32f10x_gpio.h

typedef struct

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_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 MHz දක්වා
10 ප්රතිදාන සංඛ්යාතය 2 MHz දක්වා
11 ප්රතිදාන සංඛ්යාතය 50 MHz දක්වා

CNF - ප්රතිදාන වින්යාස බිටු. මෙහෙයුම් ආකාරය මත රඳා පවතී:

පින් වින්‍යාස ලේඛනයේ මෙම ව්‍යුහය සමඟ, වින්‍යාසය සඳහා සියලුම බිටු ඔබම සැකසීම අතිශයින්ම අපහසු වනු ඇති බවට එකඟ වන්න. GPIO_Init පුස්තකාල ශ්‍රිතය භාවිතයෙන් මෙය කිරීම වඩාත් පහසු වනු ඇත.
ඔබ පර්යන්ත මොඩියුලය ආරම්භ කළ පසු, එය PPP_Cmd ශ්‍රිතය භාවිතයෙන් සක්‍රිය කළ යුතුය:

PPP_Cmd(PPP, සක්රිය කරන්න);

PPP_Cmd(PPP, සක්රිය කරන්න);

GPIO මොඩියුල සඳහා මෙම ශ්‍රිතය නොපවතී; ආරම්භ කිරීමෙන් පසු, ඔබට වහාම GPIO පින් භාවිතා කළ හැක. පුස්තකාලය ක්ෂුද්ර පාලක දෘඪාංග සඳහා අතුරු මුහුණතක් පමණක් සපයන බව මතක තබා ගත යුතුය. දෘඪාංග මොඩියුලයේ සක්‍රිය/අක්‍රිය කිරීමේ ධජයක් නොමැති නම්, ක්‍රියාකාරී ඇමතුම PPP_Cmd(PPP, සක්‍රීය කරන්න)නොහැකි ය.
ප්‍රතිදාන ප්‍රකාරයේදී GPIOx පින් එකේ තත්වය පාලනය කිරීමට සහ ආදාන හෝ ප්‍රතිදාන මාදිලියේ අගය කියවීමට, පුස්තකාලය පහත සඳහන් කාර්යයන් සපයයි:

අවලංගු GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); අවලංගු 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);

අවලංගු GPIO_SetBits (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) ;

අවලංගු 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 core interrupt vectors 15ක් සහ එක් බාහිර ආවරණ නොවන EXTI බාධාවක් ඇත.
පාලකය කැදලි බාධා කිරීම් සඳහා සහය දක්වයි, එක් හසුරුවන්නක් තුළ තවත් බාධාවක් සිදුවිය හැක. මේ සම්බන්ධයෙන්, එක් එක් බාධා කිරීම් මූලාශ්‍රවලට තමන්ගේම ප්‍රමුඛතාවයක් ඇත. බාධා කිරීම් ප්‍රමුඛතා මට්ටම් 16කට සහය දක්වයි.
Cortex-M3 core interrupt vectors වලට ඉහලම ප්‍රමුඛතා අගයන් ඇත.
ඉහළම බාධා කිරීම් මට්ටම් තුන දෛශික සඳහා පවරා ඇති අතර ඒවා වෙනස් කළ නොහැක:

අංකය හසුරුවන්නා ප්රමුඛතාවයක් විස්තර
1 Reset_Handler -3 (ඉහළම) දෛශිකය යළි පිහිටුවන්න
2 NMI_හැන්ඩ්ලර් -2 ආවරණ කළ නොහැකි බාධාව
3 HardFault_Handler -1 හදිසි කොන්දේසි

අනෙකුත් සියලුම බාධා දෛශික සඳහා 0 සිට 15 දක්වා ප්‍රමුඛතා මට්ටම් පැවරිය හැක.
ඉහළම ප්රමුඛතා මට්ටම අඩු අගයකට අනුරූප වේ. ප්‍රමුඛතා මට්ටම තනි දෛශිකයකට පමණක් නොව සමස්ත දෛශික කණ්ඩායමකට ද පැවරිය හැක. මෙම විශේෂාංගය බාධා දෛශික විශාල සංඛ්යාවක් සමඟ වැඩ කිරීම පහසු කරයි.
ප්‍රමුඛතා කණ්ඩායම සැකසීමට, STM32F10x SPL පුස්තකාලයේ ශ්‍රිතයක් භාවිතා වේ.

දිගු කලක්, ඉතා දිගු කාලයක් වුවද, අපගේ ලිපියේ නව ලිපි කිසිවක් නොතිබුණි, එබැවින් එය අල්ලා ගැනීමට කාලයයි 😉 අද අපි STM32F4 අධ්යයනය කිරීමට පටන් ගනිමු. තවද, බොහෝ විට, අපි මෙම පාලකයන් සඳහා නව ව්‍යාපෘතියක් නිර්මාණය කිරීමෙන් ආරම්භ කරමු, නමුත්, අවංකව කිවහොත්, මට ඒ ගැන ලිපියක් ලිවීමට අවශ්‍ය නොවීය, මන්ද නව ව්යාපෘතියමෙහිදී එය නිර්මාණය කර ඇත්තේ ප්‍රතිපත්තිමය වශයෙන් STM32F103 () සඳහා වන ආකාරයටම ය. නමුත් තවමත් STM32F4 සමඟ යම් යම් දුෂ්කරතා ඇති වේ, එසේ වුවද, මෙම ක්‍රියාවලිය විස්තරාත්මකව සලකා බලමු)

ඉතින්, අපි Keil දියත් කරමු, නව ව්‍යාපෘතියක් නිර්මාණය කරමු - ව්යාපෘතිය -> නව uVision ව්යාපෘතිය.අපි නව ව්‍යාපෘතිය යම් ෆෝල්ඩරයක සුරකිමු, පසුව භාවිතා කිරීමට ක්ෂුද්‍ර පාලකය තෝරා ගැනීමට අපෙන් අසනු ඇත. හොඳයි, අපි තෝරා ගනිමු, එය STM32F407VG වීමට ඉඩ දෙන්න:

අවසන්, දිස්වන සංවාද කොටුවේ, "ඔව්" ක්ලික් කරන්න, එවිට පළමු ගොනුව අපගේ ව්‍යාපෘතියට එකතු වේ - startup_stm32f4xx.s. ඉස්සර වගේ අපි පුස්තකාල පාවිච්චි කරමු CMSISසහ සම්මත පර්යන්ත පුස්තකාලය, නමුත්, ස්වභාවිකවම, දැනටමත් STM32F4xx පාලකයන් සඳහා. ඒ නිසා අපි අනිවාර්යයෙන්ම ඒවා බාගත කර අපගේ තවමත් හිස් ව්‍යාපෘතියට අවශ්‍ය ගොනු එකතු කළ යුතුය. මාර්ගය වන විට, මම F4 සඳහා "එසේ නොවන" පුස්තකාල හරහා පැමිණෙන බව විවිධ පුද්ගලයන්ගෙන් කිහිප වතාවක්ම අසා ඇති අතර, සරලම ව්යාපෘතිය පවා එකට එකතු කර නැත. මම මෙයට මුහුණ දී නැත, කෙසේ වෙතත්, මා විසින්ම භාවිතා කරන පරීක්ෂා කරන ලද පුස්තකාල මෙන්න:

ඉතින්, අපි එය බාගත කළා, සියල්ල සූදානම්, දැන් අපි ව්යාපෘතියට ගොනු එකතු කරන්නෙමු. ඔබට අවශ්‍ය දේ පින්තූරයේ දැක්වේ:

හොඳයි, සූදානම සම්පූර්ණයි, දැන් අපි නව .c ගොනුවක් නිර්මාණය කරමු, එහි අපගේ කේතය අඩංගු වේ. අපි යමු ගොනුව->නව, Keil හි හිස් ගොනුවක් විවෘත වේ, ක්ලික් කරන්න ගොනුව-> ලෙස සුරකින්නඋදාහරණයක් ලෙස test.c නමින් එය සුරකින්න. සුරැකීමේදී, ගොනු දිගුව (.c) සඳහන් කිරීමට අමතක නොකරන්න. ගොනුව නිර්මාණය කර ඇත, විශිෂ්ටයි, නමුත් අපි එය අපගේ ව්‍යාපෘතියට එකතු කළ යුතුය. හොඳයි, ඇත්ත වශයෙන්ම, ඒ ගැන සංකීර්ණ කිසිවක් නොමැත 😉 අපි මෙම ගොනුවට හිස් පරීක්ෂණ වැඩසටහනක් ලියමු:

#ඇතුළත් "stm32f4xx.h" #ඇතුළත් "stm32f4xx_rcc.h" #ඇතුළත් "stm32f4xx_gpio.h" /*******************************************************************/ int main() ( අතර (1 ) (__NOP() ;) ) /*******************************************************************/

සෑම දෙයක්ම පාහේ සූදානම්, ඉතිරිව ඇත්තේ ව්යාපෘති සැකසුම් දෙස බැලීමයි - ව්‍යාපෘතිය->ඉලක්ක සඳහා විකල්ප...බොහෝ ටැබ් සමඟ කවුළුවක් විවෘත වේ, අපි මෙහි කිහිපයක් ගැන පමණක් උනන්දු වෙමු. ටැබ් එක විවෘත කරන්න C/C++සහ නිර්වචන ක්ෂේත්රයේ අපි ලියන්නෙමු:

හොඳයි, ක්ෂේත්රයේ පහළට ව්‍යාපෘතියට ඇතුළත් කර ඇති සියලුම ලිපිගොනු සඳහා ඔබට මාර්ග එක් කිරීමට අවශ්‍ය වේ. මෙම පියවර සම්පූර්ණ කිරීමෙන් පසු, ඔබට F7 (Build) එබිය හැකිය, සහ ව්‍යාපෘතිය දෝෂ හෝ අනතුරු ඇඟවීම් නොමැතිව ගොඩනගනු ඇත. ඔබට පෙනෙන පරිදි, කිසිවක් සංකීර්ණ නොවේ)

නමුත් පොදුවේ ගත් කල, මම පෞද්ගලිකව දේවල් ටිකක් වෙනස් ලෙස කරමි. මෙම ප්රවේශයේ අවාසිය දෙස බලන්න. ඉතින් අපි CMSIS සහ SPL පුස්තකාල කොහේ හරි බාගත කර, මෙම ෆෝල්ඩර වලින් ගොනු එකතු කර, ලිපිගොනු සඳහා මාර්ග ලියා ඇත, සියල්ල සිසිල් ය. එහෙත්! මෙම ව්‍යාපෘතිය වෙනත් පරිගණකයක ගොඩනඟන්නේ නැත, මන්ද මෙම මාර්ග සියල්ලම නිරපේක්ෂ වේ, එනම් ඒවා ඔබේ පරිගණකයේ විශේෂිත ෆෝල්ඩර වෙත යොමු කරයි. තවද වෙනත් යන්ත්‍රයක් මත ඔබට නව ව්‍යාපෘතියක් නිර්මාණය කිරීමට අවශ්‍ය පියවර නැවත ක්‍රියාත්මක කිරීමට සිදුවේ. මෙය විශාල අවාසියකි. එමනිසා, මම සාමාන්‍යයෙන් නව ව්‍යාපෘතියක් සඳහා වෙනම ෆෝල්ඩරයක් නිර්මාණය කරමි, එහි මම CMSIS, SPL සහ භාවිතා කරන වෙනත් පුස්තකාල සඳහා උප ෆෝල්ඩර නිර්මාණය කරමි, සහ මෙම ෆෝල්ඩර තුළට මම එක් එක් විශේෂිත ව්‍යාපෘතියට අවශ්‍ය සියලුම ගොනු තබමි. උදාහරණයක් ලෙස, අපගේ නව ව්‍යාපෘතිය සඳහා STM32F4_Test ෆෝල්ඩරය සහ එහි ඇති පහත ෆෝල්ඩර නිර්මාණය කරමු:

ලිපියේ ආරම්භයේ ඇති ව්‍යාපෘතිය නිර්මාණය කිරීමේදී අප විසින් එකතු කරන ලද සියලුම ලිපිගොනු මම CMSIS සහ SPL ෆෝල්ඩර තුළට දමමි. දැන් අපි Keil දියත් කර, නව ව්‍යාපෘතියක් සාදා එය අපගේ ව්‍යාපෘති උප ෆෝල්ඩරයේ සුරකින්නෙමු, එවිට සියලුම ව්‍යාපෘති ගොනු එක තැනක ඇති අතර අවුල් ඇති නොවන පරිදි)

ව්‍යාපෘතිය නිර්මාණය කර ඇත, දැන්, පෙර මෙන්, අපි එයට STM32F4_CMSIS සහ STM32F4_SPL ෆෝල්ඩරවල ඇති සියලුම ගොනු එකතු කරමු. අපි ප්‍රධාන () ශ්‍රිතය සහිත අපගේ test .c ගොනුව මූලාශ්‍ර ෆෝල්ඩරයට දමා එය ව්‍යාපෘතියට ද එක් කරන්නෙමු. ඉතිරිව ඇත්තේ සැකසුම් වින්‍යාස කිරීම පමණි =) සියල්ල එක හා සමානයි - අර්ථ දැක්වීමේ ක්ෂේත්‍රයේ අපි ලියන්නෙමු:

USE_STDPERIPH_DRIVER,STM32F4XX



අපි ව්යාපෘතිය එකලස් කරමු - දෝෂ නොමැත, ගුවන් ගමන සාමාන්යයි! ප්‍රතිපත්තිමය වශයෙන්, අවසානයේ අපට ලැබුණේ එකම දෙයයි, නමුත් දැන් ව්‍යාපෘතිය වෙනත් ඕනෑම පරිගණකයක කිසිදු ගැටළුවක් නොමැතිව වහාම එකලස් කරනු ඇත, මෙය ඉතා පහසු සහ ප්‍රයෝජනවත් වේ) නියත වශයෙන්ම සියලුම ව්‍යාපෘති ගොනු දැන් අසල, එකම ෆෝල්ඩරයේ පිහිටා ඇත, සහ මාර්ග සාපේක්ෂ වී ඇති අතර වෙනස් කළ යුතු නැත.
එපමණයි, ඇත්ත වශයෙන්ම, නුදුරු අනාගතයේදී අපි STM32F4 වැඩසටහන් කිරීමට යමක් කරන්නෙමු, නියත වශයෙන්ම, එබැවින් ඉක්මනින් හමුවෙමු!;)

සම්පූර්ණ ව්‍යාපෘතිය උදාහරණ ලිපියෙන් -

සම්මත පුස්තකාලය පද්ධතියට සම්බන්ධ කර ඇති බව මම පෙන්වා දුන්නා. ඇත්ත වශයෙන්ම, CMSIS සම්බන්ධ වී ඇත - MK හි සාමාන්‍ය ව්‍යුහාත්මක නිරූපණයේ පද්ධතිය මෙන්ම SPL - සම්මත පර්යන්ත පුස්තකාලය. අපි ඒවා එක් එක් දෙස බලමු:

CMSIS
එය ශීර්ෂ ගොනු කට්ටලයක් සහ MK හි හරය සහ පරිධිය සමඟ වැඩ ඒකාබද්ධ කිරීම සහ ව්‍යුහගත කිරීම සඳහා කුඩා කේත කට්ටලයකි. ඇත්ත වශයෙන්ම, මෙම ගොනු නොමැතිව MK සමඟ සාමාන්යයෙන් වැඩ කිරීමට නොහැකි ය. ඔබට MK සඳහා වන ලේඛන පිටුවෙන් පුස්තකාලය ලබා ගත හැක.
මෙම පුස්තකාලය, විස්තරයට අනුව, Cortex පවුලේ ඕනෑම MK සමඟ වැඩ කිරීමේදී අතුරු මුහුණත් ඒකාබද්ධ කිරීම සඳහා නිර්මාණය කර ඇත. කෙසේ වෙතත්, යථාර්ථයේ දී මෙය සත්ය වන්නේ එක් නිෂ්පාදකයෙකු සඳහා පමණක් බව පෙනී යයි, i.e. වෙනත් සමාගමකින් ක්ෂුද්‍ර පාලකයකට මාරු වීමෙන්, මුල සිටම පාහේ එහි පර්යන්ත අධ්‍යයනය කිරීමට ඔබට බල කෙරෙයි.
MK හි ප්‍රොසෙසර හරයට අදාළ ලිපිගොනු සියලුම නිෂ්පාදකයින්ට සමාන වුවද (ඒවාට එකම ප්‍රොසෙසර හර ආකෘතියක් ඇති නිසා පමණක් - ARM මගින් IP කුට්ටි ආකාරයෙන් සපයනු ලැබේ).
එබැවින්, රෙජිස්ටර්, උපදෙස්, බාධා කිරීම් සහ කොප්‍රොසෙසර් ඒකක වැනි කර්නලයේ කොටස් සමඟ වැඩ කිරීම සෑම කෙනෙකුටම සම්මත වේ.
පරිධිය සම්බන්ධයෙන් ගත් කල, STM32 සහ STM8 (හදිසියේ) බොහෝ දුරට සමාන වන අතර ST විසින් නිකුත් කරන ලද අනෙකුත් MK සඳහාද මෙය අර්ධ වශයෙන් සත්‍ය වේ. ප්‍රායෝගික කොටසේදී, CMSIS භාවිතා කිරීම කොතරම් පහසුදැයි මම පෙන්වන්නම්. කෙසේ වෙතත්, එය භාවිතා කිරීමේ දුෂ්කරතා ලේඛන කියවීමට සහ MK නිර්මාණය තේරුම් ගැනීමට මිනිසුන්ගේ අකමැත්ත සමඟ සම්බන්ධ වේ.

SPL
සම්මත පර්යන්ත පුස්තකාලය - සම්මත පර්යන්ත පුස්තකාලය. නමට අනුව, මෙම පුස්තකාලයේ අරමුණ MK හි පරිධිය සඳහා වියුක්තයක් නිර්මාණය කිරීමයි. පුස්තකාලය ශීර්ෂ ගොනු වලින් සමන්විත වන අතර එහිදී MK පර්යන්ත වින්‍යාස කිරීම සහ වැඩ කිරීම සඳහා මිනිසුන්ට කියවිය හැකි නියතයන් ප්‍රකාශ කරනු ලබන අතර පර්යන්ත සමඟ ක්‍රියා කිරීම සඳහා පුස්තකාලය තුළම එකතු කරන ලද ප්‍රභව කේත ගොනු ද ඇත.
SPL යනු CMSIS හරහා වියුක්ත කිරීමකි, එක් නිෂ්පාදකයෙකුගෙන් පමණක් නොව, සාමාන්‍යයෙන් සියලුම MCUs Cortex-Mxx ප්‍රොසෙසර හරයක් සහිත සියලුම MCU සඳහා පොදු අතුරු මුහුණතක් පරිශීලකයාට ඉදිරිපත් කරයි.
ආරම්භකයින් සඳහා එය වඩාත් පහසු බව විශ්වාස කෙරේ, මන්ද ... පර්යන්ත ක්‍රියා කරන ආකාරය ගැන නොසිතීමට ඔබට ඉඩ සලසයි, නමුත් කේතයේ ගුණාත්මකභාවය, ප්‍රවේශයේ විශ්වීයත්වය සහ අතුරුමුහුණත් වල සීමාව සංවර්ධකයාට යම් සීමාවන් පනවා ඇත.
එසේම, පුස්තකාලයේ ක්‍රියාකාරීත්වය සෑම විටම USART (විශ්වීය සමමුහුර්ත-අසමමුහුර්ත අනුක්‍රමික පෝට්) වැනි සමහර සංරචකවල වින්‍යාසය නිශ්චිත කොන්දේසි යටතේ නිවැරදිව ක්‍රියාත්මක කිරීමට ඉඩ නොදේ. ප්‍රායෝගික කොටසේදී, පුස්තකාලයේ මෙම කොටස සමඟ වැඩ කිරීම ද මම විස්තර කරමි.

ආයුබෝවන් සියල්ලටම. පසුගිය ලිපියේ ඔබට මතක ඇති පරිදි අපි සකස් කළෙමු මෘදුකාංග පැකේජය STM32 ක්ෂුද්‍ර පාලක සමඟ වැඩ කිරීමට සහ පළමු වැඩසටහන සම්පාදනය කරන ලදී. මෙම ලිපියෙන් අපි මෙම පුවරුවේ ගෘහ නිර්මාණ ශිල්පය, ක්ෂුද්‍ර පාලකය සහ වැඩ සඳහා පවතින පුස්තකාල පිළිබඳව දැන හඳුනා ගනිමු.

පහත දැක්වෙන්නේ පුවරුවේ පින්තූරයකි STM32F3 සොයාගැනීම , කොහෙද: 1 - MEMS සංවේදකය. L3GD20 3-අක්ෂ ඩිජිටල් ගයිරොස්කෝප්. 2 - 3-අක්ෂ සංඛ්‍යාංක රේඛීය ත්වරණමානයක් සහ 3-අක්ෂ සංඛ්‍යාංක භූ චුම්භක සංවේදකය LSM303DLHC අඩංගු MEMS පද්ධතිය-අ-නඩුව. 4 - LD1 (PWR) - 3.3V බල සැපයුම. 5 - LD2 - රතු / කොළ LED. පෙරනිමිය රතු ය. හරිත යනු ST-LINK/v2 (හෝ V2-B) සහ PC අතර සන්නිවේදනයයි. මා සතුව ST-LINK/v2-B, මෙන්ම අභිරුචි සංදර්ශකයක් ඇත USB port. 6. -LD3/10 (රතු), LD4/9 (නිල්), LD5/8 (තැඹිලි) සහ LD6/7 (කොළ). පසුගිය පෝස්ට් එකේ අපි LD4 LED එක flash කළා. 7. - බොත්තම් දෙකක්: අභිරුචි USER සහ RESET නැවත සකසන්න. 8. - මිනි-බී සම්බන්ධකය සහිත USB පරිශීලක.

9 - USB debugger/programmer ST-LINK/V2. 1 0. - ක්ෂුද්ර පාලකය STM32F303VCT6. 11. - බාහිර අධි-සංඛ්‍යාත උත්පාදක 8 MHz. 12. - මෙහි අඩු සංඛ්යාත උත්පාදක යන්ත්රයක් තිබිය යුතුය, අවාසනාවකට එය පෑස්සුවේ නැත. 13. - SWD - අතුරු මුහුණත. 14. - බාහිර හෝ අභ්යන්තර පාලක ක්රමලේඛනය තෝරාගැනීම සඳහා ජම්පර්, පළමු අවස්ථාවේ දී ඉවත් කළ යුතුය. 15 - ජම්පර් JP3 - පාලකයේ පරිභෝජනය මැනීම සඳහා ammeter සම්බන්ධ කිරීම සඳහා නිර්මාණය කර ඇති ජම්පර්. එය මකා දැමුවහොත් අපගේ ගල ආරම්භ නොවන බව පැහැදිලිය. 16. – STM32F103C8T6 එහි දෝශ නිරාකරණ පුවරුවක් ඇත. 17. - අඩු වෝල්ටීයතා පහත වැටීමක් සහ ශබ්ද මට්ටමක් සහිත LD3985M33R නියාමකය, 150mA, 3.3V.

දැන් අපි STM32F303VCT6 ක්ෂුද්‍ර පාලකයේ ගෘහ නිර්මාණ ශිල්පය දෙස සමීපව බලමු. ඔහුගේ තාක්ෂණික පිරිවිතර: LQFP-100 නඩුව, ARM Cortex-M4 core, උපරිම හර සංඛ්‍යාතය 72 MHz, වැඩසටහන් මතක ධාරිතාව 256 KB, මතක වර්ගය ෆ්ලෑෂ් වැඩසටහන්, පරිමාව අහඹු ප්රවේශ මතකය SRAM 40 kbytes, RAM 8 kbytes, inputs/outputs 87, අතුරුමුහුණත් (CAN, I²C, IrDA, LIN, SPI, UART/USART, USB), පර්යන්ත (DMA, I2S, POR, PWM, WDT), ADC/DAC 4 *12 bit/2*12bit, සැපයුම් වෝල්ටීයතාවය 2...3.6 V, මෙහෙයුම් උෂ්ණත්වය –40...+85 C. පහත රූපයේ pinout එකක් ඇත, එහිදී අපට input/output ports 87ක් පෙනෙන අතර, ඒවායින් 45ක් සාමාන්‍ය I/Os (TC, TTa), 42 5-volt tolerant I/Os (FT, FTf) - 5 V. සමග අනුකූල වේ (පුවරුවේ දකුණු පසින් 5V අල්ෙපෙනති, වම් පසින් 3.3V). සෑම ඩිජිටල් I/O රේඛාවක්ම සාමාන්‍ය I/O රේඛාවක් ලෙස සේවය කළ හැක.
ගමනාන්තය හෝ විකල්ප කාර්යය. ව්‍යාපෘති ප්‍රගතියත් සමඟම, අපි ක්‍රමයෙන් පරිධිය සමඟ දැන හඳුනා ගන්නෙමු.

පහත බ්ලොක් රූප සටහන සලකා බලන්න. හදවත 72 MHz දක්වා ක්‍රියාත්මක වන 32-bit ARM Cortex-M4 හරයකි. එහි ගොඩනඟන ලද පාවෙන ලක්ෂ්‍ය ඒකකය FPU සහ මතක ආරක්ෂණ ඒකකය MPU, බිල්ට් මැක්‍රෝ ට්‍රේසිං සෛල - Embedded Trace Macrocell (ETM), ක්ෂුද්‍ර පාලකය තුළ ප්‍රධාන වැඩසටහන ක්‍රියාත්මක කිරීමේ ක්‍රියාවලිය නිරීක්ෂණය කිරීමට භාවිතා කළ හැකිය. උපාංගය ක්‍රියාත්මක වන තාක් ETM සම්බන්ධතා හරහා මෙම නිරීක්ෂණ අඛණ්ඩව ප්‍රතිදානය කිරීමට ඔවුන්ට හැකියාව ඇත. NVIC (Nested vectored interrupt controller) - බාධා කිරීම් පාලන මොඩියුලය. TPIU (Trace Port Interface Unit). ෆ්ලෑෂ් මතකය අඩංගු වේ - 256 KB, SRAM 40 KB, RAM 8 KB. හරය සහ මතකය අතර බස් න්‍යාසයක් ඇත, එය උපාංග සෘජුවම සම්බන්ධ කිරීමට ඉඩ සලසයි. තවද මෙහිදී අපි බස් න්‍යාස AHB සහ APB වර්ග දෙකක් දකිමු, එහිදී පළමුවැන්න වඩාත් ඵලදායී වන අතර අධිවේගී සන්නිවේදනය සඳහා භාවිතා වේ. අභ්යන්තර සංරචක, සහ දෙවැන්න පර්යන්ත (ආදාන/ප්‍රතිදාන උපාංග) සඳහා වේ. පාලකය සතුව 12-bit ADCs (ADC) 4 (5Mbit/s) සහ උෂ්ණත්ව සංවේදකයක්, 7 සංසන්දක (GP Comparator1...7), 4 ක්‍රමලේඛගත කළ හැකි මෙහෙයුම් ඇම්ප්ලිෆයර් (OpAmp1...4) (PGA (Programmable Gain Array) ඇත. ), 2 12-bit DAC නාලිකා (DAC), RTC (තත්‍ය කාල ඔරලෝසුව), මුරකරු ටයිමර් දෙකක් - ස්වාධීන සහ කවුළු සහිත (WinWatchdog සහ Ind. WDG32K), 17 පොදු කාර්ය සහ බහුකාර්ය ටයිමර්.

පොදුවේ ගත් කල, අපි පාලක ගෘහ නිර්මාණ ශිල්පය දෙස බැලුවෙමු. දැන් තිබෙන මෘදුකාංග පුස්තකාල බලන්න. දළ විශ්ලේෂණයක් කිරීමෙන් පසු, අපට පහත සඳහන් දෑ ඉස්මතු කළ හැක: CMSIS, SPL සහ HAL. LED එකක් දැල්වීම පිළිබඳ සරල උදාහරණයක් භාවිතා කරමින් අපි එක් එක් දෙස බලමු.

1). CMSIS(Cortex Microcontroller Software Interface Standard) - Cortex®-M සඳහා සම්මත පුස්තකාලය. උපාංග සහාය සහ සරල කිරීම සපයයි මෘදුකාංග අතුරුමුහුණත්. CMSIS ස්ථාවර සහ සපයයි සරල අතුරුමුහුණත්කර්නලය, එහි පර්යන්ත සහ තත්‍ය කාලීන මෙහෙයුම් පද්ධති සඳහා. එහි භාවිතය වැඩසටහන් ලිවීමට වෘත්තීය ක්‍රමයක් වන නිසා... රෙජිස්ටර් වෙත සෘජුව ලිවීම ඇතුළත් වන අතර, ඒ අනුව, දත්ත පත්‍රිකා නිරන්තරයෙන් කියවීම සහ අධ්‍යයනය කිරීම අවශ්‍ය වේ. දෘඪාංග නිෂ්පාදකයාගෙන් ස්වාධීන.
CMSIS පහත සඳහන් සංරචක ඇතුළත් වේ:
- CMSIS-CORE: ස්ථාවර පද්ධති ආරම්භය සහ පර්යන්ත ප්‍රවේශය;
- CMSIS-RTOS: නිර්ණායක තත්‍ය කාලීන මෘදුකාංග ක්‍රියාත්මක කිරීම මෘදුකාංගතත්ය කාලය);
- CMSIS-DSP: ඩිජිටල් සංඥා සැකසීමේ වේගවත් ක්රියාත්මක කිරීම ඩිජිටල් සැකසුම්සංඥා);
- CMSIS-ධාවක: මිඩ්ල්වෙයාර් සහ යෙදුම් කේතය සඳහා සාමාන්‍ය පර්යන්ත අතුරුමුහුණත් (මිඩ්ල්වෙයාර් සහ යෙදුම් කේතය සඳහා සාමාන්‍ය පර්යන්ත අතුරුමුහුණත්);
- CMSIS-Pack: නැවත භාවිත කළ හැකි මෘදුකාංග සංරචක සඳහා පහසු ප්‍රවේශය මෘදුකාංග සංරචක);
- CMSIS-SVD: උපාංගය සහ පර්යන්ත සඳහා ස්ථාවර දසුන පර්යන්ත උපාංග);
- CMSIS-DAP: අඩු වියදම් ඇගයුම් දෘඪාංග වෙත සම්බන්ධ වීම. දෝශ නිරාකරණ මෘදුකාංග.

උදාහරණයක් ලෙස, අපි වැඩසටහනක් ලියමු - LED එකක් blink කරන්න. මේ සඳහා අපට රෙජිස්ටර් විස්තර කරන ලියකියවිලි අවශ්‍ය වේ. මගේ තත්වයේදි RM0316 යොමු අත්පොත STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC, STM32F398xE උසස් ARM ® -පාදක MCUs, මෙන්ම එය නිශ්චිත පාදය සඳහා වගකිව යුතු විස්තරයකි. DS9118: ARM®-පාදක Cortex®-M4 32b MCU+FPU, 256KB දක්වා Flash+ 48KB SRAM, 4 ADCs, 2 DAC ch., 7 comp, 4 PGA, timers, 2.0-3.6 V.ආරම්භ කිරීම සඳහා, අපි වැඩසටහනේ වරාය ඔරලෝසු කරන්නෙමු, මන්ද පෙරනිමියෙන්, සෑම දෙයක්ම අක්රිය කර ඇති අතර එමඟින් බලශක්ති පරිභෝජනය අඩු වේ. විමර්ශන අත්පොත විවෘත කර යළි පිහිටුවීම සහ ඔරලෝසු පාලන අංශය බලන්න, ඉන්පසු 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 . දෙවැන්න වන්නේ කකුලේ අඩු / ඉහළ මට්ටමට හැරීම සඳහා ය. පහත දැක්වෙන්නේ එම වැඩසටහනයි.

#ඇතුළත් "stm32f3xx.h " //Microcontroller ශීර්ෂ ගොනුව
අත්සන් නොකළ int i;
හිස් ප්‍රමාදය () (
සඳහා (i=0;i<500000;i++);
}
int main (හිස්) (
RCC->AHBENR|=(1<<21);
GPIOE->MODER|=0×10000;
අතර (1)(
ප්රමාදය ();
GPIOE->ODR|=0×100;
ප්රමාදය ();
GPIOE->ODR&=~(0×100);
} }

2). SPL(සම්මත පර්යන්ත පුස්තකාලය)- මෙම පුස්තකාලය ST ඉලෙක්ට්‍රොනික්ස් වෙතින් සියලුම ප්‍රොසෙසර ඒකාබද්ධ කිරීමට අදහස් කෙරේ. කේත අතේ ගෙන යා හැකි බව වැඩි දියුණු කිරීම සඳහා නිර්මාණය කර ඇති අතර මූලික වශයෙන් ආරම්භක සංවර්ධකයින් ඉලක්ක කර ඇත. ST විසින් HAL සමඟ අනුකූල වන "පහළ ස්ථරය" ලෙස හඳුන්වන SPL සඳහා ආදේශකයක් මත වැඩ කරමින් සිටී. අඩු ස්ථර (LL) ධාවක නිර්මාණය කර ඇත්තේ HAL වලට වඩා දෘඪාංගයට සමීප වන, පාහේ සැහැල්ලු, විශේෂඥ-නැඹුරු ස්ථරයක් සැපයීම සඳහා ය. HAL වලට අමතරව, LL API ද තිබේ. SPL හි එකම වැඩසටහනේ උදාහරණයක්.

#ඇතුළත්
#ඇතුළත්
#ඇතුළත්
# LED GPIO_Pin_8 නිර්වචනය කරන්න
int main() (
දිගු i;
GPIO_InitTypeDef gpio;
// නිල් LED වරාය 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);
// දැල්වෙන LEDS
අතරතුර (1) (
//මත
GPIO_SetBits(GPIOE, LED);
සඳහා (i = 0; i< 500000; i++);
//සියල්ල අක්‍රියයි
GPIO_ResetBits(GPIOE, LED);
සඳහා (i = 0; i< 500000; i++);
} }

සෑම කාර්යයක්ම තාක්ෂණික ලියකියවිලිවල විස්තර කර ඇත UM1581 STM32F30xx/31xx සම්මත පර්යන්ත පුස්තකාලයේ පරිශීලක අත්පොත විස්තරය. මෙහිදී අපි අවශ්‍ය දත්ත, ව්‍යුහයන්, යළි පිහිටුවීම සහ සමමුහුර්තකරණ පාලන කාර්යයන් මෙන්ම ආදාන/ප්‍රතිදාන වරායන් වින්‍යාස කිරීම සඳහා අඩංගු ශීර්ෂ ගොනු තුනක් සම්බන්ධ කරමු.

3). HAL- (දෘඪාංග ප්‍රවේශ මට්ටම, දෘඪාංග වියුක්ත ස්තරය)- සංවර්ධනය සඳහා තවත් පොදු පුස්තකාලයක්. අපි පසුගිය ලිපියේ භාවිතා කළ වින්‍යාසය සඳහා වූ CubeMX වැඩසටහන ද නිකුත් කරන ලදී. එහිදී අපි මෙම පුස්තකාලය භාවිතයෙන් LED එකක් දැල්වීමේ වැඩසටහනක් ද ලිව්වෙමු. අපි පහත රූපයේ දකින පරිදි, ඝනකයක් HAL සහ CMSIS ධාවක ජනනය කරයි. හොඳයි, භාවිතා කරන ප්‍රධාන ගොනු විස්තර කරමු:
- system_stm32f3x.c සහ system_stm32f3x.h- කාල පද්ධතිය වින්යාස කිරීම සඳහා අවම කාර්යයන් කට්ටල ලබා දීම;
- core_cm4.h - හරය සහ එහි පර්යන්තවල රෙජිස්ටර් වෙත ප්රවේශය සපයයි;
- stm32f3x.h - ක්ෂුද්ර පාලක ශීර්ෂ ගොනුව;
— startup_system32f3x.s — ආරම්භක කේතය, බාධා දෛශික වගුවක් ආදිය අඩංගු වේ.

#"main.h" ඇතුලත් කරන්න
#ඇතුළත් "stm32f3xx_hal.h"
හිස් SystemClock_Config(ශුන්‍ය); /* ඔරලෝසු වින්‍යාස ක්‍රියාකාරකම් ප්‍රකාශ කරන්න*/
ස්ථිතික හිස් MX_GPIO_Init(ශුන්‍ය); /*I/O ආරම්භ කරන්න*/
int main (හිස්) (
/*සියලු පර්යන්ත නැවත සකසන්න, ෆ්ලෑෂ් අතුරුමුහුණත සහ සිස්ටික් ආරම්භ කරයි.*/
HAL_Init();
/* පද්ධති ඔරලෝසුව වින්‍යාස කරන්න */
SystemClock_Config();
/* වින්‍යාස කළ සියලුම උපාංග ආරම්භ කරන්න */
MX_GPIO_Init();
අතරතුර (1) (
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8); //කකුලේ තත්ත්වය මාරු කරන්න
HAL_Delay(100); )
}
හිස් SystemClock_Config (ශුන්‍ය){
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = 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__);
}
/**Systick බාධා කාලය වින්‍යාස කරන්න*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Systick වින්‍යාස කරන්න */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn බාධා වින්‍යාසය */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/** pins Analog Input Output 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 * file, int line){
අතරතුර (1) (
} }
#ifdef USE_FULL_ASSERT

Void assert_failed (uint8_t* ගොනුව, uint32_t රේඛාව){
}
#නම් අවසන්
මෙන්න, පෙර උදාහරණයේ මෙන්, අපට ලේඛනගත කිරීමේ එක් එක් කාර්යයේ විස්තරය, උදාහරණයක් ලෙස නැරඹිය හැකිය UM1786 STM32F3 HAL සහ අඩු ස්ථර ධාවක පිළිබඳ පරිශීලක අත්පොත විස්තරය.

CMSIS භාවිතා කරන පළමු විකල්පය අඩු අපහසු බව අපට සාරාංශ කළ හැකිය. සෑම පුස්තකාලයක් සඳහාම ලියකියවිලි තිබේ. ඊළඟ ව්‍යාපෘති වලදී, අපි STCube වින්‍යාස කිරීමේ වැඩසටහන භාවිතයෙන් HAL සහ CMSIS භාවිතා කරන අතර, හැකි නම්, මෘදුකාංග දවටන නොමැතිව සෘජුවම රෙජිස්ටර් භාවිතා කරන්නෙමු. අද එතනින් නවතිමු. ඊළඟ ලිපියෙන් අපි ඉදිකිරීම් පිළිබඳ මූලික මූලධර්ම දෙස බලමු ස්මාර්ට් නිවස. හැමෝටම ආයුබෝවන්.




ඉහල