STM32F4 програмчлал. Кэйлд шинэ төсөл бий болгож байна. STM32F407(STM32F4-DISCOVERY) - Стандарт бус хандлага - Стандарт номын сангийн 1-р хэсэг

Энэ хүртэл бид цөмийн стандарт номын санг ашигласан - CMSIS. Портыг хүссэн горимд тохируулахын тулд бид тодорхой функцийг хариуцдаг бүртгэлийг хайж олох, мөн энэ үйл явцтай холбоотой бусад мэдээллийг том баримтаас хайх шаардлагатай болсон. Бид цаг хэмжигч эсвэл ADC-тай ажиллаж эхлэхэд бүх зүйл улам хэцүү, хэвийн байх болно. Тэнд байгаа регистрүүдийн тоо нь оролт гаралтын портуудаас хамаагүй их байна. Гараар тохируулах нь маш их цаг хугацаа шаарддаг бөгөөд алдаа гаргах магадлалыг нэмэгдүүлдэг. Тиймээс олон хүмүүс стандарт захын номын сантай ажиллахыг илүүд үздэг - 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 - Си хэл дээр бичигдсэн захын төхөөрөмжийн драйвер.
  • stm32f10x_it.h - бүх боломжит тасалдал зохицуулагчийг (тэдгээрийн загвар) агуулсан толгой файл.
  • stm32f10x_it.c нь Cortex M3 дахь онцгой тохиолдлуудад зориулсан тасалдал үйлчилгээний горимыг (ISR) агуулсан загвар эх кодын файл юм. Хэрэглэгч ашигласан дагалдах төхөөрөмжүүдэд өөрийн ISR-ийг нэмж болно.

Стандарт номын сан болон дагалдах хэрэгслүүд нь функц, тэмдэглэгээг нэрлэх конвенцтэй байдаг.

  • PPP гэдэг нь ADC гэх мэт захын төхөөрөмжүүдийн товчлол юм.
  • Систем, толгой болон эх кодын файлууд - stm32f10x_-ээс эхэлнэ.
  • Нэг файлд ашигласан тогтмолууд тухайн файлд тодорхойлогдоно. Нэгээс олон файлд хэрэглэгддэг тогтмолуудыг толгой файлд тодорхойлсон байдаг. Захын номын сан дахь бүх тогтмолуудыг ихэвчлэн ДЭЭД үсгээр бичдэг.
  • Регистрийг тогтмол гэж үздэг ба ТОМ үсэг гэж нэрлэдэг.
  • Захын тусгай функцийн нэрэнд USART_SendData() гэх мэт товчилсон үг орно.
  • Дагалдах төхөөрөмж бүрийг тохируулахын тулд PPP_InitTypeDef бүтцийг ашигладаг бөгөөд үүнийг PPP_Init() функцэд дамжуулдаг.
  • Эхлэлийг буцаахын тулд (утгыг анхдагч болгож тохируулах) PPP_DeInit() функцийг ашиглаж болно.
  • Дагалдах төхөөрөмжийг идэвхжүүлэх, идэвхгүй болгох боломжийг олгодог функцийг PPP_Cmd() гэж нэрлэдэг.
  • Тасалдлыг идэвхжүүлэх/идэвхгүй болгох функцийг PPP_ITConfig гэж нэрлэдэг.

Та номын сангийн дэмжлэг файлаас бүрэн жагсаалтыг дахин харах боломжтой. Одоо стандарт захын номын санг ашиглан анивчих LED-ийг дахин бичье!

Ажил эхлэхийн өмнө stm32f10x.h файлыг хараад мөрийг олъё.

#USE_STDPERIPH_DRIVER-ийг тодорхойлох

Хэрэв та татаж авсан архиваас номын сангийн файлуудыг ашиглан төслийг эхнээс нь тохируулсан бол энэ мөрийн тайлбарыг арилгах шаардлагатай болно. Энэ нь танд стандарт номын санг ашиглах боломжийг олгоно. Энэхүү тодорхойлолт (макро) нь stm32f10x_conf.h файлыг оруулахыг урьдчилсан процессорт тушаал өгнө:

#ifdef АШИГЛАХ_STDPERIPH_DRIVER #"stm32f10x_conf.h"-г оруулах #endif

Энэ файл нь модулиудыг агуулдаг. Хэрэв танд зөвхөн тодорхой зүйл хэрэгтэй бол үлдсэнийг нь идэвхгүй болго, энэ нь эмхэтгэх явцад цаг хэмнэх болно. Таны таамаглаж байсанчлан бидэнд RTC болон GPIO модулиуд хэрэгтэй байна (гэхдээ ирээдүйд бидэнд _bkp.h, _flash, _pwr.h, _rtc.h, _spi.h, _tim.h, _usart.h хэрэгтэй болно):

#include "stm32f10x_flash.h" // init_pll()-д #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h"

Өмнөх үеийн нэгэн адил та эхлээд В портын цагийг идэвхжүүлэх хэрэгтэй. Үүнийг stm32f10x_rcc.h-д зарласан функцээр гүйцэтгэдэг:

Хүчингүй болгох RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

FunctionalState тоог stm32f10x.h-д тодорхойлсон:

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

Хөлөө тохируулах бүтцийг зарлацгаая (та үүнийг stm32f10x_gpio.h файлаас олж болно):

GPIO_InitTypeDef LED;

Одоо бид үүнийг бөглөх ёстой. Энэ бүтцийн агуулгыг харцгаая:

Typedef бүтэц ( uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; ) GPIO_InitTypeDef;

Бүх шаардлагатай тооллого болон тогтмолуудыг нэг файлаас олж болно. Дараа нь дахин бичсэн init_leds() функц дараах хэлбэрийг авна.

Void led_init() ( // RCC_APB2PeriphClockCmd цагийг идэвхжүүлэх(RCC_APB2Periph_GPIOB, ENABLE); // Бүтэцийг зарлаж, бөглөнө үү GPIO_InitTypeDef LED; LED.GPIO_Pin = GPIO_Pin_0; LED.GPIO_Pin = GPIO_Pin_0; LED.GPIO_ed.GPMHz = LED.GPIO_Speed; _Годог_Гарах_PP; // GPIO_Init (GPIOB, &LED); ) портыг эхлүүлэх

main() функцийг дахин бичье:

Int main(void) ( led_init(); while (1) (GPIO_SetBits(GPIOB, GPIO_Pin_0); саатал(10000000); GPIO_ResetBits(GPIOB, GPIO_Pin_0); саатал(10000000); ) )

Хамгийн гол нь эхлүүлэх дарааллыг мэдрэх явдал юм: захын цагийг асаах, бүтцийг зарлах, бүтцийг дүүргэх, эхлүүлэх аргыг дуудах. Бусад захын төхөөрөмжийг ихэвчлэн ижил төстэй байдлаар тохируулдаг.

Удаан хугацааны турш, тэр ч байтугай маш удаан хугацаанд манай нийтлэлд шинэ нийтлэл гараагүй тул үүнийг дагаж мөрдөх цаг болжээ 😉 Өнөөдөр бид STM32F4-ийг судалж эхлэх болно. Магадгүй бид эдгээр хянагчдад зориулж шинэ төсөл боловсруулж эхлэх байх, гэхдээ үнэнийг хэлэхэд би энэ талаар нийтлэл бичихийг хүсээгүй, учир нь энд шинэ төсөл бий болж байгаа нь зарчмын хувьд. STM32F103 ()-ийн хувьд. Гэхдээ STM32F4-тэй холбоотой зарим бэрхшээлүүд байсаар байгаа тул энэ үйл явцыг нарийвчлан авч үзье)

Тиймээс, Кейлийг ажиллуулж, шинэ төсөл үүсгэцгээе - Төсөл -> Шинэ uVision төсөл.Бид шинэ төслийг зарим хавтсанд хадгалаад дараа нь ашиглах микроконтроллерыг сонгохыг биднээс хүсэх болно. За, сонгоцгооё, STM32F407VG байг:

Дууслаа, гарч ирэх харилцах цонхонд "Тийм" дээр дарвал эхний файл манай төсөлд нэмэгдэх болно - startup_stm32f4xx.s. Яг л өмнөх шигээ бид номын санг ашиглах болно CMSISТэгээд Стандарт захын номын сан, гэхдээ мэдээжийн хэрэг, аль хэдийн STM32F4xx хянагчдад зориулагдсан. Тиймээс бид тэдгээрийг татаж аваад хоосон байгаа төсөлдөө шаардлагатай файлуудыг нэмэх хэрэгтэй. Дашрамд хэлэхэд, би өөр өөр хүмүүсээс F4-т зориулсан "тийм биш" номын сангуудтай тааралддаг, тэр ч байтугай хамгийн энгийн төслийг нэгтгэдэггүй гэж нэг бус удаа сонссон. Би өөрөө ийм зүйлтэй тулгараагүй ч миний ашигладаг туршиж үзсэн номын сангууд энд байна:

Тиймээс бид үүнийг татаж авсан, бүх зүйл бэлэн болсон, одоо бид файлуудыг төсөлд нэмж оруулав. Зураг нь танд юу хэрэгтэй болохыг харуулж байна:

За, бэлтгэл ажил дууслаа, одоо бидний кодыг агуулсан шинэ .c файл үүсгэцгээе. Руу явцгаая Файл-> Шинэ, хоосон файл Keil-д нээгдэж, дарна уу File->Save asболон жишээ нь test.c нэрээр хадгална. Хадгалахдаа файлын өргөтгөлийг (.c) зааж өгөхөө бүү мартаарай. Файлыг үүсгэсэн, гайхалтай, гэхдээ бид үүнийг төсөлдөө нэмэх хэрэгтэй. Үнэн хэрэгтээ үүнд төвөгтэй зүйл байхгүй 😉 Энэ файлд хоосон туршилтын програм бичье:

#include "stm32f4xx.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" /*******************************************************************/ int main() ( байхад (1 ) ( __NOP() ; ) ) /*******************************************************************/

Бараг бүх зүйл бэлэн болсон, төслийн тохиргоог харах л үлдлээ. Төсөл->Зорилтод зориулсан сонголтууд…Олон цонхтой цонх нээгдэх бөгөөд бид энд зөвхөн цөөн хэдэн зүйлийг сонирхож байна. Табыг нээнэ үү C/C++Тодорхойлох талбарт бид бичнэ:

За, талбай дээр Та төсөлд орсон бүх файлд зам нэмэх хэрэгтэй. Энэ алхмыг дуусгасны дараа та F7 (Build) дээр дарж, төсөл нь алдаа, анхааруулгагүйгээр бүтээгдэх болно. Таны харж байгаагаар ямар ч төвөгтэй зүйл байхгүй)

Гэхдээ ер нь би хувьдаа юмыг арай өөрөөр хийдэг. Энэ аргын сул талыг хараарай. Тиймээс бид хаа нэгтээ CMSIS болон SPL сангуудыг татаж аваад, эдгээр фолдеруудаас файл нэмж, файл руу орох замыг бичсэн, бүх зүйл сайхан байна. ГЭХДЭЭ! Төсөл нь өөр компьютер дээр баригдахгүй, учир нь замууд нь бүгд үнэмлэхүй, өөрөөр хэлбэл тэдгээр нь таны компьютер дээрх тодорхой фолдеруудыг зааж өгдөг. Өөр машин дээр та шинэ төсөл үүсгэх алхмуудыг дахин хийх хэрэгтэй болно. Энэ бол маш том хасах юм. Тиймээс би ихэвчлэн шинэ төсөлд зориулж тусдаа хавтас үүсгэдэг бөгөөд үүнд би CMSIS, SPL болон ашигласан бусад номын санд зориулж дэд хавтас үүсгэдэг бөгөөд эдгээр хавтсанд би тодорхой төсөл бүрт хэрэгтэй бүх файлуудыг оруулдаг. Жишээлбэл, шинэ төсөлдөө зориулж STM32F4_Test хавтас болон түүний доторх дараах фолдеруудыг үүсгэцгээе:

Би нийтлэлийн эхэнд төсөл үүсгэх үед нэмж оруулсан бүх шаардлагатай файлуудыг CMSIS болон SPL хавтсанд оруулсан. Одоо бид Keil-г ажиллуулж, шинэ төсөл үүсгэж, Төслийн дэд хавтсанд хадгалснаар бүх төслийн файлууд нэг дор байх бөгөөд эмх замбараагүй байдал үүсгэхгүй байх болно)

Төслийг үүсгэсэн тул бид өмнөх шигээ STM32F4_CMSIS болон STM32F4_SPL фолдеруудаас бүх файлуудыг нэмж оруулав. Бид main() функцтэй test .c файлаа Эх сурвалжийн хавтсанд хийж, төсөлд нэмдэг. Үлдсэн зүйл бол тохиргоог тохируулах явдал юм =) Бүх зүйл ижил байна - тодорхойлох талбарт бид бичнэ:

USE_STDPERIPH_DRIVER,STM32F4XX



Бид төслийг угсарч байна - ямар ч алдаа байхгүй, нислэг хэвийн байна! Зарчмын хувьд эцэст нь бид ижил зүйлийг олж авсан, гэхдээ одоо төслийг ямар ч асуудалгүйгээр өөр ямар ч компьютер дээр нэн даруй угсрах болно, энэ нь маш тохиромжтой бөгөөд ашигтай юм) Төслийн бүх файлууд одоо ойролцоо, нэг хавтсанд байрладаг. замууд харьцангуй болсон бөгөөд өөрчлөх шаардлагагүй болсон.
Энэ бол үнэндээ бид ойрын ирээдүйд STM32F4 програмчлах ямар нэгэн зүйл хийх болно, тиймээс удахгүй уулзацгаая!;)

Жишээ өгүүллээс бүрэн төсөл -

Энэ нийтлэлд би STMicroelectronics үйлдвэрлэгч компанийн стандарт нэмэлт хэрэгслийн номын санд суурилсан STM32F10x микроконтроллеруудыг хурдан эхлүүлэх гол зүйлд анхаарлаа хандуулахыг хичээх болно.

Энэхүү нийтлэл нь Eclipse CDT-г хөгжүүлэлтийн орчин болгон ашиглах болно. Гол анхаарал нь програмын код дээр байх тул та Code::Blocks дээрх бүх залруулга хийх боломжтой.

ARM микроконтроллеруудын төслийн ерөнхий бүтцийг миний нийтлэлд тайлбарласан болно.

ARM микроконтроллеруудад (ялангуяа STM32F10x) зориулсан төсөл бүтээхийн тулд танд холбогч скрипт болон C-Startup файл хэрэгтэй гэдгийг энд товчхон сануулъя.

Холбогч скрипт нь микроконтроллерийн санах ойд програмын код болон өгөгдлийг байрлуулах заавар бүхий файл юм. Энэ нь таны програмын кодыг Flash програмын санах ой эсвэл SRAM өгөгдлийн санах ойд ачаалах тушаал өгч болно.

Өөр өөр хэмжээтэй программ болон өгөгдлийн санах ойтой микроконтроллерууд өөр өөр зохион байгуулалтын скрипт шаарддаг. Тэдгээрийг микроконтроллер үйлдвэрлэгч STMicroelectronics-ээс авч болно.
STM32F10x стандарт захын санг ARM_Toolchain/Lib/stm32f10x_stdperiph_lib.zip архиваас задлаарай.
Энэ нь янз бүрийн хөгжүүлэлтийн орчинд зориулсан жишээ төслүүдийг агуулдаг (IAR EWB, Keil uVision, Atollic True Studio гэх мэт). Бидний хувьд хамгийн ойрын нэг нь Atollic True Studio юм, учир нь энэ нь Eclipse-ийн өөрчлөлт юм.
Project/StdPeriph_Template/TrueSTUDIO лавлах руу очно уу, тэнд хэд хэдэн дэд сангууд байгаа бөгөөд тэдгээрийн нэр нь STM3210x-EVAL хөгжүүлэлтийн самбаруудын нэртэй тохирч байна.

Эдгээр самбаруудын аль нь таныхтай ижил микроконтроллерийн шугам ашигладаг болохыг олж мэдээрэй. stm32_flash.ld файлыг тохирох лавлахаас өөрийн төсөл рүү хуулна уу.

Мөн ашигласан микроконтроллерийн дагуу зөвхөн программ болон өгөгдлийн санах ойн хэмжээг өөрчлөх бүх нийтийн скрипт үүсгэх боломжтой.

STM32 микроконтроллеруудын эхлүүлэх кодыг (C-Startup) C эсвэл Assembler дээр бичиж болно.
Хэдийгээр STM32F10x стандарт захын номын сан (товчилсон STM32F10x SPL) нь алдаа дутагдлаасаа болж шүүмжлэгддэг ч STM32 програмчлалыг эхлүүлэхдээ хурдан эхлүүлэх хамгийн хялбар арга юм.
Гэхдээ та ямар нэгэн өөр хувилбар байгаасай гэж үргэлж хүсдэг. Ер нь бол зөндөө л байдаг, жишээ нь ассемблер хэл дээр программчилдаг :)

Энэ бол хамгийн хэцүү, утгагүй зам юм. Хоёрдахь арга нь CMSIS номын санг ашиглах бөгөөд энэ нь янз бүрийн микроконтроллерийн нэмэлт төхөөрөмжүүдэд хандахын тулд C хэлний бүтцэд хандах синтаксийг хангадаг. Хамгийн энгийн бөгөөд логик арга (миний бодлоор) бол номын санг ашиглах явдал юм.

Хэрэв та STM32F10x SPL-ийг эрс эсэргүүцэж байгаа бол танд өөр нэг хувилбар бий - libopencm3 номын сан. Үүнд жишээнүүдийн дийлэнх нь STM32F10x микроконтроллеруудын үндсэн цувралд төвлөрч байгаа боловч бусад цувралын жишээнүүд (STM32F2xx/4xx) гарч ирэх нь цаг хугацааны асуудал юм. Та хэзээ ч libopencm3 төсөлд нэгдэж, энэ үйл явцыг хурдасгах боломжтой.

CMSIS стандартыг таны программд ашиглах боломжтой.
Та C програмчлалын хэл дээр HAL (Hardware Abstraction Layer) түвшинг хэрэгжүүлэхийн тулд бага зэрэг хүчин чармайлт, цаг зарцуулснаар үүнийг хийх боломжтой.

Энэ арга нь зарим тохиолдолд цорын ганц боломжтой арга байж болох юм. Жишээлбэл, танай байгууллага ARM-ийн боловсруулсан тооцооллын цөм болон салбарын тусгай дагалдах төхөөрөмж дээр суурилсан тусгай чипүүдийг ашигладаг.

Эсвэл үйлдвэрлэгчид бэлэн үйлдлийн системүүдийг (Linux, QNX, Windows CE) ашиглахад гол анхаарлаа хандуулдаг ARM9 цөмтэй микроконтроллеруудад зориулсан программ хангамжийг C хэл дээр хэрэгжүүлэх хэрэгтэй, тиймээс C хэл дээр програмчлалын санг цэвэр хэлбэрээр эсвэл бусадтай хослуулан ашиглах хэрэгтэй. хөнгөн жинтэй RTOS үйлдвэрлэгчид үүнийг өгөхгүй байж магадгүй.

Аз болоход, Cortex-M3 цөм дээр суурилсан микроконтроллер үйлдвэрлэгчид хөгжүүлэгчдэд олон тооны кодын сангуудаар хангадаг. Энэ нь STM32 микроконтроллеруудад бас хамаатай.
STM32F10x SPL номын сангийн талаар үргэлжлүүлэн авч үзье. Бид үүнийг жишээгээр авч үзэх болно.
Юу болж байгааг бүхэлд нь илүү сайн ойлгохын тулд та энэ жишээг нээж эсвэл эхнээс нь өөрийн төслийг үүсгэж болно.

Хоёр дахь тохиолдолд би шаардлагатай алхмуудыг жагсаах болно:

  • Eclipse дээр шинэ хоосон төсөл үүсгэ
  • Байршлын скриптийг хуулж, файлыг төсөл рүү эхлүүлнэ үү
  • Шинэ үүсгэх эсвэл Makefile загвар хуулах
  • Миний жишээн дээрх Makefile-ийг загвар болгон ашиглахдаа та төслийн дотор src, inc, bin, obj сангуудыг үүсгэх, мөн bin, obj лавлах дотор Debug, Release дэд сангуудыг үүсгэх хэрэгтэй.
  • CMSIS болон STM32F10x SPL сангаас шаардлагатай эх сурвалж болон толгой файлуудыг хуулна уу.
  • Хэрэв ашигласан бол Makefile загварын хэрэглэгчийн тохиргоо хэсэгт шаардлагатай өөрчлөлтүүдийг хийнэ үү.
  • Eclipse-ийн "зорилтот болгох" цонхонд "Дбаг", "cleanDebug", "Release", "cleanRelease", "Program" гэсэн шинэ зорилтуудыг үүсгэ.
  • "Дбаг хийх" зорилтыг ажиллуулж, "Консол" цонхонд түүний гүйцэтгэлийг хяна.

Материалыг илүү сайн ойлгохын тулд би нийтлэлийг хэд хэдэн бие даасан догол мөр болгон хуваасан бөгөөд тус бүр нь STM32F10x SPL номын сантай ажиллах нэг талыг тайлбарласан болно.

Макро тодорхойлолтыг ашиглан STM32F10x SPL-г тохируулж байна

Номын санг тохируулахын тулд урьдчилан тодорхойлсон макро утгуудыг ашигладаг бөгөөд бид одоо авч үзэх болно.
Тэдгээрийг урьдчилан процессорын удирдамжийг ашиглан толгой файл дотор тохируулж болно #тодорхойлохэсвэл макро тодорхойлолтуудын утгыг түлхүүрээр дамжуулна GCC хөрвүүлэгч.
Миний жишээн дээр би хоёр дахь аргыг ашигладаг.
Makefile хувьсагч дотор ТОДОРХОЙЛОХ STM32F10x SPL номын санг бүрдүүлэхэд шаардлагатай макронуудыг агуулдаг.
Макро тодорхойлолт STM32F10X_MDашигласан микроконтроллер нь шугамд хамаарах эсэхийг заана Дунд зэргийн нягтралтай.
Үүнд 64-128 кБ флаш санах ойтой микроконтроллерууд орно.
Дараах хүснэгтэд янз бүрийн цуврал микроконтроллеруудын макронуудын нэрийг жагсаав.

Цувралын нэр Макро Тодорхойлолт
Бага нягтралтай утгын шугам STM32F10X_LD_VL 16 - 32 кБ флаш санах ойн багтаамжтай
Бага нягтралтай STM32F10X_LD
16 - 32 кБ флаш санах ойн багтаамжтай
Дунд зэргийн нягтрал Утгын шугам STM32F10X_MD_VL Түргэн санах ой
64 - 128 кБ
Дунд зэргийн нягтралтай STM32F10X_MD Flash санах ойтой STM32F101xx, STM32F102xx, STM32F103xx цувралын микроконтроллерууд 64 - 128 кБ
Өндөр нягтралтай утгын шугам STM32F10X_HD_VL эзлэхүүнтэй STM32F100xx цувралын микроконтроллерууд
Flash - санах ой 256 - 512 кБ
Өндөр нягтралтай STM32F10X_HD эзлэхүүнтэй
Флаш санах ой 256 - 512 кБ
XL-нягтрал STM32F10X_XL
Флаш санах ой 512 - 1024 кБ
Холболтын шугам STM32F10X_CL

Микроконтроллерийн цагийн давтамжийг тохируулахын тулд та system_stm32f10x.c файлд шаардлагатай цагийн давтамжийн утга бүхий макро тайлбарыг арилгах хэрэгтэй.

#хэрэв тодорхойлсон бол (STM32F10X_LD_VL) || (тодорхойлогдсон STM32F10X_MD_VL) || (STM32F10X_HD_VL-г тодорхойлсон) #SYSCLK_FREQ_24MHz 24000000-г тодорхойлох #өөрөөр /* #SYSCLK_FREQ_HSE HSE_VALUE-г тодорхойлох */ /* #SYSCLK_FREQ_24MHz-ийг тодорхойлох #SYSCLK_FREQ_24MHz #SYSC000000000000000000000000000000000000000* Гц 3600 0000 */ /* #SYSCLK_FREQ_48MHz-ийг тодорхойлох 48000000 */ /* #SYSCLK_FREQ_56MHz-ийг тодорхойлох 56000000 * / #SYSCLK_FREQ_72MHz-г тодорхойлох 72000000 #endif

#хэрэв тодорхойлсон бол (STM32F10X_LD_VL) || (тодорхойлогдсон STM32F10X_MD_VL) || (тодорхойлогдсон STM32F10X_HD_VL)

/* #SYSCLK_FREQ_HSE HSE_VALUE-г тодорхойлох */

#SYSCLK_FREQ_24MHz 24000000-г тодорхойлох

#өөр

/* #SYSCLK_FREQ_HSE HSE_VALUE-г тодорхойлох */

/* #SYSCLK_FREQ_24MHz 24000000-г тодорхойлох */

/* # SYSCLK_FREQ_36MHz 36000000-г тодорхойлох */

/* # SYSCLK_FREQ_48MHz 48000000-г тодорхойлох */

/* # SYSCLK_FREQ_56MHz-ийг тодорхойлох 56000000 */

#SYSCLK_FREQ_72MHz 72000000-ыг тодорхойлох

#endif

Бүх үндсэн сүлжээнд 8 МГц давтамжтай кварцын резонаторыг ашиглахаар төлөвлөж байна
25 МГц давтамжтай кварцын резонатор суурилуулах шаардлагатай Холболтын шугамаас бусад цуврал микроконтроллерууд.
Хэрэв та кварцын резонаторыг өөр давтамжийн утгуудаар ашигладаг бол stm32f10x.h толгой файл дахь HSE_VALUE макроны утгыг өөрчилж, бүх хамааралтай функцуудыг тохируулах хэрэгтэй.
USE_STDPERIPH_DRIVER макроны зорилгыг таахад хэцүү биш - STM32F10x стандарт захын номын санг ашиглах.
USE_FULL_ASSERT – ASSERT макро ашиглан програмыг дибаг хийнэ.

Номын сан дахь assert_param макрог ашиглаж байна

STM32F10x SPL номын сангийн бүх функцууд нь аргументуудыг шалгахын тулд assert_param макро ашигладаг.
Энэ макро нь функцын аргументыг оролцуулсан илэрхийллийг тэг хүртэл тэнцүү эсэхийг шалгадаг. Хэрэв илэрхийллийн утга тэг байвал аргументийн алдаа зохицуулагч assert_failed функцийг дуудна, эс тэгвээс (илэрхийлэл тэг биш) аргумент шалгах ажиллагаа амжилттай болно.
Та програмдаа assert_failed функцийг хэрэгжүүлэх хэрэгтэй.
Энэ нь алдааны мэдэгдэл, файлын нэр, алдаа үүсгэсэн кодын мөрийн дугаарыг харуулна.
Debug_printf макро нь стандарт new_lib номын сан эсвэл жишээ нь ноён Ченийн номын санг ашиглан USART-ээр дамжуулан гаргаж болно.

#define debug_printf xprintf /* printf */ #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) ( debug_printf("Буруу параметрийн утга: %s файлын %d\r\n", файл, (int)мөр) ; байхад (1) ( ) )/* баталгаажуулалт амжилтгүй болсон */ #endif/*БҮРЭН_БАТЛАХ*/

#define debug_printf xprintf /* printf */

#ifdef_БҮРЭН_БАТЛАХ_ХЭРЭГЛЭЭ

хүчингүй болгож баталгаажуулсан_ амжилтгүй болсон (uint8_t * файл, uint32_t мөр)

дибаг_хэвлэхf( "Буруу параметрийн утга: %s файл %d\r\n", файл, (int) мөр);

байхад(1)

) /* батлах_бүтэлгүйтсэн */

#endif/*БҮРЭН_БАТЛАХ_ХЭРЭГЛЭЭ*/

Таны кодонд хэрэгжсэн assert_failed функцийг зөвхөн USE_FULL_ASSERT макро зарласан үед л ашигладаг. Үгүй бол бүх дибаг хийх кодыг эх сурвалжаас хасна. Энэ функцийг драйверын номын сангийн тохиргооны толгой файлын stm32f10x_conf.h дээр хэрэгжүүлсэн.

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

#ifdef_БҮРЭН_БАТЛАХ_ХЭРЭГЛЭЭ

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

хүчингүй болгох assert_failed (uint8_t * файл, uint32_t мөр);

#өөр

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

#endif /* БҮРЭН_БАТЛАХ */

Энд тайлбарлах нэг их зүйл алга. assert_param ашиглах жишээг харцгаая.

хүчингүй болсон set_param(uint8_t * param, uint8_t утга) (assert_param(param != NULL); *парам = утга; )/*set_param*/

хүчингүй болсон set_param (uint8_t * param , uint8_t утга)

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

* параметр = утга;

) /*параметр_тогтоох*/

Уг функц нь аргумент болгон дамжуулсан заагчаар параметрийн утгыг тогтоодог. Хэрэв USE_FULL_ASSERT макро зарлаагүй бол бид мөрүүд гэж үзэж болно.
assert_param(param != NULL) нь кодонд байхгүй, эс тэгвээс параметрийг энэ тодорхойлолтоор шалгана.
Хэрэв заагч тодорхойлогдоогүй бол утгын параметр != NULL худал байх ба assert_failed функц ажиллах бөгөөд энэ нь USART-ээр файлын нэр болон алдаатай мөрийн дугаарыг гаргаж, дараа нь давталт хийх бөгөөд ингэснээр утгыг алдахаас сэргийлнэ. санах ойд тодорхойгүй хаягаар хуваарилагдсан.
Та өөрийн кодонд assert_param макро ашиглах шаардлагагүй, харин номын сангийн кодонд
STM32F10x SPL нь хаа сайгүй хэрэглэгддэг.
set_param функцийг assert_param ашиглахгүйгээр аргументийн алдаа шалгах замаар хэрэгжүүлж болно.

#define ERROR (-1) #define OK (0) int set_param(uint8_t * param, uint8_t утга) ( int r = ERROR; if (param == NULL) буцаах r; *param = утга; r = OK; буцах r; )/*set_param*/

#АЛДААГ тодорхойлох (-1)

#тодорхойлох OK (0)

int set_param (uint8_t * param, uint8_t утга)

int r = ERROR;

хэрэв (парам == NULL)

буцах r ;

* параметр = утга;

r = OK;

буцах r ;

) /*параметр_тогтоох*/

STM32F10x SPL номын сан дахь C-Startup файл

Эхлэх кодонд микроконтроллерыг эхлээд эхлүүлж, стекийг тохируулж, BSS хэсгийг дахин тохируулж, main() үндсэн функцийг дууддаг.
Эхлэх код нь STM32F10x SPL номын сантай шууд хамааралгүй. Гэсэн хэдий ч, энэ ачаалах кодонд програмын main() функцийг дуудахын өмнө CMSIS-ийн нэг хэсэг болох микроконтроллерыг эхлүүлэх SystemInit() функцийг дууддаг.
Үүнийг CMSIS номын сангаас хялбархан олж болно.
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO лавлах руу очиж шаардлагатай файлыг хуулна уу. Таны төсөлд ашигласан микроконтроллер аль шугамд хамаарахыг олж мэдэх л үлдлээ.
Үүнийг хийхийн тулд дараах хүснэгтийг харна уу.

Цувралын нэр Файлын нэр Тодорхойлолт
Бага нягтралтай утгын шугам startup_stm32f10x_ld_vl.s эзлэхүүнтэй STM32F100xx цувралын микроконтроллерууд
Флаш санах ой 16 - 32 кБ
Бага нягтралтай startup_stm32f10x_ld.s STM32F101xx, STM32F102xx, STM32F103xx цуврал микроконтроллерууд
16 - 32 кБ флаш санах ойн багтаамжтай
Дунд зэргийн нягтрал Утгын шугам startup_stm32f10x_md_vl.s STM32F100xx цуврал микроконтроллерууд
Дунд зэргийн нягтралтай startup_stm32f10x_md.s STM32F101xx, STM32F102xx, STM32F103xx цуврал микроконтроллерууд
Флэш санах ойн багтаамжтай 64 - 128 кБ
Өндөр нягтралтай утгын шугам startup_stm32f10x_hd_vl.s STM32F100xx цуврал микроконтроллерууд
Өндөр нягтралтай startup_stm32f10x_hd.s STM32F101xx, STM32F103xx цуврал микроконтроллерууд
Флэш санах ойн багтаамжтай 256 - 512 кБ
XL-нягтрал startup_stm32f10x_xl.s STM32F101xx, STM32F103xx цуврал микроконтроллерууд
Флэш санах ойн багтаамжтай 512 - 1024 кБ
Холболтын шугам startup_stm32f10x_cl.s STM32F105xx ба STM32F107xx цувралын микроконтроллерууд

Эхлүүлэх файл нь тасалдал болон онцгой байдлын вектор зохицуулагчийн нэрийг агуулдаг боловч зөвхөн дахин тохируулах вектор зохицуулагч хэрэгждэг бөгөөд энэ дотор үндсэн() функцийг дуудахын өмнө бүх анхны эхлэлийг гүйцэтгэдэг.
Бусад бүх онцгой тохиолдлын зохицуулагчийн хэрэгжилтийг программист хариуцна. Хэрэв таны програм ямар ч боловсруулагч ашигладаггүй бол тэдгээрийг бүртгэх шаардлагагүй болно. Хэрэв үл хамаарах зүйл тохиолдвол анхдагч зохицуулагчийг ашиглах болно - програмын кодыг давталт хийх.

CMSIS номын сангийн бүрэлдэхүүн

Энэ нийтлэлд өмнө нь бичсэнчлэн CMSIS номын сан нь Си хэлний бүтцийн элементүүдийг ашиглан микроконтроллерийн захын модулиудад хандах боломжийг олгодог.
Энэхүү номын сангийн хэрэгжилт нь хоёр хэсэгт хуваагдана. Эхний хэсэг нь Cortex-M3 цөмийн захад, хоёр дахь нь тодорхой микроконтроллерийн загварын зах руу нэвтрэх боломжийг олгодог.
CMSIS стандарт нь Cortex-M3 цөмтэй бүх микроконтроллеруудад ижил байдаг тул эхний хэсгийн хэрэгжилт нь бүх үйлдвэрлэгчдэд ижил байх боловч хоёр дахь хэсэг нь үйлдвэрлэгч бүрийн хувьд өөр байх болно.
CMSIS нь хэд хэдэн толгой болон эх файлуудыг агуулдаг. Эхний хэсэгт файлууд орно:

  • core_cm3.h
  • core_cm3.c

CMSIS-ийн хоёр дахь хэсэг нь C-Startup файл болон дараах файлуудыг агуулна.

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

stm32f10x.h толгой файл нь stm32f10x микроконтроллеруудын захын модулиудад хандах макро тодорхойлолтуудыг агуулдаг.
system_stm32f10x.h болон system_stm32f10x.c файлууд нь микроконтроллерийн анхны эхлэлийг хэрэгжүүлдэг.

STM32F10x SPL номын сангийн бүтэц, тохиргоо

Номын сан нь stm32f10x_ угтвар бүхий захын модулиудтай ижил нэртэй эх болон толгой файлуудаас бүрдэнэ.
Жишээлбэл, USART модулийн харилцан үйлчлэлийн хэрэгжилт нь stm32f10x_usart.h болон stm32f10x_usart.c файлуудад агуулагддаг.
Номын сангийн элементүүдийг нэрлэх конвенци, зарим кодчилолын дүрмүүдийг баримт бичигт тайлбарласан байдаг.
Номын сан нь захын микроконтроллерийн модулиудын драйверуудын хэрэгжилтийг агуулдаг.
Номын сангийн элементүүдийн нэрс нь захын модулиудын дараах товчлолуудыг ашигладаг.

Товчлол Захын модуль
ADC аналог-тоон хувиргагч
BKP нөөц бүртгэлүүд
БОЛНО CAN интерфейс
СЕХ хэрэглээний хянагч
ХХЗХ шалгах нийлбэрийг тооцоолох модуль
DAC дижитал-аналог хувиргагч
DBGMCU микроконтроллерийн дибаг хийх
DMA санах ойн шууд хандалтын хянагч
EXTI гадаад тасалдлын хянагч
FSMC гадаад санах ойн хянагч
Флаш Флаш програмын санах ой
GPIO ерөнхий зориулалтын оролт гаралтын портууд
I2C I2C интерфейс
I2S I2S (Дууны) интерфейс
IWDG бие даасан харуулын таймер
NVIC үүрлэсэн тасалдал хянагч
PWR цахилгаан хянагч
RCC дахин тохируулах болон цаг хянагч
RTC бодит цагийн хянагч (цаг)
SDIO SDIO интерфейс
SPI SPI интерфейс
SysTick системийн таймер
TIM үндсэн эсвэл дэвшилтэт таймер
USART бүх нийтийн цуваа синхрон-асинхрон
дамжуулагч
WWDG цонхны харуул

Эдгээр товчлол дээр үндэслэн номын сангийн программ хангамжийн модулиудын нэрс бүрддэг. Номын сангийн бүх модулийг ашиглах шаардлагагүй.
Төсөлд зөвхөн шаардлагатай модулиудыг ашиглахын тулд номын санг тохируулах шаардлагатай.
Эдгээр зорилгын үүднээс STM32F10x SPL номын санг ашигладаг төсөл бүр stm32f10x_conf.h толгой файлтай байх ёстой.

#include "stm32f10x_gpio.h" //#include "stm32f10x_i2c.h" //#include "stm32f10x_iwdg.h" //#include "stm32f10x_pwr.h" #include "stm32fccr.h"x"

#"stm32f10x_gpio.h" оруулах

//#include "stm32f10x_i2c.h"

//#include "stm32f10x_iwdg.h"

//#include "stm32f10x_pwr.h"

#"stm32f10x_rcc.h" оруулах

Шаардлагатай модулийг идэвхжүүлэхийн тулд та удирдамжийн тайлбарыг арилгах хэрэгтэй #оруулнахаргалзах толгой файлуудтай.
stm32f10x_conf.h толгой файл нь stm32f10x.h-д багтсан тул STM32F10x SPL номын сангийн функцуудыг ашиглахын тулд та зөвхөн нэг толгой файлыг stm32f10x.h эх кодод оруулахад хангалттай.

// stm32f10x.h файлд #ifdef USE_STDPERIPH_DRIVER #"stm32f10x_conf.h"-г оруулах #endif

Төсөл нь USE_STDPERIPH_DRIVER, USE_FULL_ASSERT макро болон ашигласан микроконтроллерийн цувралыг тодорхойлсон макро (жишээлбэл, Дунд зэргийн нягтын шугамын хувьд STM32F10X_MD) тодорхойлох ёстой гэдгийг би давтан хэлье.
Хэрэв та стандарт кварц давтамжийн утгыг ашигладаг бөгөөд хянагч нь хамгийн ихдээ 72 МГц давтамжтайгаар ажилладаг бол өөр юу ч өөрчлөх шаардлагагүй болно.
Та Makefile-д эмхэтгэх номын сангийн файлуудын жагсаалтыг нэмэх хэрэгтэй.
Жишээлбэл:

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

SRC += stm32f10x_rcc. в

SRC += stm32f10x_gpio. в

STM32F10x SPL номын санг ашиглах. Ажлын механизмууд

Захын номын санг ашиглан програмчлал хийж эхлэхийн тулд номын санд дагалдаж ирсэн жишээнүүдийг үзэх нь хамгийн хялбар арга юм. Гэсэн хэдий ч эдгээр жишээнүүдийн кодыг ойлгохын тулд та номын сангийн синтакс, хэрэглээний талаархи үндсэн мэдлэгтэй байх ёстой.
Өмнө нь жагсаасан бүх захын микроконтроллерийн модулиуд нь анх удаа идэвхгүй болсон, цагны дохиог өгдөггүй бөгөөд цахилгаан хэрэглэдэггүй.
Захын модулийг ашиглахын тулд та эхлээд түүнд цагийн дохио өгөх хэрэгтэй. Цагны дохиог RCC цаг ба дахин тохируулах модулиар хангадаг.
Эдгээр зорилгын үүднээс номын сан нь дараахь үүргийг гүйцэтгэдэг.

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ИДЭВХЖҮҮЛЭХ); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ИДЭВХЖҮҮЛЭХ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ИДЭВХЖҮҮЛЭХ);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ИДЭВХЖҮҮЛЭХ);

RCC_APB2PeriphClockCmd (RCC_APB2Periph_PPPx, ИДЭВХЖҮҮЛЭХ) ;

RCC_APB1PeriphClockCmd (RCC_APB1Periph_PPPx, ИДЭВХЖҮҮЛЭХ) ;

Энд PPP нь модулийн нэрийн нэрийг (жишээ нь ADC эсвэл USART) илэрхийлж, x нь захын модулийн дугаар юм.
Юуны өмнө та ашиглаж байгаа модуль нь аль автобусанд холбогдсон болохыг олж мэдэх хэрэгтэй.
Нийтдээ Cortex-M3 үндсэн архитектур бүхий микроконтроллерууд гурван автобустай:
заавар автобус, өгөгдлийн автобус, системийн автобус. Зааварчилгааны автобус нь цөмийг Flash програмын санах ойтой холбодог. Өгөгдөл болон системийн автобусуудыг үндсэн давтамж дээр ажилладаг AHB (ARM Hi-Speed ​​​​Bus) автобусны матрицад нэгтгэдэг. Гэхдээ AHB автобусны давтамжийг хуваагч суурилуулах замаар багасгаж болно. AHB автобус нь үндсэн болон DMA модуль зэрэг өндөр хурдны төхөөрөмжүүдийг холбодог.
I/O төхөөрөмжүүд нь AHB автобусанд APB1 ба APB2 (ARM Peripheral Bus) завсрын автобусаар холбогддог.
APB2 автобусны хамгийн их ажиллах давтамж нь 72 МГц, APB1 автобусны давтамж
36 МГц хүртэл хязгаарлагдмал.
Та өөрийн ашиглаж буй захын модуль ямар автобусанд холбогдсоныг баримтаас олж мэдэх эсвэл stm32f10x_rcc.h толгой файлаас харах боломжтой.
Энэ файлыг нээгээд RCC_AHBPeriph, RCC_APB1Periph, RCC_APB2Periph утгуудыг дарааллаар нь хай.

#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) #define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) #тодорхойл (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 автобусанд холбогдсон байх магадлалтай.

#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) #define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) #тодорхойл _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. гишүүнN = valN;

stm32f10xQuickstart төслийн жишээг харцгаая:

GPIO_InitTypeDef GPIO_InitStructure; #ifdef USE_STM32H_103 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ИДЭВХЖҮҮЛЭХ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed ​​= GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitTypeDef GPIO_InitStructure;

#ifdef USE_STM32H_103

RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ИДЭВХЖҮҮЛЭХ) ;

GPIO_InitStructure. GPIO_Pin = GPIO_Pin_12;

GPIO_InitStructure. GPIO_Speed ​​= GPIO_Speed_50MHz;

GPIO_InitStructure. GPIO_Mode = GPIO_Mode_Out_PP ;

GPIO_Init(GPIOC, & GPIO_InitStructure);

GPIO_InitStructure бүтцийн элементүүдэд портын пин дугаар, горим, хурдны утгыг өгдөг.
GPIO_Init функцийг дуудсанаар GPIOC портын 12-р мөрийг эхлүүлнэ.
GPIO_Init функцийн эхний аргумент нь GPIO_TypeDef бүтэц рүү заагч болгон хувиргасан GPIOC захын санах ойн талбарт заагч юм.

// stm32f10x.h #тодорхойлоорой GPIOC ((GPIO_TypeDef *) GPIOC_BASE) #тодорхойлоорой GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #тодорхойлоорой APB2PERIPH_BASE (PERIPH_BASE + 0x1000BASE + 0x100BASE + 0x1000BASE) (IP3_SE_000) #IPH_BASE -г тодорхойлно 0000) typedef бүтэц ( __IO uint32_t CRL; __IO uint32_t CRH ;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR; ) GPIO_TypeDef;

// stm32f10x.h

# GPIOC ((GPIO_TypeDef *) GPIOC_BASE) тодорхойлох

#GPIOC_BASE-г тодорхойлох (APB2PERIPH_BASE + 0x1000)

#APB2PERIPH_BASE-г тодорхойлох (PERIPH_BASE + 0x10000)

#PERIPH_BASE-г тодорхойлох ((uint32_t)0x40000000)

typedef бүтэц

IO uint32_t CRL;

IO uint32_t CRH ;

IO uint32_t IDR;

IO uint32_t ODR;

IO uint32_t BSRR;

IO uint32_t BRR;

IO uint32_t LCKR;

) GPIO_TypeDef;

GPIO_InitStructure бүтэц нь толгой файлд тайлбарласан GPIO_InitTypeDef төрлийн бүтэцтэй.
stm32f10x_gpio.h:

//stm32f10x_gpio.h typedef struct ( uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; )GPIO_InitTypeDef; typedef тоо (GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz )GPIOSpeed_TypeDef; typedef тоо ( GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_Mode_Out_OD = GPIO_Mode = GPIO_PPOD = GPIO_Mode AFIO_00 C, GPIO_Mode_AF_PP = 0x18 )GPIOMode_TypeDef;

//stm32f10x_gpio.h

typedef бүтэц

uint16_t GPIO_Pin;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOMode_TypeDef GPIO_Mode;

) GPIO_InitTypeDef;

typedef тоо

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

) GPIOSpeed_TypeDef;

typedef тоо

(GPIO_Mode_AIN = 0x0,

GPIO_Mode_IN_FLOATING = 0x04,

GPIO_Mode_IPD = 0x28,

GPIO_Mode_IPU = 0x48,

GPIO_Mode_Out_OD = 0x14,

GPIO_Mode_Out_PP = 0x10,

GPIO_Mode_AF_OD = 0x1C,

GPIO_Mode_AF_PP = 0x18

) GPIOMode_TypeDef;

Таны харж байгаагаар GPIOSpeed_TypeDef гэх мэт хэрэглэгчийн тодорхойлсон төрлүүд болон GPIOMode_TypeDef зэрэг захын бүртгэлийг эхлүүлэхэд хялбар болгох үүднээс тодорхой утгатай өгөгдлийн төрлүүдийг эхлүүлсэн бүтцийн өгөгдлийн төрөл болгон ашиглаж болно.
GPIO зүү тус бүрийг тохируулахад 4 бит хуваарилагдсан.
Дараах зураг нь GPIO-ийн тэг битийн форматыг харуулж байна.

Горим - гаралтын ажиллагааны горим (оролт/гаралт). Илүү нарийвчлалтай хэлэхэд эдгээр утгууд нь арай том бөгөөд гаралтын порт болгон тохируулсан портууд нь гаралтын дохионы хамгийн их давтамжийг хязгаарладаг.

Горим Тодорхойлолт
00 орц
01 гаралтын давтамж 10 МГц хүртэл
10 гаралтын давтамж 2 МГц хүртэл
11 гаралтын давтамж 50 МГц хүртэл

CNF - гаралтын тохиргооны битүүд. Үйл ажиллагааны горимоос хамаарна:

Зүү тохиргооны бүртгэлийн ийм бүтэцтэй бол тохиргооны бүх битийг өөрөө тохируулах нь туйлын тохиромжгүй байх болно гэдгийг хүлээн зөвшөөрч байна. GPIO_Init номын сангийн функцийг ашиглан үүнийг хийхэд илүү хялбар байх болно.
Захын модулийг эхлүүлсний дараа PPP_Cmd функцийг ашиглан идэвхжүүлэх шаардлагатай.

PPP_Cmd(PPP, ИДЭВХЖҮҮЛЭХ);

PPP_Cmd(PPP, ИДЭВХЖҮҮЛЭХ);

Энэ функц GPIO модулиудад байхгүй тул эхлүүлсний дараа та GPIO зүүг шууд ашиглаж болно. Номын сан нь зөвхөн микроконтроллерийн техник хангамжийн интерфейсээр хангадаг гэдгийг санах нь зүйтэй. Хэрэв техник хангамжийн модульд идэвхжүүлэх/идэвхгүй болгох туг байхгүй бол функц дуудагдана PPP_Cmd(PPP, ИДЭВХЖҮҮЛЭХ)боломжгүй.
Гаралтын горимд GPIOx зүүний төлөвийг хянах, оролт эсвэл гаралтын горимд утгыг уншихын тулд номын сан нь дараах функцуудыг хангадаг.

хүчингүй болсон 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 үндсэн тасалдлын 15 вектор ба нэг гадаад маскгүй EXTI тасалдал байдаг.
Удирдлага нь нэг зохицуулагч дотор өөр тасалдал тохиолдож болох үүрлэсэн тасалдлыг дэмждэг. Үүнтэй холбогдуулан тасалдлын эх үүсвэр бүр өөрийн гэсэн тэргүүлэх чиглэлтэй байдаг. 16 тасалдлын тэргүүлэх түвшнийг дэмждэг.
Cortex-M3 үндсэн тасалдлын векторууд нь хамгийн чухал ач холбогдолтой утгуудтай.
Тасалдлын хамгийн дээд гурван түвшинг векторуудад хуваарилдаг бөгөөд үүнийг өөрчлөх боломжгүй:

Тоо Ажиллагч Тэргүүлэх асуудал Тодорхойлолт
1 Reset_Handler -3(хамгийн өндөр) Векторыг дахин тохируулах
2 NMI_Handler -2 Маск хийх боломжгүй тасалдал
3 HardFault_Handler -1 Онцгой байдлын нөхцөл

Бусад бүх тасалдлын векторуудад 0-ээс 15 хүртэлх тэргүүлэх түвшнийг оноож болно.
Хамгийн өндөр тэргүүлэх түвшин нь бага утгатай тохирч байна. Тэргүүлэх түвшнийг зөвхөн бие даасан вектор төдийгүй бүхэл бүтэн векторын бүлэгт оноож болно. Энэ функц нь олон тооны тасалдлын векторуудтай ажиллахад хялбар болгодог.
Тэргүүлэх бүлгийг тохируулахын тулд STM32F10x SPL номын сангийн функцийг ашигладаг.

Сайн уу. Сүүлийн нийтлэлд та санаж байгаагаар бид програм хангамжийн багцыг 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 портын заалт байгаа. 6. -LD3/10 (улаан), LD4/9 (цэнхэр), LD5/8 (улбар шар), LD6/7 (ногоон). Сүүлийн бичлэгт бид LD4 LED-ийг гэрэлтүүлсэн. 7. – Хоёр товчлуур: хэрэглэгчийн USER болон RESET. 8. - Mini-B холбогчтой USB USER.

9 - USB дибаглагч/программист ST-LINK/V2. 1 0. - Микроконтроллер STM32F303VCT6. 11. — Гадаад өндөр давтамжийн генератор 8 МГц. 12. – Энд нам давтамжийн генератор байх ёстой, харамсалтай нь гагнаагүй байна. 13. – SWD – интерфейс. 14. – Гадны болон дотоод хянагчийн програмчлалыг сонгох холбогчийг эхний тохиолдолд салгах шаардлагатай. 15 – Jumper JP3 – хянагчийн зарцуулалтыг хэмжихийн тулд амперметрийг холбох зориулалттай холбогч. Устгавал манай чулуу эхлэхгүй нь ойлгомжтой. 16. – STM32F103C8T6 дээр дибаг хийх самбар байна. 17. - LD3985M33R зохицуулагч бага хүчдэлийн уналт, дуу чимээний түвшин, 150mA, 3.3V.

Одоо STM32F303VCT6 микроконтроллерийн архитектурыг нарийвчлан авч үзье. Техникийн шинж чанар: LQFP-100 хайрцаг, ARM Cortex-M4 цөм, үндсэн давтамж 72 МГц, програмын санах ойн багтаамж 256 KB, програмын санах ойн төрөл FLASH, RAM багтаамж SRAM 40 KB, RAM 8 KB, оролт/гаралтын тоо 87, интерфейс ( CAN, I²C, IrDA, LIN, SPI, UART/USART, USB), нэмэлт төхөөрөмж (DMA, I2S, POR, PWM, WDT), ADC/DAC 4*12 бит/2*12бит, тэжээлийн хүчдэл 2 ... 3.6 V, ажлын температур –40...+85 C. Доорх зурган дээр бид 87 оролт гаралтын порт, тэдгээрийн 45 нь Хэвийн оролт (TC, TTa), 42 5 вольтын тэсвэрлэх чадвартай I байна. /Os (FT, FTf) – 5 В-д нийцдэг (самбар дээр баруун талд 5V зүү, зүүн талд 3.3V байна). Тоон оролт гаралтын шугам бүр нь ерөнхий оролт/гаралтын шугам болж чаддаг.
очих газар эсвэл өөр функц. Төсөл хэрэгжихийн хэрээр бид захын бүстэй аажмаар танилцах болно.

Доорх блок диаграмыг авч үзье. Зүрх нь 72 МГц хүртэл ажилладаг 32 битийн ARM Cortex-M4 цөм юм. Энэ нь суурилагдсан хөвөгч цэгийн нэгж FPU болон санах ойн хамгаалалтын нэгж MPU, баригдсан макро мөрдөх эсүүд - Embedded Trace Macrocell (ETM), микроконтроллер доторх үндсэн програмын гүйцэтгэлийг хянахад ашиглаж болно. Тэд төхөөрөмж ажиллаж байгаа цагт эдгээр ажиглалтыг ETM контактуудаар дамжуулан тасралтгүй гаргах чадвартай. NVIC (Nested vectored interrupt controller) – тасалдлыг удирдах модуль. TPIU (Trace Port Interface Unit). FLASH санах ой - 256 KB, SRAM 40 KB, RAM 8 KB агуулсан. Цөм болон санах ойн хооронд автобусны матриц байдаг бөгөөд энэ нь төхөөрөмжүүдийг шууд холбох боломжийг олгодог. Мөн энд бид AHB ба APB гэсэн хоёр төрлийн автобусны матрицыг харж байна, эхнийх нь илүү бүтээмжтэй бөгөөд өндөр хурдны дотоод бүрэлдэхүүн хэсгүүдийг холбоход ашигладаг бол сүүлийнх нь захын төхөөрөмжүүдэд (оролт/гаралтын төхөөрөмж) ашиглагддаг. Удирдагч нь 4 12 битийн ADC (ADC) (5Mbit/s) ба температур мэдрэгч, 7 харьцуулагч (GP Comparator1...7), 4 програмчлагдах үйлдлийн өсгөгч (OpAmp1...4) (PGA (Programmable Gain Array))-тай. ), 2 12 битийн 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: Deterministic Real-Time Software Execution (Бодит цагийн програм хангамжийн тодорхой гүйцэтгэл);
— CMSIS-DSP: Дижитал дохионы боловсруулалтыг хурдан хэрэгжүүлэх;
- CMSIS-Driver: Дунд программ хангамж болон хэрэглээний кодын ерөнхий захын интерфейсүүд (дунд програм болон хэрэглээний кодын ерөнхий захын интерфейс);
— CMSIS-Pack: Дахин ашиглах боломжтой програм хангамжийн бүрэлдэхүүн хэсгүүдэд хялбар хандах (дахин ашиглах боломжтой програм хангамжийн бүрэлдэхүүн хэсгүүдэд хялбар хандах);
- CMSIS-SVD: Төхөөрөмж болон дагалдах хэрэгслийг тууштай харах;
- CMSIS-DAP: Хямд өртөгтэй үнэлгээний техник хангамжтай холбогдох боломжтой. Дибаг хийх програм хангамж.

Жишээлбэл, програм бичье - LED анивчих. Үүний тулд бидэнд бүртгэлийг тодорхойлсон баримт бичиг хэрэгтэй. Миний хувьд RM0316 Лавлах гарын авлага STM32F303xB/C/D/E, STM32F303x6/8, STM32F328x8, STM32F358xC, STM32F398xE дэвшилтэт ARM ®-д суурилсан MCU-ууд, түүнчлэн түүний хариуцах тодорхой хөлийн тодорхойлолт DS9118: ARM®-д суурилсан Cortex®-M4 32b MCU+FPU, 256KB хүртэл Flash+ 48KB SRAM, 4 ADC, 2 DAC ch., 7 comp, 4 PGA, таймер, 2.0-3.6 В.Эхлэхийн тулд бид програмын портыг цаглах болно, учир нь Анхдагч байдлаар, бүх зүйл идэвхгүй болсон бөгөөд энэ нь цахилгаан зарцуулалтыг бууруулдаг. Лавлах гарын авлагыг нээж, "Дахин тохируулах, цагийг хянах" хэсгийг хар, дараа нь RCC бүртгэлийн газрын зураг, IOPEEN-ийг идэвхжүүлэхэд ямар бүртгэл хариуцдаг болохыг харна уу.

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

#include "stm32f3xx.h " // Микроконтроллерийн толгой файл
unsigned int i;
хүчингүй болсон саатал() (
хувьд (i=0;i<500000;i++);
}
int үндсэн (хүчингүй) (
RCC->AHBENR|=(1<<21);
GPIOE->MODER|=0×10000;
байхад (1)(
саатал();
GPIOE->ODR|=0×100;
саатал();
GPIOE->ODR&=~(0×100);
} }

2). SPL(Стандарт захын номын сан)- энэ номын сан нь ST Electronics-ийн бүх процессоруудыг нэгтгэх зорилготой юм. Код зөөвөрлөх чадварыг сайжруулах зорилготой бөгөөд үндсэндээ анхлан хөгжүүлэгчдэд зориулагдсан. ST нь HAL-д нийцсэн "бага давхарга" гэж нэрлэгддэг SPL-ийг орлуулахаар ажиллаж байна. Low Layer (LL) драйверууд нь HAL-аас илүү техник хангамжид ойрхон, бараг хөнгөн жинтэй, шинжээчдэд чиглэсэн давхаргыг хангах зорилготой юм. HAL-аас гадна LL API-ууд бас байдаг. SPL дээрх ижил програмын жишээ.

#оруулна
#оруулна
#оруулна
#LED GPIO_Pin_8-г тодорхойлох
int main() (
урт би;
GPIO_InitTypeDef gpio;
// Цэнхэр LED нь E порт руу холбогдсон, 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);
// Анивчих LED
байхад (1) (
//Асаалттай
GPIO_SetBits(GPIOE, LED);
хувьд (i = 0; i< 500000; i++);
// Бүгд унтраасан
GPIO_ResetBits(GPIOE, LED);
хувьд (i = 0; i< 500000; i++);
} }

Функц бүрийг техникийн баримт бичигт тайлбарласан болно UM1581 хэрэглэгчийн гарын авлага STM32F30xx/31xx стандарт захын номын сангийн тайлбар. Энд бид шаардлагатай өгөгдөл, бүтэц, дахин тохируулах, синхрончлолын хяналтын функцийг агуулсан гурван толгой файлыг холбосон, мөн оролт/гаралтын портуудыг тохируулах боломжтой.

3). ХАЛ- (Тоног төхөөрөмжийн хандалтын түвшин, техник хангамжийн хийсвэрлэх давхарга)- Хөгжлийн өөр нэг нийтлэг номын сан. Үүний тусламжтайгаар бидний сүүлийн нийтлэлд ашигласан тохиргооны 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(void); /*Оролт/гаралтыг эхлүүлэх*/
int үндсэн (хүчингүй) (
/*Бүх дагалдах төхөөрөмжийг дахин тохируулах, Flash интерфэйс болон системийн ажиллагааг эхлүүлнэ.*/
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.HSISstate = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLSstate = RCC_PLL_NONE;
хэрэв (HAL_RCC_OscConfig (&RCC_OscInitStruct)!= HAL_OK){

}
/**CPU, AHB болон APB автобусны цагийг эхлүүлнэ */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
хэрэв (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){
_Алдаа_харьцуулагч(__FILE__, __LINE__);
}
/**Systick тасалдлын хугацааг тохируулах*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Ситикийг тохируулах */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn тасалдлын тохиргоо */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/** Зүүгүүдийг EVENT_OUT EXTI аналог оролт гаралт болгон тохируулах */
статик хүчингүй MX_GPIO_Init (хүчингүй){
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO портын цагийг идэвхжүүлэх */
__HAL_RCC_GPIOE_CLK_ENABLE();
/*GPIO пин гаралтын түвшинг тохируулах */
HAL_GPIO_WritePin (GPIOE, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11)
|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
/*GPIO зүүг тохируулах: PE8 PE9 PE10 PE11 PE12 PE13 PE14 PE15 */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed ​​= GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
хүчингүй _Алдаа_харьцуулагч(char * файл, int мөр){
байхад (1) (
} }
#ifdef_БҮРЭН_БАТЛАХ_ХЭРЭГЛЭЭ

Хүчингүй болгох_баталгаагүй (uint8_t* файл, uint32_t мөр){
}
#endif
Эндээс өмнөх жишээний нэгэн адил баримт бичигт байгаа функц бүрийн тайлбарыг харж болно UM1786 хэрэглэгчийн гарын авлага STM32F3 HAL болон бага түвшний драйверуудын тайлбар.

CMSIS-ийг ашиглах эхний сонголт нь төвөгтэй биш гэдгийг бид дүгнэж болно. Номын сан бүрийн баримт бичиг байдаг. Дараагийн төслүүдэд бид STCube тохиргооны программыг ашиглан HAL болон CMSIS-ийг ашиглах бөгөөд боломжтой бол програм хангамжийн багцгүйгээр регистрүүдийг шууд ашиглах болно. Өнөөдөр тэнд зогсоцгооё. Дараагийн өгүүллээр бид ухаалаг байшин барих үндсэн зарчмуудыг авч үзэх болно. Бүгдээрээ баяртай.