STM32F407(STM32F4-DISCOVERY) - Qeyri-standart yanaşma - Standart kitabxana hissəsi 1. Makro təriflərdən istifadə edərək STM32F10x SPL konfiqurasiyası

Bu nöqtəyə qədər biz standart nüvə kitabxanasından - CMSIS-dən istifadə etdik. Portu istədiyiniz iş rejiminə konfiqurasiya etmək üçün müəyyən bir funksiyaya cavabdeh olan reyestri tapmaq üçün müraciət etməli, həmçinin bu proseslə əlaqəli digər məlumatları böyük bir sənəddə axtarmalı olduq. Taymer və ya ADC ilə işləməyə başlayanda işlər daha da ağrılı və adiləşəcək. Oradakı registrlərin sayı giriş/çıxış portlarından qat-qat çoxdur. Manual parametrçox vaxt aparır və səhv etmək şansını artırır. Buna görə də, bir çox insanlar standart periferik kitabxana ilə işləməyə üstünlük verirlər - StdPeriph. Nə verir? Bu sadədir - abstraksiya səviyyəsi artır, sənədlərə daxil olmaq və əksər hallarda registrlər haqqında düşünmək lazım deyil. Bu kitabxanada MK periferiyasının bütün iş rejimləri və parametrləri strukturlar şəklində təsvir edilmişdir. İndi periferik cihazı konfiqurasiya etmək üçün yalnız doldurulmuş strukturu olan cihazın işə salınması funksiyasına zəng etmək lazımdır.

Aşağıda abstraksiya səviyyələrinin sxematik təsviri olan bir şəkil verilmişdir.

Mikrokontrolörün necə işlədiyini göstərmək üçün CMSIS ilə (əsas nüvəyə "ən yaxındır") işlədik. Növbəti addım indi istifadə etməyi öyrənəcəyimiz standart kitabxanadır. Sonra cihaz sürücüləri gəlir. Onlar hər hansı bir cihazı idarə etmək üçün rahat proqram interfeysini təmin edən *.c \ *.h faylları kimi başa düşülür. Məsələn, bu kursda biz sizə max7219 çipi və esp8266 WiFi modulu üçün drayverlər təqdim edəcəyik.

Standart layihə aşağıdakı fayllardan ibarət olacaq:


Birincisi, əlbəttə ki, bunlar standart kitabxananın nüvə ilə işləməsinə imkan verən CMSIS fayllarıdır, biz artıq onlar haqqında danışdıq. İkincisi, standart kitabxana faylları. Üçüncüsü, istifadəçi faylları.

Kitabxana fayllarını hədəf MK-ya həsr olunmuş səhifədə tapa bilərsiniz (bizim üçün bu stm32f10x4), bölmədə Dizayn Resursları(CooCox IDE-də bu fayllar inkişaf mühiti deposundan endirilir). Hər bir periferiya iki fayla uyğun gəlir - başlıq (*.h) və mənbə kodu(*.c). Ətraflı Təsviri veb saytında kitabxana arxivində olan dəstək faylında tapa bilərsiniz.

  • stm32f10x_conf.h - kitabxana konfiqurasiya faylı. İstifadəçi modulları birləşdirə və ya ayıra bilər.
  • stm32f10x_ppp.h - periferik başlıq faylı. Ppp əvəzinə gpio və ya adc ola bilər.
  • stm32f10x_ppp.c - C dilində yazılmış periferik qurğu drayveri.
  • stm32f10x_it.h - bütün mümkün kəsmə işləyicilərini (onların prototiplərini) ehtiva edən başlıq faylı.
  • stm32f10x_it.c Cortex M3-də istisna hallar üçün kəsmə xidməti rutinini (ISR) ehtiva edən şablon mənbə kodu faylıdır. İstifadəçi istifadə olunan periferiya qurğuları üçün öz ISR-lərini əlavə edə bilər.

Standart kitabxana və periferik qurğular funksiyaların və qeydlərin adlandırılmasında konvensiyaya malikdir.

  • PPP ADC kimi periferik qurğuların qısaldılmasıdır.
  • Sistem, başlıq və mənbə kodu faylları - stm32f10x_ ilə başlayın.
  • Bir faylda istifadə olunan sabitlər həmin faylda müəyyən edilir. Birdən çox faylda istifadə olunan sabitlər başlıq fayllarında müəyyən edilir. Periferik kitabxanadakı bütün sabitlər ən çox YUXAR hərflərlə yazılır.
  • Registrlərə sabitlər kimi baxılır və onlara BAŞ hərflər də deyilir.
  • Periferik funksiyaların adlarına USART_SendData() kimi abbreviatura daxildir.
  • Hər bir periferik cihazı konfiqurasiya etmək üçün PPP_Init() funksiyasına ötürülən PPP_InitTypeDef strukturundan istifadə olunur.
  • Başlamadan çıxarmaq üçün (dəyəri defolt olaraq təyin edin) PPP_DeInit() funksiyasından istifadə edə bilərsiniz.
  • Periferiyaları aktivləşdirməyə və ya söndürməyə imkan verən funksiya PPP_Cmd() adlanır.
  • Kəsinti aktivləşdirmə/deaktiv etmə funksiyası PPP_ITConfig adlanır.

İLƏ tam siyahı kitabxananın dəstək faylına yenidən baxa bilərsiniz. İndi standart periferik kitabxanadan istifadə edərək yanıb-sönən LED-i yenidən yazaq!

İşə başlamazdan əvvəl stm32f10x.h faylına baxaq və xətti tapaq:

#USE_STDPERIPH_DRIVER-ı müəyyən edin

Yüklənmiş arxivdən kitabxana fayllarından istifadə edərək layihəni sıfırdan konfiqurasiya etsəniz, bu sətirdən şərhi çıxartmalısınız. Bu, standart kitabxanadan istifadə etməyə imkan verəcəkdir. Bu tərif (makros) preprosessora stm32f10x_conf.h faylını daxil etməyi əmr edəcək:

#ifdef USE_STDPERIPH_DRIVER #daxil edin "stm32f10x_conf.h" #endif

Bu fayl modulları ehtiva edir. Yalnız konkret olanlara ehtiyacınız varsa, qalanlarını söndürün, bu tərtib zamanı vaxta qənaət edəcəkdir. Təxmin etdiyiniz kimi bizə RTC və GPIO modulları lazımdır (lakin gələcəkdə bizə _bkp.h, _flash, _pwr.h, _rtc.h, _spi.h, _tim.h, _usart.h da lazım olacaq):

#include "stm32f10x_flash.h" // init_pll() üçün #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h"

Keçən dəfə olduğu kimi, əvvəlcə B portunun saatlamasını aktivləşdirməlisiniz. Bu, stm32f10x_rcc.h-də elan edilmiş funksiya tərəfindən həyata keçirilir:

Ləğv et RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

FunctionalState nömrə stm32f10x.h-də müəyyən edilmişdir:

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

Ayağımızı qurmaq üçün bir quruluş elan edək (onu stm32f10x_gpio.h faylında tapa bilərsiniz):

GPIO_InitTypeDef LED;

İndi onu doldurmalıyıq. Bu strukturun məzmununa nəzər salaq:

Typedef strukturu ( uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; ) GPIO_InitTypeDef;

Bütün lazımi siyahılar və sabitlər eyni faylda tapıla bilər. Sonra yenidən yazılmış init_leds() funksiyası aşağıdakı formanı alacaq:

Void led_init() ( // RCC_APB2PeriphClockCmd saatını aktivləşdirin(RCC_APB2Periph_GPIOB, ENABLE); // Strukturu elan edin və onu doldurun GPIO_InitTypeDef LED; LED.GPIO_Pin = GPIO_Pin_0; LED.GPIO_Pin = GPIO_Pin_0; LED.GPIO_Speed ​​= GPIO_Speed; LED.GPIO_Speed ​​=GPIO_Speed; _Rejim_ Çıxış_PP; // GPIO_Init portunu işə salın ( GPIOB, &LED; )

main() funksiyasını yenidən yazaq:

Int main(void) ( led_init(); while (1) ( GPIO_SetBits(GPIOB, GPIO_Pin_0); gecikmə (10000000); GPIO_ResetBits(GPIOB, GPIO_Pin_0); gecikmə (10000000); ) )

Əsas odur ki, işə salınma qaydası haqqında fikir əldə edin: periferik saatı yandırın, strukturu elan edin, strukturu doldurun, başlatma metodunu çağırın. Digər periferik cihazlar adətən oxşar şəkildə konfiqurasiya edilir.

Bu nəşrdə mən STMicroelectronics istehsalçı şirkətinin standart periferik qurğular kitabxanasına əsaslanan STM32F10x mikrokontrolörləri ilə tez işə başlamaq üçün əsas məqamlara diqqət yetirməyə çalışacağam.

Məqalədə inkişaf mühiti kimi Eclipse CDT istifadə olunacaq. Əsas diqqət proqram kodunda olacağı üçün Code::Blocks-da bütün manipulyasiyaları təhlükəsiz edə bilərsiniz.

ARM mikro nəzarətçiləri üçün ümumi layihə strukturu mənim məqaləmdə təsvir edilmişdir.

Burada qısaca xatırladacağam ki, ARM mikrokontrollerləri (xüsusilə STM32F10x) üçün layihə qurmaq üçün sizə linker skripti və C-Startup faylı lazımdır.

Bağlayıcı skript proqram kodunu və verilənləri mikrokontrollerin yaddaşına yerləşdirmək üçün təlimatları olan fayldır. O, proqram kodunuzun Flash proqram yaddaşına və ya SRAM məlumat yaddaşına yüklənməsini əmr edə bilər.

Fərqli həcmdə proqram və məlumat yaddaşına malik mikrokontrollerlər müxtəlif tərtibat skriptləri tələb edir. Onları mikrokontroller istehsalçısından - STMicroelectronics-dən əldə etmək olar.
STM32F10x standart periferik kitabxanasını ARM_Toolchain/Lib/stm32f10x_stdperiph_lib.zip arxivindən çıxarın.
O, müxtəlif inkişaf mühitləri üçün nümunə layihələri ehtiva edir (IAR EWB, Keil uVision, Atollic True Studio və s.). Bizim üçün ən yaxın olanı Atollic True Studio-dur, çünki o, Eclipse-in modifikasiyasıdır.
Project/StdPeriph_Template/TrueSTUDIO kataloquna gedin, orada bir neçə alt kataloq var, onların adları STM3210x-EVAL inkişaf lövhələrinin adlarına uyğundur.

Bu lövhələrdən hansının sizinkinizlə eyni mikrokontroller xəttindən istifadə etdiyini öyrənin. stm32_flash.ld faylını müvafiq qovluqdan layihənizə kopyalayın.

İstifadə olunan mikrokontrollerə uyğun olaraq yalnız proqramın və məlumat yaddaşının miqdarının dəyişdiriləcəyi universal bir skript yaratmaq da mümkündür.

STM32 mikro nəzarətçiləri üçün başlanğıc kodu (C-Startup) C və ya Assembler dilində yazıla bilər.
STM32F10x Standart Periferik Kitabxanası (qısaldılmış STM32F10x SPL) tez-tez səhvlərinə görə tənqid olunsa da, STM32 proqramlaşdırmasına başlayarkən tez işə başlamağın ən asan yoludur.
Ancaq həmişə bir növ alternativin olmasını istəyirsən. Əslində, onların çoxu var, məsələn, assembler dilində proqramlaşdırma :)

Bu, ən çətin və mənasız yoldur. İkinci yol, müxtəlif mikrokontroller periferiyalarına daxil olmaq üçün C dili strukturlarına daxil olmaq üçün sintaksisi təmin edən CMSIS kitabxanasından istifadə etməkdir. Ən sadə və ən məntiqli yol (mənim fikrimcə) kitabxanalardan istifadə etməkdir.

Əgər STM32F10x SPL-ə qəti şəkildə qarşısınızsa, o zaman sizin üçün başqa bir alternativ var - libopencm3 kitabxanası. Orada nümunələrin böyük hissəsi STM32F10x mikro nəzarətçilərinin əsas seriyası ətrafında cəmlənmişdir, lakin digər seriyalar üçün nümunələrin (STM32F2xx/4xx) görünməsi yalnız vaxt məsələsidir. Siz hər zaman libopencm3 layihəsinə qoşula və bu prosesi sürətləndirə bilərsiniz.

CMSIS standartı da proqramlarınızda istifadə üçün isteğe bağlıdır.
C proqramlaşdırma dilində HAL (Hardware Abstraction Layer) səviyyəsini həyata keçirmək üçün bir qədər səy və vaxt sərf etməklə onsuz da edə bilərsiniz.

Bəzi hallarda bu üsul yeganə ola bilər əlçatan bir şəkildə. Məsələn, təşkilatınız ARM tərəfindən hazırlanmış hesablama nüvələrinə və sənayeyə aid periferiyalara əsaslanan fərdi çiplərdən istifadə edir.

Və ya ARM9 nüvəli mikrokontrollerlər üçün C-də proqram təminatı tətbiq etməlisiniz, bunun üçün istehsalçılar hazır istifadəyə diqqət yetirirlər. əməliyyat sistemləri(Linux, QNX, Windows CE), buna görə də istehsalçılar təmiz formada və ya daha yüngül çəkili RTOS ilə birlikdə C dilində proqramlaşdırma üçün kitabxanalar təqdim edə bilməzlər.

Xoşbəxtlikdən, Cortex-M3 nüvəsinə əsaslanan mikrokontroller istehsalçıları tərtibatçıları çoxlu sayda kod kitabxanası ilə təmin edirlər. Bu, STM32 mikro nəzarətçilərinə də aiddir.
STM32F10x SPL kitabxanasını nəzərdən keçirməyə davam edək. Bunu bir nümunə ilə nəzərdən keçirəcəyik.
Baş verənlərin bütün prosesini daha yaxşı başa düşmək üçün bu nümunəni aça və ya sıfırdan öz layihənizi yarada bilərsiniz.

İkinci halda, mən lazımi addımları sadalayacağam:

  • Eclipse-də yeni boş layihə yaradın
  • Layout skriptini kopyalayın və faylı layihəyə başlayın
  • Yeni yaradın və ya Makefile şablonunu kopyalayın
  • Mənim nümunəmdəki Makefile faylını şablon kimi istifadə edərkən, layihə daxilində src, inc, bin, obj kataloqlarını yaratmalı, bin və obj qovluqlarında isə Debug və Release alt kataloqlarını yaratmalısınız.
  • Lazımi mənbə və başlıq fayllarını CMSIS və STM32F10x SPL kitabxanalarından kopyalayın.
  • Əgər istifadə olunarsa, Makefile şablonunun istifadəçi parametrləri bölməsində lazımi dəyişiklikləri edin.
  • Eclipse "hədəf et" pəncərəsində yeni "Debug", "cleanDebug", "Release", "cleanRelease", "Program" hədəfləri yaradın.
  • "Debug" hədəfini işə salın və "Konsol" pəncərəsində onun icrasına nəzarət edin.

Materialı daha yaxşı başa düşmək üçün məqaləni bir neçə müstəqil paraqrafa ayırdım, onların hər biri STM32F10x SPL kitabxanası ilə işləməyin yalnız bir aspektini təsvir edir.

Makro təriflərdən istifadə edərək STM32F10x SPL konfiqurasiyası

Kitabxananı konfiqurasiya etmək üçün indi nəzərdən keçirəcəyimiz əvvəlcədən təyin edilmiş makro dəyərlərdən istifadə olunur.
Onlar bir preprosessor direktivindən istifadə edərək başlıq faylları daxilində təyin edilə bilər #müəyyənləşdirmək və ya makro təriflərin dəyərlərini açardan keçirin -D GCC tərtibçisi.
Mənim nümunəmdə ikinci üsuldan istifadə edirəm.
Makefile dəyişənlərində MÜƏYYƏNLƏŞDİRMƏK STM32F10x SPL kitabxanasını tərtib etmək üçün lazım olan makroları ehtiva edir.
Makro tərifi STM32F10X_MD istifadə olunan mikrokontrolörün xəttə aid olub-olmadığını müəyyən edir Orta sıxlıq.
Buraya 64-dən 128 kB-a qədər Flash yaddaşa malik mikrokontrollerlər daxildir.
Aşağıdakı cədvəldə müxtəlif mikrokontroller seriyaları üçün makroların adları verilmişdir:

Serial adı Makro Təsvir
Aşağı sıxlıq Dəyər xətti STM32F10X_LD_VL Flash yaddaş tutumu 16 - 32 kB
Aşağı sıxlıq STM32F10X_LD
Flash yaddaş tutumu 16 - 32 kB
Orta sıxlıq Dəyər xətti STM32F10X_MD_VL Əlavə yaddaş
64 - 128 kB
Orta sıxlıq STM32F10X_MD Flash yaddaşı 64 - 128 kB olan STM32F101xx, STM32F102xx, STM32F103xx seriyalarının mikro nəzarətçiləri
Yüksək sıxlıqlı dəyər xətti STM32F10X_HD_VL həcmi olan STM32F100xx seriyalı mikrokontrollerlər
Flash - yaddaş 256 - 512 kB
Yüksək sıxlıq STM32F10X_HD həcmi ilə
Fləş yaddaş 256 - 512 kB
XL-sıxlıq STM32F10X_XL
Fləş yaddaş 512 - 1024 kB
Bağlantı xətti STM32F10X_CL

Mikrokontrolörün takt tezliyini təyin etmək üçün makronu system_stm32f10x.c faylında tələb olunan takt tezliyi dəyəri ilə şərh etmək lazımdır.

#müəyyən edilibsə (STM32F10X_LD_VL) || (müəyyən edilmiş STM32F10X_MD_VL) || (müəyyən edilmiş STM32F10X_HD_VL) #define SYSCLK_FREQ_24MHz 24000000 #else /* #define SYSCLK_FREQ_HSE HSE_VALUE */ /* #define SYSCLK_FREQ_24MHz /SYSC000_define 20K03/SYSCLK_FREQ_24MHz SYSC03/20K03/ Hz 3600 0000 */ /* #define SYSCLK_FREQ_48MHz 48000000 */ /* #define SYSCLK_FREQ_56MHz 56000000 * / #müəyyən edin SYSCLK_FREQ_72MHz 72000000 #endif

#müəyyən edilibsə (STM32F10X_LD_VL) || (müəyyən edilmiş STM32F10X_MD_VL) || (müəyyən edilmiş STM32F10X_HD_VL)

/* #SYSCLK_FREQ_HSE HSE_VALUE təyin edin */

#SYSCLK_FREQ_24MHz 24000000 təyin edin

#başqa

/* #SYSCLK_FREQ_HSE HSE_VALUE təyin edin */

/* #define SYSCLK_FREQ_24MHz 24000000 */

/* #define SYSCLK_FREQ_36MHz 36000000 */

/* #define SYSCLK_FREQ_48MHz 48000000 */

/* #define SYSCLK_FREQ_56MHz 56000000 */

#SYSCLK_FREQ_72MHz 72000000 təyin edin

#endif

Nəzərdə tutulan istifadə kvars rezonatoru bütün əsas üçün 8 MHz tezliyi ilə
25 MHz kvars rezonatorunun quraşdırılması lazım olan Bağlantı xətti istisna olmaqla, mikrokontrollerlər seriyası.
Əgər siz digər tezlik qiymətləri ilə kvars rezonatorlarından istifadə edirsinizsə, onda siz stm32f10x.h başlıq faylında HSE_VALUE makrosunun dəyərini dəyişməli və bütün asılı funksiyaları müvafiq olaraq uyğunlaşdırmalısınız.
USE_STDPERIPH_DRIVER makrosunun məqsədini təxmin etmək çətin deyil - STM32F10x standart periferik kitabxanasından istifadə etmək.
USE_FULL_ASSERT – proqramı sazlamaq üçün ASSERT makrosundan istifadə edin.

Kitabxanada assert_param makrosundan istifadə

Bütün STM32F10x SPL kitabxana funksiyaları öz arqumentlərini yoxlamaq üçün assert_param makrosundan istifadə edir.
Bu makro sıfıra bərabərlik üçün yoxlanılan funksiya arqumentini əhatə edən ifadəni yoxlayır. İfadənin dəyəri sıfırdırsa, o zaman arqument xətası idarəedici funksiyası assert_failed çağırılır, əks halda (ifadə sıfır deyil) arqument yoxlaması uğurla başa çatır.
Proqramınızda assert_failed funksiyasını tətbiq etməlisiniz.
Səhv mesajını, faylın adını və xətaya səbəb olan kod xəttinin nömrəsini göstərir.
debug_printf makrosunu standart new_lib kitabxanasından və ya məsələn, cənab Çenin kitabxanasından istifadə edərək USART vasitəsilə çıxara bilər.

#define debug_printf xprintf /* printf */ #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* fayl, uint32_t line) ( debug_printf("Yanlış parametrlər dəyəri: %s faylı %d\r\n xəttində", fayl, (int)sətir) ; isə (1) ( ) )/* təsdiq_uğursuz */ #endif/*FULL_TƏSLİMAT*/

#define debug_printf xprintf /* printf */

#ifdef İSTİFADƏ_TAM_TƏKLİF

void assert_failed (uint8_t * fayl, uint32_t line)

debug_printf( "Yanlış parametr dəyəri: %s faylı %d\r\n sətirində", fayl , (int ) sətir );

isə (1)

) /* assert_failed */

#endif/*TAM_İSTİFADƏ EDİN*/

Kodunuzda həyata keçirilən assert_failed funksiyası yalnız USE_FULL_ASSERT makrosunun elan edildiyi zaman istifadə olunur. Əks halda, bütün sazlama kodu mənbədən xaric edilir. Bu funksionallıq stm32f10x_conf.h sürücü kitabxanasının parametrləri başlıq faylında həyata keçirilir.

#ifdef USE_FULL_ASSERT #define assert_param(expr) ((expr) ? (boş)0: assert_failed((uint8_t *)__FILE__, __LINE__)) void assert_failed(uint8_t* fayl, uint32_t line); #else #define assert_param(expr) ((void)0) #endif /* FULL_ASSERT İSTİFADƏ */

#ifdef İSTİFADƏ_TAM_TƏKLİF

#define assert_param(expr) ((ifadə) ? (boş)0: assert_failed((uint8_t *)__FILE__, __LINE__))

void assert_failed (uint8_t * fayl, uint32_t line);

#başqa

#define assert_param(expr) ((boş)0)

#endif /* İSTİFADƏ_FULL_TƏSLİM */

Burada izah ediləcək çox şey yoxdur. Gəlin assert_param-dan istifadə nümunəsinə baxaq.

void set_param(uint8_t * param, uint8_t value) (assert_param(param != NULL); *param = dəyər; )/*set_param*/

etibarsız set_param (uint8_t * param, uint8_t dəyəri)

assert_param (param != NULL );

* param = dəyər;

) /*set_param*/

Funksiya arqument kimi ötürülən göstərici vasitəsilə parametrin dəyərini təyin edir. USE_FULL_ASSERT makrosunun elan edilmədiyi halda, güman edə bilərik ki, xətlər
assert_param(param != NULL) sadəcə olaraq kodda deyil, əks halda parametr bu tərifdə yoxlanılır.
Göstərici müəyyən edilməyibsə, onda dəyər parametri != NULL false olacaq və faylın adını və xəta ilə sətir nömrəsini USART vasitəsilə çıxaracaq, sonra isə döngə çıxaran assert_failed funksiyası işə salınacaq və bununla da dəyərin olmasının qarşısını alacaq. yaddaşda qeyri-müəyyən ünvana təyin edilir.
Sizdən kodunuzda assert_param makrosundan istifadə etməyiniz tələb olunmur, lakin kitabxana kodunda
STM32F10x SPL hər yerdə istifadə olunur.
set_param funksiyası assert_param istifadə etmədən arqument səhvinin yoxlanılması ilə həyata keçirilə bilər.

#define ERROR (-1) #define OK (0) int set_param(uint8_t * param, uint8_t value) ( ​​int r = ERROR; if (param == NULL) return r; *param = value; r = OK; r qaytarın; )/*set_param*/

#XƏTANI təyin edin (-1)

#define OK (0)

int set_param (uint8_t * param, uint8_t dəyəri)

int r = ERROR ;

əgər (param == NULL)

qayıt r ;

* param = dəyər;

r = OK;

qayıt r ;

) /*set_param*/

STM32F10x SPL kitabxanasında C-Startup faylı

Başlanğıc kodunda mikrokontroller ilkin olaraq işə salınır, stek konfiqurasiya edilir, BSS bölməsi sıfırlanır və main() əsas funksiyası çağırılır.
Başlanğıc kodunun STM32F10x SPL kitabxanası ilə birbaşa əlaqəsi yoxdur. Bununla belə, bu yükləmə kodunda proqramın main() funksiyasını çağırmazdan əvvəl CMSIS-in bir hissəsi olan mikro nəzarətçinin başlatma funksiyası SystemInit() çağırılır.
Onu CMSIS kitabxanasında asanlıqla tapmaq olar.
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO qovluğuna gedin və tələb olunan faylı kopyalayın. Layihənizdə istifadə olunan mikrokontrolörün hansı xəttə aid olduğunu öyrənmək qalır.
Bunu etmək üçün aşağıdakı cədvələ baxın:

Serial adı Fayl adı Təsvir
Aşağı sıxlıq Dəyər xətti startup_stm32f10x_ld_vl.s həcmi olan STM32F100xx seriyalı mikrokontrollerlər
Fləş yaddaş 16 - 32 kB
Aşağı sıxlıq startup_stm32f10x_ld.s STM32F101xx, STM32F102xx, STM32F103xx seriyalı mikro nəzarətçilər
Flash yaddaş tutumu 16 - 32 kB
Orta sıxlıq Dəyər xətti startup_stm32f10x_md_vl.s mikro nəzarətçilər seriyası STM32F100xx
Orta sıxlıq startup_stm32f10x_md.s STM32F101xx, STM32F102xx, STM32F103xx seriyalı mikro nəzarətçilər
Flash yaddaş tutumu ilə 64 - 128 kB
Yüksək sıxlıqlı dəyər xətti startup_stm32f10x_hd_vl.s mikro nəzarətçilər seriyası STM32F100xx
Yüksək sıxlıq startup_stm32f10x_hd.s mikrokontrollerlər seriyası STM32F101xx, STM32F103xx
Flash yaddaş tutumu ilə 256 - 512 kB
XL-sıxlıq startup_stm32f10x_xl.s mikrokontrollerlər seriyası STM32F101xx, STM32F103xx
Flash yaddaş tutumu ilə 512 - 1024 kB
Bağlantı xətti startup_stm32f10x_cl.s STM32F105xx və STM32F107xx seriyalarının mikro nəzarətçiləri

Başlanğıc faylı kəsmə və istisna vektor işləyicilərinin adlarını ehtiva edir, lakin yalnız sıfırlama vektoru işləyicisi həyata keçirilir, onun daxilində bütün ilkin başlatma main() funksiyasını çağırmazdan əvvəl həyata keçirilir.
Bütün digər istisna işləyicilərinin həyata keçirilməsi proqram proqramçısının məsuliyyətidir. Proqramınız heç bir işləyicidən istifadə etmirsə, onları qeydiyyatdan keçirməyə ehtiyac yoxdur. İstisna baş verərsə, standart işləyici istifadə ediləcək - proqram kodunu dövrələmək.

CMSIS kitabxanasının tərkibi

Bu nəşrdə əvvəllər yazıldığı kimi, CMSIS kitabxanası C dili strukturlarının elementlərindən istifadə edərək mikrokontroller periferik modullarına çıxışı təmin edir.
Bu kitabxananın həyata keçirilməsi iki hissəyə bölünür. Birinci hissə Cortex-M3 nüvəsinin periferiyasına, ikinci hissə isə periferiyaya çıxışı təmin edir. xüsusi model mikro nəzarətçi.
CMSIS standartı Cortex-M3 nüvəli bütün mikrokontrollerlər üçün eyni olduğundan, birinci hissənin tətbiqi bütün istehsalçılar üçün eyni olacaq, lakin hər bir istehsalçı üçün ikinci hissə fərqli olacaq.
CMSIS-ə bir neçə başlıq və mənbə faylları daxildir. Birinci hissəyə fayllar daxildir:

  • core_cm3.h
  • core_cm3.c

CMSIS-in ikinci hissəsinə C-Startup faylı, həmçinin aşağıdakı fayllar daxildir:

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

stm32f10x.h başlıq faylı stm32f10x mikro nəzarətçilərinin periferik modullarına daxil olmaq üçün makro tərifləri ehtiva edir.
system_stm32f10x.h və system_stm32f10x.c faylları mikrokontrolörün ilkin işə salınmasını həyata keçirir.

STM32F10x SPL kitabxanasının tərkibi və konfiqurasiyası

Kitabxana stm32f10x_ prefiksi olan periferik modullarla eyni adlı mənbə və başlıq fayllarından ibarətdir.
Məsələn, USART modulu ilə qarşılıqlı əlaqənin həyata keçirilməsi stm32f10x_usart.h və stm32f10x_usart.c fayllarında var.
Kitabxana elementlərinin adlandırılması üçün konvensiyalar və sənədlərdə təsvir olunan müəyyən kodlaşdırma qaydaları mövcuddur.
Kitabxana periferik mikrokontroller modulları üçün sürücülərin tətbiqini ehtiva edir.
Kitabxana elementlərinin adları periferik modullar üçün aşağıdakı qısaltmalardan istifadə edir:

Akronim Periferik modul
ADC analoqdan rəqəmə çevirici
BKP ehtiyat registrləri
BACARMAQ CAN interfeysi
MSK istehlak nəzarətçisi
CRC yoxlama məbləğinin hesablanması modulu
DAC rəqəmsaldan analoqa çevirici
DBGMCU mikrokontrollerdə sazlama
DMA birbaşa yaddaşa giriş nəzarətçisi
EXTI xarici kəsmə nəzarətçisi
FSMC xarici yaddaş nəzarətçisi
FLASH Flash proqram yaddaşı
GPIO ümumi təyinatlı giriş/çıxış portları
I2C I2C interfeysi
I2S I2S (Səs) interfeysi
IWDG müstəqil gözətçi taymeri
NVIC yuvalanmış kəsmə nəzarətçisi
PWR güc nəzarətçisi
RCC sıfırlama və saat nəzarətçisi
RTC real vaxt nəzarətçi (saat)
SDIO SDIO interfeysi
SPI SPI interfeysi
SysTick sistem taymeri
TIM əsas və ya inkişaf etmiş taymer
USART universal serial sinxron-asinxron
ötürücü
WWDG pəncərə gözətçisi

Bu akronimlər əsasında kitabxananın proqram modullarının adları formalaşır. Kitabxanadakı bütün modullardan istifadə etmək məcburiyyətində deyilsiniz.
Layihədə yalnız zəruri modullardan istifadə etmək üçün kitabxana konfiqurasiya edilməlidir.
Bu məqsədlər üçün STM32F10x SPL kitabxanasından istifadə edən hər bir layihədə stm32f10x_conf.h başlıq faylı olmalıdır.

#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" daxil edin

//#include "stm32f10x_i2c.h"

//#include "stm32f10x_iwdg.h"

//#include "stm32f10x_pwr.h"

# "stm32f10x_rcc.h" daxil edin

Tələb olunan modulu aktivləşdirmək üçün direktivin şərhini ləğv etməlisiniz #daxildir müvafiq başlıq faylları ilə.
stm32f10x_conf.h başlıq faylı stm32f10x.h-ə daxildir, ona görə də STM32F10x SPL kitabxanasının funksiyalarından istifadə etmək üçün mənbə kodunuza yalnız bir başlıq faylı stm32f10x.h daxil etməlisiniz.

// stm32f10x.h faylında #ifdef USE_STDPERIPH_DRIVER #daxil edin "stm32f10x_conf.h" #endif

Təkrar edirəm ki, layihə həmçinin USE_STDPERIPH_DRIVER, USE_FULL_ASSERT makrolarını və istifadə olunan mikrokontrolörün seriyasını təyin edən makronu müəyyən etməlidir (məsələn, Orta sıxlıq xətti üçün STM32F10X_MD).
Əgər standart kvars tezliyi dəyərindən istifadə edirsinizsə və nəzarətçi maksimum 72 MHz takt tezliyində işləyirsə, onda başqa heç nə dəyişməli olmayacaqsınız.
Makefile-ə tərtib etmək üçün kitabxana fayllarının siyahısını əlavə etməlisiniz.
Misal üçün:

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

SRC += stm32f10x_rcc . c

SRC += stm32f10x_gpio . c

STM32F10x SPL kitabxanasından istifadə. İş mexanizmləri

Periferik kitabxanadan istifadə edərək proqramlaşdırmaya başlamaq üçün ən asan yol kitabxana ilə birlikdə verilmiş nümunələrə baxmaqdır. Ancaq yenə də bu nümunələrin kodunu başa düşmək üçün siz kitabxananın sintaksisi və istifadəsi haqqında əsas biliklərə sahib olmalısınız.
Əvvəllər sadalanan bütün periferik mikrokontroller modulları ilkin olaraq söndürülür, onlara saat siqnalı verilmir və onlar elektrik enerjisi istehlak etmirlər.
Periferik moduldan istifadə etmək üçün əvvəlcə ona saat siqnalı verməlisiniz. Saat siqnalı RCC saat və sıfırlama modulu tərəfindən təmin edilir.
Bu məqsədlər üçün kitabxana aşağıdakı funksiyaları yerinə yetirir:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, AKTİV EDİN); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, AKTİV EDİN); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, AKTİV EDİN);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, AKTİV EDİN);

RCC_APB2PeriphClockCmd (RCC_APB2Periph_PPPx, AKTİV EDİN) ;

RCC_APB1PeriphClockCmd (RCC_APB1Periph_PPPx, AKTİV EDİN) ;

Burada PPP modul aktoniminin adını bildirir (məsələn, ADC və ya USART), x isə periferik modulun nömrəsidir.
İlk növbədə, istifadə etdiyiniz modulun hansı avtobusa qoşulduğunu öyrənməlisiniz.
Ümumilikdə Cortex-M3 nüvəli arxitekturaya malik mikro nəzarətçilərin üç avtobusu var:
təlimat avtobusu, məlumat avtobusu və sistem avtobusu. Təlimat avtobusu nüvəni Flash proqram yaddaşına birləşdirir. Məlumat və sistem avtobusları əsas tezlikdə işləyən AHB (ARM Hi-Speed ​​​​Bus) avtobus matrisinə birləşdirilir. Bununla belə, AHB avtobus tezliyi bölücülərin quraşdırılması ilə azaldıla bilər. AHB avtobusu nüvə və DMA modulu kimi yüksək sürətli cihazları birləşdirir.
Giriş/çıxış cihazları APB1 və APB2 (ARM Periferik Şin) aralıq avtobusları vasitəsilə AHB avtobusuna qoşulur.
APB2 avtobusunun maksimum işləmə tezliyi 72 MHz, APB1 avtobusunun tezliyi
36 MHz ilə məhdudlaşır.
İstifadə etdiyiniz periferik modulun hansı avtobuslara qoşulduğunu sənədlərdən öyrənə və ya stm32f10x_rcc.h başlıq faylına baxa bilərsiniz.
Bu faylı açın və ardıcıllıqla RCC_AHBPeriph, RCC_APB1Periph və RCC_APB2Periph dəyərlərini axtarın.

#müəyyən et RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) #müəyyən et RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) #müəyyən et RCC_AHBPeriph_SRAM ((uint32_t) #FLCCP0F0 ((uint32_t) #FLCCP0F0 (uint32_t) 0x00000010) #müəyyən edin RCC_AHBPeriph_CRC ((uint32_t)0x00000040)

#müəyyən edin RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001)

#define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002)

# RCC_AHBPeriph_SRAM-ı təyin edin ((uint32_t)0x00000004)

#RCC_AHBPeriph_FLITF ((uint32_t)0x00000010) müəyyən edin

#müəyyən edin RCC_AHBPeriph_CRC ((uint32_t)0x00000040)

Makrosların adları ilə hansı modulların hansı avtobuslara qoşulduğunu müəyyənləşdiririk. Hansı təkərin üçdən birinə aid olduğunu müəyyən etmək üçün sağlam düşüncədən də istifadə edə bilərsiniz. Məsələn, USART modulu giriş/çıxış cihazıdır, yəni APB avtobuslarından birinə qoşulmuşdur. USART kifayət qədər aşağı sürətli interfeysdir, ona görə də yəqin ki, APB1 avtobusuna qoşulub.

#müəyyən et RCC_APB1Periph_USART2 ((uint32_t)0x00020000) #müəyyən et RCC_APB1Periph_USART3 ((uint32_t)0x00040000) #müəyyən et RCC_APB1Periph_UART4 ((uint32_t)0x0002000) _UART5 ((uint32_t)0x00100000)

Periferik modula saat siqnalı göndərdikdən sonra başlatma funksiyasına zəng edərək onun parametrlərini konfiqurasiya edə bilərsiniz:

PPP_Init(PPP, &PPP_InitStructure);

PPP_Init (PPP, & amp; PPP_InitStructure);

Periferik modulu işə salmaq üçün bir çox parametrlər başlanğıc funksiyasına ötürülməli olduğundan, arqument kimi struktura göstərici istifadə olunur. İnisializasiya funksiyasını çağırmazdan əvvəl strukturun özü başlanğıc parametrləri ilə yaddaşda yaradılmalıdır; strukturun elementlərinə lazımi qiymətlər təyin edilməlidir:

PPP_InitTypeDef PPP_InitStructure = (val1, val2, ..., valN);/* elan edildikdə strukturun işə salınması */

Əvvəlcə bir quruluş yarada və sonra onun elementlərinə lazımi dəyərləri təyin edə bilərsiniz:

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

PPP_InitTypeDef PPP_InitStructure;

PPP_InitStructure. üzv1 = val1;

PPP_InitStructure. üzv2 = val2;

PPP_InitStructure. üzvN = valN;

stm32f10xQuickstart layihəsindən bir nümunəyə baxaq:

GPIO_InitTypeDef GPIO_InitStructure; #ifdef USE_STM32H_103 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, AKTİV EDİN); 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, AKTİV EDİN) ;

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 strukturunun elementlərinə pin nömrəsinin dəyəri, portun rejimi və sürəti təyin edilir.
GPIO_Init funksiyasını çağırmaqla GPIOC portunun 12-ci sətri işə salınır.
GPIO_Init funksiyasının ilk arqumenti GPIO_TypeDef strukturuna göstəriciyə çevrilən GPIOC periferiyasının yaddaş sahəsinin göstəricisidir.

// stm32f10x.h #müəyyən et GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #müəyyən et GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #müəyyən et 0000) typedef strukturu ( __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

#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)

#GPIOC_BASE təyin edin (APB2PERIPH_BASE + 0x1000)

#APB2PERIPH_BASE müəyyən edin (PERIPH_BASE + 0x10000)

#PERIPH_BASE müəyyən edin ((uint32_t)0x40000000)

typedef strukturu

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 strukturu başlıq faylında təsvir edilən GPIO_InitTypeDef tiplidir.
stm32f10x_gpio.h:

//stm32f10x_gpio.h typedef strukturu ( 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_OD = 0x14, GPIO_Mode_IN_FLOATING = GPIO_Mode = GPIO_PPOD = GPIO_Mode AFIO_00, GPIO_Mode_IPD = 0x04 C, GPIO_Mode_AF_PP = 0x18 )GPIOMode_TypeDef;

//stm32f10x_gpio.h

typedef strukturu

uint16_t GPIO_Pin;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOMode_TypeDef GPIO_Mode;

) GPIO_InitTypeDef;

typedef nömrə

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

) GPIOSpeed_TypeDef;

typedef nömrə

(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;

Gördüyünüz kimi, işə salınmış strukturun məlumat növləri kimi istifadə edilə bilər xüsusi növlər, GPIOSpeed_TypeDef kimi və GPIOMode_TypeDef kimi periferik registrlərin işə salınmasının rahatlığı üçün xüsusi dəyərləri olan məlumat növləri.
Hər bir GPIO pinini konfiqurasiya etmək üçün 4 bit ayrılmışdır.
Aşağıdakı şəkildə GPIO-nun sıfır biti üçün format göstərilir:

Rejim – çıxış iş rejimi (giriş/çıxış). Daha doğrusu, bu dəyərlər bir qədər böyükdür; çıxış portları kimi konfiqurasiya edilmiş portlar çıxış siqnalının maksimum tezliyinə məhdudiyyət qoyur.

Rejim Təsvir
00 giriş
01 10 MHz-ə qədər çıxış tezliyi
10 2 MHz-ə qədər çıxış tezliyi
11 50 MHz-ə qədər çıxış tezliyi

CNF – çıxış konfiqurasiya bitləri. İş rejimindən asılıdır:

Razılaşın ki, pin konfiqurasiya registrinin bu strukturu ilə konfiqurasiya üçün bütün bitləri özünüz təyin etmək son dərəcə əlverişsiz olacaqdır. GPIO_Init kitabxana funksiyasından istifadə edərək bunu etmək daha asan olacaq.
Periferik modulu işə saldıqdan sonra PPP_Cmd funksiyasından istifadə edərək aktivləşdirilməlidir:

PPP_Cmd(PPP, AKTİV EDİN);

PPP_Cmd(PPP, AKTİV EDİN);

Bu funksiya GPIO modulları üçün mövcud deyil, işə salındıqdan sonra dərhal GPIO pinlərindən istifadə edə bilərsiniz. Yadda saxlamaq lazımdır ki, kitabxana yalnız mikrokontroller aparatına interfeys təqdim edir. Aparat modulunda aktivləşdirmə/deaktivasiya bayrağı yoxdursa, o zaman funksiya çağırılır PPP_Cmd(PPP, AKTİV EDİN) qeyri-mümkün.
Çıxış rejimində GPIOx pininin vəziyyətini idarə etmək və giriş və ya çıxış rejimində dəyəri oxumaq üçün kitabxana aşağıdakı funksiyaları təmin edir:

etibarsız GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); etibarsız 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);

etibarsız GPIO_SetBits (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

etibarsız 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) ;

Qalan periferik modullar eyni şəkildə konfiqurasiya edilir və işləyir. Bununla belə, xüsusi aparat modulunun xüsusiyyətlərinə görə bəzi fərqlər var, ona görə də ilk növbədə STM32F10x SPL kitabxanası üçün seçilmiş moduldan istifadə nümunələrinə baxmağı tövsiyə edirəm.

Kesintilərin və istisnaların idarə edilməsi

Cortex-M3 nüvəsinə iç-içə vektorlaşdırılmış kəsmə nəzarətçisi daxildir. Nəzarətçi prosessor nüvəsinin kəsilməsinə səbəb ola biləcək 240-a qədər mənbəni dəstəkləyir. Müəyyən bir mikrokontroller modelində 240 mümkün vektordan neçə vektorun tətbiqi istehsalçıdan asılıdır. Stm32f10x mikrokontrolörlərində bu vektorlardan 43-ə qədər ola bilər.Bu kəsmə xətləri maskalana bilən adlanır. Bundan əlavə, 15 Cortex-M3 əsas kəsmə vektoru və bir xarici maskalanmayan EXTI kəsilməsi var.
Nəzarətçi bir idarəedicidə başqa bir kəsilmənin baş verə biləcəyi yuvalanmış kəsmələri dəstəkləyir. Bu baxımdan, hər kəsmə mənbəyinin öz prioriteti var. 16 kəsmə prioritet səviyyəsi dəstəklənir.
Cortex-M3 əsas kəsmə vektorları ən yüksək prioritet dəyərlərə malikdir.
Üç ən yüksək kəsmə səviyyəsi vektorlara təyin edilir və dəyişdirilə bilməz:

Nömrə İşləyici Prioritet Təsvir
1 Reset_Handler -3 (ən yüksək) Vektoru sıfırlayın
2 NMI_Handler -2 Maskalana bilməyən kəsmə
3 HardFault_Handler -1 Fövqəladə hallar

Bütün digər kəsmə vektorlarına 0-dan 15-ə qədər prioritet səviyyələr təyin edilə bilər.
Ən yüksək prioritet səviyyəsi aşağı qiymətə uyğundur. Prioritet səviyyəsi təkcə fərdi vektora deyil, həm də vektorların bütün qrupuna təyin edilə bilər. Bu xüsusiyyət çoxlu sayda kəsmə vektorları ilə işləməyi asanlaşdırır.
Prioritet qrupunu təyin etmək üçün STM32F10x SPL kitabxanasından bir funksiya istifadə olunur.

Uzun müddətdir, hətta çox uzun müddətdir ki, məqaləmizdə yeni məqalələr yoxdur, buna görə də yetişmək vaxtıdır 😉 Bu gün biz STM32F4-ü öyrənməyə başlayacağıq. Və yəqin ki, biz bu nəzarətçilər üçün yeni bir layihə yaratmaqla başlayacağıq, baxmayaraq ki, düzünü desəm, bu barədə məqalə yazmaq istəmədim, çünki yeni layihə burada, prinsipcə, STM32F103 () ilə eyni şəkildə yaradılmışdır. Ancaq yenə də STM32F4 ilə bəzi çətinliklər yaranır, buna baxmayaraq, bu prosesi ətraflı nəzərdən keçirək)

Beləliklə, gəlin Keil işə salaq, yeni bir layihə yaradaq - Layihə -> Yeni uVision Layihəsi. Yeni layihəni hansısa qovluqda saxlayırıq və sonra bizdən istifadə etmək üçün mikrokontrolleri seçmək istəniləcək. Yaxşı, seçək, STM32F407VG olsun:

Tamamlandı, görünən dialoq qutusunda "Bəli" düyməsini basın və ilk fayl layihəmizə əlavə olunacaq - startup_stm32f4xx.s. Əvvəlki kimi biz də kitabxanalardan istifadə edəcəyik CMSISStandart Periferik Kitabxana, lakin, təbii ki, artıq STM32F4xx nəzarətçiləri üçün. Beləliklə, biz mütləq onları endirməliyik və lazımi faylları hələ də boş olan layihəmizə əlavə etməliyik. Yeri gəlmişkən, mən bir neçə dəfə müxtəlif insanlardan eşitmişəm ki, onlar F4 üçün bəzi "belə olmayan" kitabxanalara rast gəlirlər və hətta ən sadə layihə də bir araya gətirilmir. Mən özüm bununla rastlaşmamışam, lakin mənim istifadə etdiyim sınaqdan keçirilmiş kitabxanalar bunlardır:

Beləliklə, biz onu yüklədik, hər şey hazırdır, indi faylları layihəyə əlavə edirik. Şəkil sizə lazım olanı göstərir:

Yaxşı, hazırlıq tamamlandı, indi kodumuzu ehtiva edən yeni .c faylı yaradaq. Gəlin gedək Fayl -> Yeni, Keil-də boş bir fayl açılır, klikləyin Fayl -> Saxla və məsələn, test.c adı altında saxlayın. Yadda saxlayarkən fayl uzantısını (.c) göstərməyi unutmayın. Fayl yaradıldı, əla, lakin biz də onu layihəmizə əlavə etməliyik. Əslində, bunda mürəkkəb bir şey yoxdur 😉 Gəlin bu fayla boş bir test proqramı yazaq:

#include "stm32f4xx.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" /*******************************************************************/ int main() ( isə (1 ) ( __NOP() ; ) ) /*******************************************************************/

Demək olar ki, hər şey hazırdır, layihə parametrlərinə baxmaq qalır - Layihə->Hədəf üçün seçimlər… Bir çox nişanı olan bir pəncərə açılır, burada yalnız bir neçəsi ilə maraqlanırıq. Nişanı açın C/C++ və Define sahəsində yazırıq:

Yaxşı, tarlada layihəyə daxil olan bütün fayllara yollar əlavə etməlisiniz. Bu addımı tamamladıqdan sonra F7 (Build) düyməsini sıxa bilərsiniz və layihə xətasız və xəbərdarlıqsız qurulacaq. Gördüyünüz kimi, mürəkkəb bir şey yoxdur)

Amma ümumiyyətlə, şəxsən mən hər şeyi bir az fərqli edirəm. Bu yanaşmanın mənfi cəhətlərinə baxın. Beləliklə, biz haradasa CMSIS və SPL kitabxanalarını yüklədik, bu qovluqlardan faylları əlavə etdik, fayllara gedən yolları yazdıq, hər şey yaxşıdır. AMMA! Layihə başqa kompüterdə qurulmayacaq, çünki yolların hamısı mütləqdir, yəni kompüterinizdəki xüsusi qovluqlara işarə edir. Və başqa bir maşında əslində yeni bir layihə yaratmaq üçün addımları yenidən yerinə yetirməli olacaqsınız. Bu böyük bir minusdur. Buna görə də mən adətən yeni layihə üçün ayrıca qovluq yaradıram, orada CMSIS, SPL və istifadə olunan digər kitabxanalar üçün alt qovluqlar yaradıram və bu qovluqlara hər bir konkret layihədə mənə lazım olan bütün faylları yerləşdirirəm. Məsələn, yeni layihəmiz və içindəki aşağıdakı qovluqlar üçün STM32F4_Test qovluğunu yaradaq:

Mən məqalənin əvvəlində layihə yaratarkən əlavə etdiyimiz bütün lazımi faylları CMSIS və SPL qovluqlarına qoyuram. İndi biz Keil-i işə salırıq, yeni layihə yaradırıq və onu Layihə alt qovluğumuzda saxlayırıq ki, bütün layihə faylları bir yerdə olsun və xaosa səbəb olmasın)

Layihə yaradıldı, indi, əvvəlki kimi, biz sadəcə STM32F4_CMSIS və STM32F4_SPL qovluqlarından bütün faylları əlavə edirik. Main() funksiyalı test .c faylımızı Mənbə qovluğuna yerləşdiririk və onu da layihəyə əlavə edirik. Yalnız parametrləri konfiqurasiya etmək qalır =) Hər şey eynidir - müəyyən edilmiş sahəyə yazırıq:

USE_STDPERIPH_DRIVER,STM32F4XX



Layihəni yığırıq - heç bir səhv yoxdur, uçuş normaldır! Prinsipcə, sonda eyni şeyi əldə etdik, amma indi layihə heç bir problem olmadan dərhal hər hansı digər kompüterdə yığılacaq və bu çox rahat və faydalıdır) Tamamilə bütün layihə faylları indi yaxınlıqda, eyni qovluqda yerləşir, və yollar nisbi oldu və dəyişdirilməsi lazım deyil.
Hamısı budur, əslində, yaxın gələcəkdə STM32F4-ü proqramlaşdırmaq üçün bir şey edəcəyik, mütləq, tezliklə görüşərik!;)

Nümunə məqalədən tam layihə -

Standart kitabxananın sistemə qoşulduğunu bildirdim. Əslində, CMSIS bağlıdır - MK-nin ümumiləşdirilmiş struktur təmsil sistemi, həmçinin SPL - standart periferik kitabxana. Onların hər birinə nəzər salaq:

CMSIS
Bu, MK-nın nüvəsi və periferiyası ilə işin birləşdirilməsi və strukturlaşdırılması üçün başlıq faylları dəsti və kiçik kod dəstidir. Əslində, bu fayllar olmadan MK ilə normal işləmək mümkün deyil. Kitabxananı MK üçün müşayiət olunan sənədlər səhifəsində əldə edə bilərsiniz.
Bu kitabxana, təsvirə görə, Cortex ailəsinin hər hansı bir MK ilə işləyərkən interfeysləri birləşdirmək üçün yaradılmışdır. Ancaq əslində bunun yalnız bir istehsalçı üçün doğru olduğu ortaya çıxır, yəni. Başqa bir şirkətdən mikrokontrollerə keçməklə siz onun periferiyalarını demək olar ki, sıfırdan öyrənməyə məcbur olursunuz.
Baxmayaraq ki, MK-nın prosessor nüvəsinə aid olan bu fayllar bütün istehsalçılardan eynidir (yalnız eyni prosessor nüvəsi modelinə malik olduqları üçün - ARM tərəfindən IP blokları şəklində təqdim olunur).
Buna görə də nüvənin registrlər, təlimatlar, kəsilmələr və köməkçi prosessor bölmələri kimi hissələri ilə işləmək hamı üçün standartdır.
Periferiyaya gəldikdə, STM32 və STM8 (birdən) demək olar ki, oxşardır və bu, ST tərəfindən buraxılan digər MK-lar üçün də qismən doğrudur. Praktiki hissədə CMSIS-dən istifadə etməyin nə qədər asan olduğunu göstərəcəyəm. Bununla belə, ondan istifadədə çətinliklər insanların sənədləri oxumaq və MK dizaynını başa düşmək istəməməsi ilə əlaqələndirilir.

SPL
Standart Periferik Kitabxana - standart periferik kitabxana. Adından da göründüyü kimi, bu kitabxananın məqsədi MK-nın periferiyası üçün abstraksiya yaratmaqdır. Kitabxana MK periferik qurğularının konfiqurasiyası və onlarla işləmək üçün insan tərəfindən oxuna bilən sabitlərin elan edildiyi başlıq fayllarından, həmçinin periferiya qurğuları ilə əməliyyatlar üçün kitabxananın özündə toplanmış mənbə kodu fayllarından ibarətdir.
SPL, istifadəçiyə yalnız bir istehsalçının deyil, ümumiyyətlə Cortex-Mxx prosessor nüvəsi olan bütün MCU-lar üçün ümumi interfeys təqdim edən CMSIS üzərindən abstraksiyadır.
Bunun yeni başlayanlar üçün daha əlverişli olduğuna inanılır, çünki... periferik cihazların necə işlədiyi barədə düşünməməyə imkan verir, lakin kodun keyfiyyəti, yanaşmanın universallığı və interfeyslərin məhdudlaşdırılması tərtibatçıya müəyyən məhdudiyyətlər qoyur.
Həmçinin, kitabxananın funksionallığı həmişə müəyyən şərtlər altında USART (universal sinxron-asinxron serial port) kimi bəzi komponentlərin konfiqurasiyasını dəqiq həyata keçirməyə imkan vermir. Praktiki hissədə kitabxananın bu hissəsi ilə işləməyi də təsvir edəcəyəm.

Hamıya salam. Son məqalədə xatırladığınız kimi qurduq proqram paketi STM32 mikrokontrollerləri ilə işləmək və ilk proqramı tərtib etmək. Bu yazıda biz bu lövhənin arxitekturası, mikrokontroller və iş üçün mövcud kitabxanalarla tanış olacağıq.

Aşağıda lövhənin şəklidir STM32F3 kəşfi , burada: 1 — MEMS sensoru. L3GD20 3 oxlu rəqəmsal giroskop. 2 - 3 oxlu rəqəmsal xətti akselerometr və 3 oxlu rəqəmsal geomaqnit sensoru LSM303DLHC olan MEMS sistemi. 4 – LD1 (PWR) – 3,3V enerji təchizatı. 5 – LD2 – qırmızı/yaşıl LED. Defolt qırmızıdır. Yaşıl rəng ST-LINK/v2 (və ya V2-B) və PC arasında əlaqə deməkdir. Məndə ST-LINK/v2-B, həmçinin fərdi displey var USB portu. 6. -LD3/10 (qırmızı), LD4/9 (mavi), LD5/8 (narıncı) və LD6/7 (yaşıl). Son yazıda LD4 LED-i yandırdıq. 7. – İki düymə: xüsusi USER və sıfırla RESET. 8. - Mini-B konnektorlu USB USER.

9 - USB sazlayıcı/proqramçı ST-LINK/V2. 1 0. - Mikrokontroller STM32F303VCT6. 11. — Xarici yüksək tezlikli generator 8 MHz. 12. – Burada aşağı tezlikli generator olmalıdır, təəssüf ki, lehimli deyil. 13. – SWD – interfeys. 14. – Xarici və ya daxili kontrollerlərin proqramlaşdırılmasını seçmək üçün tullananlar, birinci halda çıxarılmalıdır. 15 – Jumper JP3 – nəzarətçinin istehlakını ölçmək üçün ampermetri birləşdirmək üçün nəzərdə tutulmuş jumper. Aydındır ki, silinsə, o zaman daşımız başlamaz. 16. – STM32F103C8T6 onun üzərində debug lövhəsi var. 17. — LD3985M33R Aşağı gərginlik düşməsi və səs-küy səviyyəsi olan tənzimləyici, 150mA, 3.3V.

İndi STM32F303VCT6 mikrokontrollerinin arxitekturasına daha yaxından nəzər salaq. Onun texniki spesifikasiyalar: LQFP-100 qutusu, ARM Cortex-M4 nüvəsi, maksimum nüvə tezliyi 72 MHz, proqram yaddaşının tutumu 256 KB, yaddaş növü FLASH proqramları, həcm təsadüfi giriş yaddaşı SRAM 40 kbayt, RAM 8 kbayt, giriş/çıxışların sayı 87, interfeyslər (CAN, I²C, IrDA, LIN, SPI, UART/USART, USB), ətraf qurğular (DMA, I2S, POR, PWM, WDT), ADC/DAC 4 *12 bit/2*12bit, təchizatı gərginliyi 2...3,6 V, işləmə temperaturu –40...+85 C. Aşağıdakı şəkildə pinout var, burada 87 giriş/çıxış portunu görürük, onlardan 45-i Normal I/Os (TC, TTa), 42 5 volt tolerant I/O (FT, FTf) – 5 V ilə uyğun gəlir. Hər bir rəqəmsal giriş/çıxış xətti ümumi giriş/çıxış xətti kimi xidmət edə bilər.
təyinat və ya alternativ funksiya. Layihələr irəlilədikcə biz tədricən periferiya ilə tanış olacağıq.

Aşağıdakı blok diaqramı nəzərdən keçirin. Ürək 72 MHz-ə qədər işləyən 32 bitlik ARM Cortex-M4 nüvəsidir. O, daxili üzən nöqtə vahidi FPU və yaddaş mühafizə vahidi MPU, quraşdırılmış makro izləmə hüceyrələrinə malikdir - Mikrokontroller daxilində əsas proqramın icra prosesini izləmək üçün istifadə edilə bilən Embedded Trace Macrocell (ETM). Onlar cihaz işlədiyi müddətdə bu müşahidələri ETM kontaktları vasitəsilə davamlı olaraq çıxara bilirlər. NVIC (Nested vectored interrupt controller) – kəsmə idarəetmə modulu. TPIU (Trace Port Interface Unit). FLASH yaddaşa malikdir – 256 KB, SRAM 40 KB, RAM 8 KB. Nüvə ilə yaddaş arasında cihazların birbaşa qoşulmasına imkan verən Avtobus matrisi yerləşir. Burada həmçinin iki növ avtobus matrisi AHB və APB görürük, burada birincisi daha məhsuldardır və yüksək sürətli rabitə üçün istifadə olunur. daxili komponentlər, sonuncu isə periferiya qurğuları üçündür (giriş/çıxış cihazları). Nəzarətçidə 4 ədəd 12-bitlik ADC (ADC) (5 Mbit/s) və temperatur sensoru, 7 komparator (GP Comparator1...7), 4 proqramlaşdırıla bilən əməliyyat gücləndiricisi (OpAmp1...4) (PGA (Programmable Gain Array) var. )), 2 12 bitlik DAC kanalı (DAC), RTC (real vaxt saatı), iki nəzarətçi taymer - müstəqil və pəncərəli (WinWatchdog və Ind. WDG32K), 17 ümumi təyinatlı və çoxfunksiyalı taymer.

Ümumiyyətlə, biz nəzarətçi arxitekturasına baxdıq. İndi mövcud proqram kitabxanalarına baxın. Ümumi baxışdan sonra aşağıdakıları vurğulaya bilərik: CMSIS, SPL və HAL. LED-in yanıb-sönməsinin sadə bir nümunəsindən istifadə edərək hər birinə baxaq.

1). CMSIS(Cortex Microcontroller Software Interface Standard) - Cortex®-M üçün standart kitabxana. Cihaz dəstəyini təmin edir və asanlaşdırır proqram interfeysləri. CMSIS ardıcıl və təmin edir sadə interfeyslər kernel, onun periferiyaları və real vaxt əməliyyat sistemləri üçün. Onun istifadəsi proqramların yazılması üçün peşəkar bir üsuldur, çünki... registrlərə birbaşa yazmağı nəzərdə tutur və müvafiq olaraq məlumat vərəqlərinin daimi oxunması və öyrənilməsi zəruridir. Avadanlıq istehsalçısından asılı olmayaraq.
CMSIS aşağıdakı komponentləri ehtiva edir:
- CMSIS-CORE: Sistemin ardıcıl işə salınması və periferik giriş;
- CMSIS-RTOS: Deterministik Real-Time Proqram Təminatı proqram təminatı real vaxt);
- CMSIS-DSP: Rəqəmsal siqnal emalının sürətli tətbiqi rəqəmsal emal siqnallar);
- CMSIS-Driver: Ara proqram və proqram kodu üçün ümumi periferik interfeyslər (orta proqram və proqram kodu üçün ümumi periferik interfeyslər);
- CMSIS-Pack: Yenidən istifadə edilə bilən proqram komponentlərinə asan giriş proqram komponentləri);
- CMSIS-SVD: Cihaz və ətraf qurğulara ardıcıl görünüş periferik cihazlar);
- CMSIS-DAP: Aşağı qiymətli qiymətləndirmə aparatına qoşulma. Sazlama proqramı.

Məsələn, bir proqram yazaq - bir LED yanıb-sönür. Bunun üçün bizə registrləri təsvir edən sənədlər lazımdır. Mənim vəziyyətimdə RM0316 İstinad təlimatı STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC, STM32F398xE qabaqcıl ARM ® əsaslı MCU-lar, həmçinin onun məsul olduğu xüsusi ayağın təsviri DS9118: ARM® əsaslı Cortex®-M4 32b MCU+FPU, 256KB-a qədər Flash+ 48KB SRAM, 4 ADC, 2 DAC ch., 7 comp, 4 PGA, taymerlər, 2.0-3.6 V. Başlamaq üçün proqramdakı portu saatlandıracağıq, çünki Varsayılan olaraq, hər şey söndürülür, bu da azaldılmış enerji istehlakına nail olur. İstinad kitabçasını açın və Sıfırlama və saata nəzarət bölməsinə baxın, sonra RCC qeydiyyat xəritəsi və IOPEEN-i işə salmaq üçün hansı reyestrin cavabdeh olduğuna baxın

Bu registrin periferik hissələrinin saatlarının təsvirinə keçək AHB periferik saatı aktivləşdirən registr (RCC_AHBENR), bu portun 21-ci bitin altında olduğunu görürük. Onu RCC->AHBENR|=(1<<21) . Далее сконфигурируем регистры GPIO. Нас интересует три: GPIOE_MODER и GPIOx_ODR . C помощью них повторим программу с предыдущей статьи, затактируем PE8. Первый отвечает за конфигурацию входа выхода, выбираем 01: General purpose output mode. GPIOE->MODER|=0×10000 . İkincisi, ayağın aşağı/yüksək səviyyəsini açmaq üçündür. Aşağıda proqram:

#daxil et "stm32f3xx.h " //Mikrokontroller başlıq faylı
imzasız int i;
boş gecikmə () (
üçün (i=0;i<500000;i++);
}
int əsas (boş) (
RCC->AHBENR|=(1<<21);
GPIOE->MODER|=0×10000;
isə (1)(
gecikmə ();
GPIOE->ODR|=0×100;
gecikmə ();
GPIOE->ODR&=~(0×100);
} }

2). SPL(Standart Periferiya Kitabxanası)- bu kitabxana ST Electronics-in bütün prosessorlarını birləşdirmək üçün nəzərdə tutulub. Kod daşınmasını yaxşılaşdırmaq üçün nəzərdə tutulmuşdur və ilk növbədə yeni başlayan tərtibatçılar üçün nəzərdə tutulmuşdur. ST, HAL ilə uyğun gələn "aşağı təbəqə" adlanan SPL üçün əvəzetmə üzərində işləyir. Aşağı Layer (LL) drayverləri HAL-dan daha çox aparata yaxın olan, demək olar ki, yüngül, ekspert yönümlü təbəqə təmin etmək üçün nəzərdə tutulmuşdur. HAL-a əlavə olaraq, LL API-ləri də mövcuddur. SPL-də eyni proqramın nümunəsi.

#daxildir
#daxildir
#daxildir
#LED GPIO_Pin_8 müəyyən edin
int main() (
uzun i;
GPIO_InitTypeDef gpio;
// Mavi LED E portuna qoşulub, pin 8 (AHB avtobusu)
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, AKTİV EDİN);
// E portunu konfiqurasiya edin (LED)
GPIO_StructInit(&gpio); //verilən struktur dəyişənini elan edin və işə salın
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_Pin = LED;
GPIO_Init(GPIOE, &gpio);
// Yanıb-sönən LEDlər
isə (1) (
// Açıq
GPIO_SetBits(GPIOE, LED);
üçün (i = 0; i< 500000; i++);
// Hamısı söndür
GPIO_ResetBits(GPIOE, LED);
üçün (i = 0; i< 500000; i++);
} }

Hər bir funksiya texniki sənədlərdə təsvir edilmişdir UM1581 İstifadəçi təlimatı STM32F30xx/31xx Standart Periferik Kitabxanasının təsviri. Burada biz lazımi məlumatları, strukturları, sıfırlama və sinxronizasiyaya nəzarət funksiyalarını, həmçinin giriş/çıxış portlarını konfiqurasiya etmək üçün üç başlıq faylını birləşdiririk.

3). HAL- (Avadanlıq Giriş Səviyyəsi, Hardware Abstraksiya Layeri)- İnkişaf üçün başqa bir ümumi kitabxana. Son məqalədə istifadə etdiyimiz konfiqurasiya üçün CubeMX proqramı da buraxıldı. Orada biz də bu kitabxanadan istifadə edərək LED-in yanıb-sönməsi üçün proqram yazdıq. Aşağıdakı şəkildə gördüyümüz kimi, kub HAL və CMSIS sürücülərini yaradır. Yaxşı, istifadə olunan əsas faylları təsvir edək:
- system_stm32f3x.c və system_stm32f3x.h- zamanlama sisteminin konfiqurasiyası üçün minimal funksiya dəstlərini təmin etmək;
— core_cm4.h – nüvənin və onun periferiyalarının registrlərinə girişi təmin edir;
- stm32f3x.h - mikrokontroller başlıq faylı;
— startup_system32f3x.s — başlanğıc kodu, kəsmə vektorlarının cədvəlini və s.

# "main.h" daxil edin
# "stm32f3xx_hal.h" daxil edin
void SystemClock_Config(boş); /*Saat konfiqurasiya funksiyalarını elan edin*/
statik etibarsızlıq MX_GPIO_Init(boş); /*İ/O-nu işə salın*/
int əsas (boş) (
/*Bütün periferiya qurğularının sıfırlanması, Flash interfeysi və sistemi işə salır.*/
HAL_Init();
/* Sistem saatını konfiqurasiya edin */
SystemClock_Config();
/* Bütün konfiqurasiya edilmiş periferiyaları işə salın */
MX_GPIO_Init();
isə (1) (
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8); // Ayağın vəziyyətini dəyişdirin
HAL_Gecikmə(100); )
}
void SystemClock_Config (etibarsız){
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;
əgər (HAL_RCC_OscConfig (&RCC_OscInitStruct) != HAL_OK){

}
/**CPU, AHB və APB avtobuslarının saatlarını işə salır */
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;
əgər (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){
_Error_Handler(__FILE__, __LINE__);
}
/**Sistikanın kəsilmə vaxtını konfiqurasiya edin*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Sistemi konfiqurasiya edin */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn kəsmə konfiqurasiyası */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/** Pinləri Analoq Giriş Çıxışı EVENT_OUT EXTI kimi konfiqurasiya edin */
statik boşluq MX_GPIO_Init (etibarsız){
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Portlarının Saatını Aktivləşdirin */
__HAL_RCC_GPIOE_CLK_ENABLE();
/*GPIO pin çıxış səviyyəsini konfiqurasiya edin */
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 pinlərini konfiqurasiya edin: 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 * fayl, int sətir){
isə (1) (
} }
#ifdef İSTİFADƏ_TAM_TƏKLİF

Etibarsızlıq təsdiqi_failed (uint8_t* faylı, uint32_t xətti){
}
#endif
Burada, əvvəlki nümunədə olduğu kimi, məsələn, sənədlərdəki hər bir funksiyanın təsvirinə baxa bilərik UM1786 İstifadəçi Təlimatı STM32F3 HAL və aşağı səviyyəli sürücülərin təsviri.

Ümumiləşdirə bilərik ki, CMSIS-dən istifadə edən birinci seçim daha az çətin olur. Hər bir kitabxananın sənədləri var. Sonrakı layihələrdə biz STCube konfiqurasiya proqramından istifadə edərək HAL və CMSIS-dən istifadə edəcəyik və mümkünsə, proqram paketləri olmadan birbaşa registrlərdən istifadə edəcəyik. Bu gün orada dayanaq. Növbəti məqalədə tikintinin əsas prinsiplərini nəzərdən keçirəcəyik ağıllı ev. Hamıya sağol.




Üst