STM32 микроконтроллерлерін жылдам меңгеру. Stm32 табу арқылы сыртқы контроллерге арналған микробағдарлама - SWD ST Link бағдарламалаушысы, отладчик үшін схеманы іздеу

Бұл мақала микроконтроллерді бағдарламалауды зерттеуге арналған жоспарланған мақалалар сериясының біріншісі. Түрлі материалдарды зерделеу кезінде мен олардың барлығы дерлік бастаушыға перифериялық құрылғылармен жұмыс істеу үшін жүктеп алуды (немесе әзірлеу ортасымен бірге келетін кітапхананы пайдалануды) және оны өзінің бірінші бағдарламасын жазу үшін пайдалануды сұрайтынынан басталатынын байқадым (әдетте ЖШД жыпылықтауы).

Бұл мені қатты таң қалдырды. Егер сіз осы мақалаларға сенсеңіз, бағдарламаланатын контроллердің бағдарламалануы үшін құжаттаманы оқудың қажеті жоқ. Маған даналық үйретілді «аппараттық бағдарламалау»мүлде басқа.

Бұл мақалада «Иә, мен сынап көргім келеді!» Сөзінен шыққан жол. Жарық диодты шамның қуанышты жыпылықтауы басқа авторларға қарағанда әлдеқайда ұзағырақ болғанша. Мен кітапхана функцияларын және дайын мысалдарды пайдаланудың артында жасырылған микроконтроллерді бағдарламалау аспектілерін ашуға тырысамын.
Егер сіз микроконтроллерді бағдарламалауды мұқият зерттегіңіз келсе, бұл мақала сізге арналған. Мүмкін, бұл Arduino-мен жеткілікті түрде ойнаған және аппараттық құралдың барлық аппараттық мүмкіндіктеріне қол жеткізгісі келетіндерге де қызықты болуы мүмкін.

Микроконтроллерді таңдау

Көбісі микроконтроллерлерді AVR, PIC, 8051 немесе басқа нәрселермен үйренуді бастаған дұрыс деп айтуы мүмкін. Мәселе көп қырлы және даулы. Мен Cortex-M оқыған адамдар AVR, ARM7 және т.б. бағдарламалаған мысалдарды білемін. Мен өзім Cortex-M3-тен бастадым. Егер сіз нақты тапсырмаға тап болсаңыз, Интернетте микроконтроллерлердің әртүрлі түрлерін және олар шеше алатын тапсырмаларды салыстыратын көптеген ақпарат бар. Бұл сұрақ, мысалы, Хабреде де көтерілді.

Біз микроконтроллердің түрін анықтадық деп есептейміз. Бірақ нарық әртүрлі өндірушілердің әртүрлі модификацияларының үлкен ауқымын ұсынады. Олар көптеген параметрлерде ерекшеленеді - флэш-жад көлемінен аналогтық кірістердің санына дейін. Әрбір тапсырма үшін таңдау жеке жасалуы керек. Мұнда ешқандай жалпы ұсыныстар жоқ және болуы да мүмкін емес. Мен зерттеуді ең үлкен диапазонға ие MK өндірушілерімен бастаған жөн екенін атап өткім келеді. Содан кейін, белгілі бір тапсырма үшін МК таңдаған кезде, ұсынылған ассортименттегі бір нәрсе сізге сәйкес келуі мүмкін.

мен таңдадым STM32(бірақ менің ойымша, TexasInstruments-тен МК-мен оқуды бастаған дұрыс - құжаттама өте жақсы құрастырылған), өйткені олар ресейлік электроника жасаушылар арасында кең таралған. Егер сізде қандай да бір мәселелер немесе сұрақтар туындаса, сіз форумдарда шешімдерді оңай таба аласыз. Тағы бір плюс - өндірушінің де, үшінші тарап ұйымдарының демонстрациялық тақталарының кең таңдауы.

Сізге не оқу керек?

Өкінішке орай, МК бағдарламалауды бастау үшін тек ДК жеткіліксіз. Сізге демонстрациялық тақта мен бағдарламашыны бір жерден алу керек. Бұл еңбек нарығындағы бәсекелестікті төмендетсе де.

Мен демонстрациялық тақтаны өзім қолданамын. STM3220G-EVALжәне бағдарламашы J-Link PRO. Бірақ жаңадан бастағандар үшін бұл жеткілікті болады STM32F4 DISCOVERY, оны аз мөлшерде еш қиындықсыз сатып алуға болады.

Барлық мысалдар түзету тақтасы үшін арнайы болады STM32F4 DISCOVERY. Бұл кезеңде біз үшін бұл тақтада Cortex-M4 ядросына негізделген MCU бар екендігі маңызды емес. Біз оның мүмкіндіктері мен артықшылықтарын жақын арада Cortex-M3-тен пайдаланбаймыз. Әрі қарай не болатынын көреміз.

Егер сізде STM32F2xx/STM32F4xx негізіндегі басқа тақта болса, онымен жұмыс істеуге болады. Материалды ұсыну кезінде мен мүмкіндігінше егжей-тегжейлі сипаттауға тырысамын. Неліктенбіз мұны осылай жасаймыз, басқаша емес. Мысалдарды басқа жабдыққа тасымалдауда ешкімде қиындықтар болмайды деп үміттенемін.

Даму ортасы

Бірнеше рет айтылғандай, ARM микроконтроллерлері үшін ақылы және көп емес әзірлеу орталарының жеткілікті саны бар. Және тағы да осы мәселеге қатысты дау-дамайдан бас тартқым келеді. Мен ARM 6.60 үшін IAR Embedded Workbench пайдаланамын. Барлық мысалдар осы ортада болады. Егер сізге басқа нәрсе ұнаса (немесе ұйымыңыз пайдаланса) (Keil, Eclipse, CCS, CooCoc және т.б.), онда бұл сізге де зиян тигізбейді. Мен әзірлеу ортасына қатысты ерекшеліктерге ерекше назар аударамын.

Неліктен ақылы даму ортасы?

Мүмкін біреу менің ақылы әзірлеу ортасын пайдалануды ұсынатыныма толықтай риза болмайтын шығар, бірақ IAR-да функционалдық шектеулерсіз уақытша лицензияны немесе код өлшемі шектеуі бар шексіз лицензияны алуға болады (МК үшін 32 КБ көп). ).
Сонымен қатар, мен кейбір МК үшін тегін дамыту орталары жоқ екенін бірден атап өтемін. Өкінішке орай, бұл МК-лар кейбір салаларда алмастырылмайды.


Мен орнату процесін сипаттамаймын.

Неден бастау керек?

Жоба құру
Алдымен бос жобаны жасайық. IAR ASM, C және C++ тілдерінде жобалар жасауға мүмкіндік береді. Біз C қолданамыз.

Біздің алдымызда негізгі файлы бар бос жоба пайда болады.

Енді жобаны «біздің» MK және отладчикпен жұмыс істеуді бастау үшін конфигурациялау керек. MK STM32F4DISCOVERY тақтасында орнатылған STM32F407VG. Ол жоба сипаттарында таңдалуы керек (Жалпы опциялар-> Мақсат-> Құрылғы):

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

Осыдан кейін сіз отладчикті конфигурациялауыңыз керек. Бағдарламаны жөндеу тікелей «аппараттық құралда» жүреді. Бұл JTAG отладчик көмегімен орындалады. Мұның қалай болатыны туралы толығырақ Википедиядан біле аласыз. ST-LINK/V2 отладчик STM32F4DISCOVERY тақтасында біріктірілген. Түзеткішпен жұмыс істеу үшін мәзірден оның драйверін таңдау керек Отладчик->Орнату->Драйвер. Сондай-ақ, жөндеуді тікелей аппараттық құралда жүргізу керек екенін көрсету қажет. Мұны істеу үшін жалаушаны орнату керек Түзету құралы->Жүктеп алу->Флэш жүктеуші(лерді) пайдалану


Simulator сөзін көргендер үшін

Теориялық тұрғыдан, IAR тренажер көмегімен бағдарламаларды жөндеуге мүмкіндік береді. Бірақ оны іс жүзінде қолданғанын көрмедім.

Енді жоба жұмысқа дайын (бағдарламалау, толтыру және жөндеу).

Бірінші жобаға арналған «TZ».
Қорытындылай келе:МК және жөндеу тақтасы таңдалды, жоба дайындалды. Тапсырманы шешудің уақыты келді.

Классикадан ауытқымайық. Бірінші жоба жыпылықтайтын жарықдиодты болады. Бақытымызға орай, олар тақтада өте көп, бұл бағдарламалау тұрғысынан нені білдіреді? Сізге қажет бірінші нәрсе - демонстрациялық тақтаның схемасын зерттеу және жарық диоды қалай «іске қосылғанын» түсіну.
өндірушінің веб-сайтында қол жетімді. Бұл сипаттамада тіпті тақтадағы жарықдиодтар туралы бөлек бөлім бар - 4.4 ЖШД. Мысалы, біз қолданамыз Пайдаланушы LD3. Оны диаграммадан табамыз:

Схеманың қарапайым талдауы жарық диодты шамды «жандыру» үшін MK істікшесіне «1» қолдану керек екенін көрсетеді (бұл МК үшін 3,3 В сәйкес келеді). Өшіру осы түйреуішке «0» қою арқылы жүзеге асырылады. Диаграммада бұл түйреуіш белгіленген PD13(бұл осы құжаттағы ең маңызды ақпарат болса керек).

Нәтижесінде біз бірінші бағдарламамыз үшін «TK» жаза аламыз:
МК бағдарламасы MK PD13 істікшесінің күйін «0» күйінен «1» күйіне және адам көзіне көрінетін белгілі бір кезеңділікпен кері ауыстыруы керек (егер жарық диоды көзді жиі жыпылықтаса, маңызды ескерту) мұны ажырата алмау мүмкін).

Бағдарламалауды бастамас бұрын немесе кішкене теория
Техникалық сипаттамаларды енгізуді бастамас бұрын, МК қалай басқарылатынын түсіну керек.

Кез келген МК ядро, жады және перифериялық блоктарды қамтитындығынан бастайық. Менің ойымша, жадымен бәрі түсінікті. STM32-де MK бағдарламасы сақталатын флэш-жады бар екенін айта кетейін (жалпы бұл дұрыс мәлімдеме емес, бағдарламаны сыртқы тұрақты жадта сақтауға болады, бірақ біз оны әзірше елемейміз) және басқа деректер, соның ішінде пайдаланушы деректері. Сонымен қатар SRAM – жедел жады бар.

Ядро - бұл командалардың бір ағынын орындайтын микроконтроллердің бөлігі. Біздің МК-да негізгі түрі Cortex-M4 болып табылады. МК өзегін ДК процессорымен салыстыруға болады. Ол тек командаларды орындай алады және деректерді басқа блоктарға тасымалдай алады (бұл салыстыруда біріктірілген графикалық үдеткіштері бар процессорлар есепке алынбайды).
Сонымен қатар, МК өндірушісі ядроны дамытпайды. Ядро ARM Limited компаниясынан сатып алынады. Әртүрлі МК-лардың негізгі айырмашылығы шеткі жағында.

Перифериялық блоктар - бұл «сыртқы әлеммен» әрекеттесетін немесе МК өзегі үшін қол жетімсіз нақты функцияларды орындайтын блоктар. Қазіргі заманғы MCU (соның ішінде STM32) перифериялық блоктардың үлкен ауқымын қамтиды. Перифериялық блоктар МК аналогтық кірісінен кернеу мәнін оқудан бастап SPI шинасы арқылы сыртқы құрылғыларға деректерді жіберуге дейінгі әртүрлі мәселелерді шешуге арналған.
МК өзегінен айырмашылығы, перифериялық блоктар нұсқауларды орындамайды. Олар тек ядро ​​командаларын орындайды. Бұл жағдайда команданы орындау кезінде ядроның қатысуы талап етілмейді.

Мысал

Мысал ретінде МК-дан сыртқы құрылғыларға деректерді қабылдауға және беруге арналған UART блогын келтіруге болады. Ядро тек блокты конфигурациялап, оны жіберу үшін деректерді беруі керек. Осыдан кейін ядро ​​​​нұсқауларды орындауды жалғастыра алады. Перифериялық блок хаттамаға сәйкес деректерді беру үшін сәйкес МК шығысын басқаруға жауап береді. Перифериялық блоктың өзі беруді жүзеге асыра отырып, МК шығысын қажетті уақытта «0» немесе «1» қажетті күйге береді.

Ядроның перифериялық блокпен әрекеттесуі
МК ядросының перифериялық блокпен өзара әрекеттесуі арнайы регистрлер арқылы жүзеге асырылады (үзу механизмі және DMA арқылы өзара әрекеттесу де бар, бірақ бұл туралы келесі посттарда толығырақ). Ядро тұрғысынан бұл жай ғана белгілі бір мекенжайы бар жад бөлігі, бұл жай ғана дұрыс емес. Арнайы регистрге деректерді жазу команданы немесе деректерді перифериялық блокқа жіберуге тең. Оқу – блоктан мәліметтерді қабылдау немесе оның күйін оқу. Перифериялық блоктардың сипаттамасы және олардың арнайы регистрлері МК сипаттамасының негізгі бөлігін алады.

МАҢЫЗДЫ:Арнайы регистрге деректерді жазып, содан кейін оны оқығаннан кейін мүлдем басқа деректерді алуға болады. Мысалы, деректерді жіберу үшін UART блогына жіберу және сыртқы құрылғыдан блок қабылдаған деректерді оқу бір регистр арқылы жүзеге асырылады.

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

Есіңізде болсын C
Егер сіз Си тілінің гурусы болсаңыз, бұл бөлімді қауіпсіз өткізіп жіберуге болады. Ол, ең алдымен, ДК үшін бағдарламалауды үйреткен (немесе өздері үйренген) адамдарға арналған. Тәжірибе көрсеткендей, адамдар жиі маңызды командаларды есте сақтамайды. Мұнда мен қысқаша разрядтық операциялар және оның мекен-жайы бойынша жадпен жұмыс істеу туралы қысқаша еске саламын.

Мәліметтерді жад адресіне жазу

Перифериялық блоктың сипаттамасын оқып отырып, оның дұрыс жұмыс істеуі үшін оған 0x3B санын жазу керек екенін түсіндік делік. Арнайы тіркелім мекенжайы 0x60004012. Регистр 32 биттік.
Егер сіз мұны қалай жасау керектігін бірден білмесеңіз, дұрыс пәрменді алу үшін дәлелдеу тізбегін сипаттауға тырысамын.

0x60004012 мәні жад орнына арналған көрсеткіш мәнінен басқа ештеңе емес. Дәл осыны біздің бағдарламамызда көрсету керек, яғни Си тілінің синтаксисіне сәйкес типті түрлендіру:

(қол қойылмаған ұзын*)(0x60004012)

Сонымен, бізде элементке көрсеткіш бар. Енді осы элементке қажетті мәнді жазу керек. Бұл көрсеткішке сілтемені алып тастау арқылы орындалады. Осылайша біз дұрыс пәрменді аламыз:

*(белгісіз ұзын*)(0x60004012) = 0x3B;

1-ге ерікті биттерді орнату

Регистрдегі барлық басқа биттердің мәнін өзгертпей 0x60004012 мекенжайындағы 7 және 1 биттерін «1» мәніне орнатқыңыз келеді делік. Ол үшін екілік | операциясын қолдану керек. Мен сізге бірден дұрыс жауапты беремін:

*(unsigned long*)(0x60004012) |= 0x82;

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

Ерікті биттерді 0-ге орнату

Регистрдегі барлық басқа биттердің мәнін өзгертпей, 0x60004012 мекенжайындағы 7 және 1 биттерін «0» мәніне орнатқымыз келеді делік. Ол үшін екілік & операторын пайдалану керек. Мен сізге бірден дұрыс жауапты беремін:

*(белгісіз ұзын*)(0x60004012) &= 0xFFFFFF7D;

Немесе оның қарапайым белгісі (қосымша операция туралы алаңдамаңыз, компилятор ең аз оңтайландырумен де алдын ала бәрін есептейді):

*(unsigned long*)(0x60004012) &= (~0x82);

МК үшін бағдарламалардың кейбір мүмкіндіктері
Мұнда мен есте сақтау маңызды МК бағдарламаларының кейбір мүмкіндіктерін сипаттауға тырысамын. Бәрі анық, бірақ бәрібір.
Бағдарламаның соңы жоқ
Көптеген ДК бағдарламаларынан айырмашылығы, MK бағдарламасы ешқашан аяқталмауы керек, ЕШҚАШАН! Сіздің бағдарламаңызды аяқтағаннан кейін МК нақты не істеуі керек? Сұрақ іс жүзінде риторикалық. Сондықтан, мәңгілік циклді ұмытпағаныңызға көз жеткізуді ұмытпаңыз. Қаласаңыз, МК ұйқы режиміне қоюға болады.
Бүтін айнымалы мәндерді пайдаланыңыз
Біз Cortex-M4 ядросы бар микроконтроллерді қолданатынымызға қарамастан, аппараттық құралда өзгермелі нүкте сандары бойынша операцияларды орындаймыз, мен оларды қолданбауға кеңес беремін. Мұндай операцияларды қолдаусыз микроконтроллерде есептеу уақыты өте үлкен болады.
Динамикалық жадты бөлуден аулақ болыңыз
Бұл жай ғана кеңес. Себебі қарапайым - жады жеткіліксіз. Мен жадтың «баяу» ағып кетуі бар кітапханаларды жиі кездестірдім. Бірнеше апта тұрақты жұмыс істегеннен кейін МК қателікпен апатқа ұшыраған кезде өте жағымсыз болды. Динамикалық жадты бөлуді қолданбау үшін бағдарламаның архитектурасын алдын ала ойластырған дұрыс.
Егер сіз оны әлі де пайдаланғыңыз келсе, жад менеджерінің жұмысын мұқият зерттеңіз немесе өзіңіз жазыңыз.

Жұмысқа кірісейік!

МК бағдарламасымен жұмыс әрқашан құжаттаманы оқудан басталады. Біздің MK үшін ол өндірушінің веб-сайтында қол жетімді. Көптеген беттер бар, бірақ бәрін оқып шығыңыз Сау болыңызқажет емес. Жоғарыда айтылғандай, құжаттаманың көпшілігі перифериялық блоктардың және олардың регистрлерінің сипаттамасынан тұрады. Сондай-ақ, бұл Анықтамалық нұсқаулық бір МК үшін емес, бірнеше жолдар үшін жазылғанына назар аударғым келеді. Бұл код осы жолдардағы басқа МК-ға көшкен кезде портативті болатынын көрсетеді (әрине, сіз пайдаланып жатқан МК-да жоқ перифериялық блоктарды пайдалануға тырыспасаңыз).

Ең алдымен, сіз қандай блоктармен жұмыс істегіңіз келетінін шешуіңіз керек. Мұны істеу үшін бөлімдерді оқып шығу жеткілікті КіріспеЖәне Негізгі ерекшеліктері.

МК түйреуіштерінің күйін тікелей бақылау GPIO блогының көмегімен жүзеге асырылады. Құжаттамада көрсетілгендей, STM32 MCU құрылғысында 11 тәуелсіз GPIO блоктары болуы мүмкін. Әртүрлі перифериялық GPIO блоктары әдетте порттар деп аталады. Порттар A және K әріптерімен белгіленеді. Әрбір портта 16 түйреуішке дейін болуы мүмкін. Жоғарыда атап өткеніміздей, жарық диоды PD13 істікшесіне қосылған. Бұл бұл түйреуіш перифериялық блоктың GPIO порты D арқылы басқарылатынын білдіреді. PIN нөмірі 13.

Бұл жолы бізге басқа перифериялық блоктар қажет емес.

Перифериялық сағатты басқару
МК-ның қуат тұтынуын азайту үшін МК-ны қосқаннан кейін барлық дерлік перифериялық блоктар өшіріледі. Блок оның кірісіне тактілік сигнал беруді қолдану/тоқтату арқылы қосылады/өшіріледі. Дұрыс жұмыс істеу үшін МК тактілік сигнал контроллерін қажетті перифериялық блок тактілік сигнал қабылдайтындай конфигурациялау қажет.
Маңызды:Перифериялық құрылғы жұмыс істей алмайды бірденсағат сигналы қосылғаннан кейін. Ол «басталмайынша» бірнеше белгіні күту керек. Перифериялық кітапханаларды пайдаланатын адамдар көбінесе бұл мүмкіндік туралы білмейді.

Регистрлер перифериялық блоктардың сағатын қосу үшін жауап береді RCC XXX перифериялық сағатты қосу тіркелімі.XXX орнына AHB1, AHB2, AHB3, APB1 және APB2 шиналары болуы мүмкін. Сәйкес регистрлердің сипаттамасын мұқият зерттегеннен кейін біз GPIOD перифериялық блогының тактілігі регистрдің үшінші битінде «1» орнату арқылы қосылған деп қорытынды жасауға болады. RCC AHB1 перифериялық сағатты қосу регистрі (RCC_AHB1ENR):

Енді сіз тізілімнің мекенжайын қалай білуге ​​болатынын анықтауыңыз керек RCC_AHB1ENR.

Пікір: STM32 MK сағаттық жүйесінің сипаттамасы бөлек мақалаға лайық. Оқырмандар қаласа, мен бұл бөлімді келесі мақалалардың бірінде толығырақ қарастырамын.

Арнайы регистр адрестерін анықтау
Арнайы регистрлердің мекенжайларын анықтау бөлімді оқудан басталуы керек Жад картасыАнықтамалық нұсқаулықта. Әрбір блокқа мекенжай кеңістігінің өз бөлімі бөлінгенін көруге болады. Мысалы, RCC блогы үшін бұл 0x4002 3800 - 0x4002 3BFF бөлімі:

Регистрлік адресті алу үшін RCC блогының адрестік кеңістігінің бастапқы мәніне қосу қажет Адр. офсетқажетті тізілім. Адрестердің ығысуырегистр сипаттамасында да көрсетілген (жоғарыдағы скриншотты қараңыз).

Нәтижесінде біз тіркеу мекенжайын анықтадық RCC_AHB1ENR- 0x4002 3830.

GPIO блогы
GPIO блогын жалпы түсіну үшін мен Анықтамалық нұсқаулықтың толық бөлімін оқуды ұсынамын. Әзірге көп көңіл бөлуге болмайды Балама режим. Оны кейінге қалдырамыз.

Енді біздің міндетіміз - МК түйреуіштерінің күйін басқаруды үйрену. GPIO регистрлерінің сипаттамасына тікелей көшейік.

Жұмыс режимі
Ең алдымен, D портының 13 пинінің жұмыс режимін орнату керек Жалпы мақсаттағы шығару режимі, бұл GPIO блогы MK пин күйін басқаратынын білдіреді. МК түйреуіштерінің жұмыс режимі регистр көмегімен басқарылады GPIO порт режимінің регистрі (GPIOx_MODER) (x = A..I/J/K):

Сипаттамадан көрініп тұрғандай, бізге қажет түзетуді енгізу үшін регистрдің 26-27 битіне 01b мәнін жазу керек. GPIOx_MODER. Тіркеу мекенжайын жоғарыда сипатталған әдіспен анықтауға болады.

GPIO портының шығыс түйреуіштерінің жұмыс параметрлерін конфигурациялау
GPIO блогы порттың шығыс түйреуіштері үшін қосымша параметрлерді қолдануға мүмкіндік береді. Бұл параметрлер регистрлерде жасалады:
  • GPIO портының шығыс түрінің регистрі (GPIOx_OTYPER)- шығыс түрін push-pull немесе open-drain орнатыңыз
  • GPIO портының шығыс жылдамдығының тіркелімі (GPIOx_OSPEEDR)- шығыс жылдамдығын орнату
Біз бұл параметрлерді өзгертпейміз, өйткені біз әдепкі мәндерге өте ризамыз.
MK істікшесіне мәнді орнату
Ақырында, біз МК-ның шығыс күйін бақылау сәтіне келдік. Белгілі бір MK істікшесінде шығыс мәнін орнатудың екі әдісі бар.

Біз GPIO портының биттерін орнату/қайта орнату регистрін (GPIOx_BSRR) қолданамыз.

0-16 биттерге «0» немесе «1» жазу порт түйреуіштерінің күйінде сәйкес өзгерісті тудырады. Бір немесе бірнеше МК түйреуіштерінің шығысында белгілі бір мәнді орнату және басқаларының күйін өзгертпеу үшін жеке биттерді өзгерту операциясын қолдану қажет болады. Бұл операция кем дегенде 3 циклде орындалады. Кейбір биттерге 1-ді, ал басқаларына 0-ді жазу қажет болса, онда кем дегенде 4 тактілік цикл қажет болады. Бұл әдіс бастапқы күйі белгісіз болса, шығыс күйін оның қарама-қарсы күйіне өзгерту үшін жақсы қолданылады.

GPIO портының бит орнату/қайта орнату регистрі (GPIOx_BSRR)

Алдыңғы әдістен айырмашылығы, бұл регистрдің кез келген битіне 0 жазу ештеңеге әкелмейді (және жалпы алғанда, барлық биттер тек жазуға арналған!). 1-ді 0-15 биттеріне жазу МК-ның сәйкес шығысында «1» орнатылуына әкеледі. 16-31 биттерге 1 жазу МК сәйкес шығысында «0» орнатады. Бұл әдіс алдыңғыға қарағанда жақсырақ, егер сізге «MK» түйреуішінде оны өзгертудің орнына нақты мәнді орнату қажет болса.

Жарық диодты жарықтандырайық!
Барлық қажетті регистрлердің мекенжайларын тапқаннан кейін сіз жарық диодты шамды қосатын бағдарламаны жаза аласыз:
void main() ( //D портының сағатын қосу *(unsigned long*)(0x40023830) |= 0x8; //GPIOD үшін аз кідіріс дайын тұрақсыз қолтаңбасыз ұзақ i=0; i++; i++; i++; i=0; / /PD13 параметрін жалпы мақсаттағы шығыс ретінде орнату *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) (0x04000000 //Жарық диодты қосу *(белгісіз ұзын*); 0x40020C14) |= 0x2000 while(1);
құрастыруға болады ( Жоба->Құрастыру) және толтыру ( Жоба->Жүктеу->Белсенді қолданбаны жүктеп алу). Немесе жөндеуді іске қосыңыз ( Жоба->Жүктеу және жөндеу) және орындауды бастаңыз (F5).
Жарық диодты шам жанды!
Жыпылықтайтын жарық диоды
Жарық диодты шамның жыпылықтауы осы әрекеттер арасындағы кідіріспен кезектесіп қосу және өшіруден басқа ештеңе емес. Ең оңай жолы - қосу және өшіруді мәңгілік циклге қою және олардың арасына кідіріс енгізу.
void main() ( //D портының сағатын қосу *(unsigned long*)(0x40023830) |= 0x8; //GPIOD үшін аз кідіріс дайын тұрақсыз қолтаңбасыз ұзақ i=0; i++; i++; i++; i=0; / /PD13-ті жалпы мақсаттағы шығыс ретінде орнату *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) (0x04000000 while(1) ( //Жарық диодты қосу *(); unsigned long*)(0x40020C14) |= 0x2000; //Кідіріс (i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
1 000 000 кідіріс мәні жарық диодты шамның жыпылықтау кезеңі көзге көрінетін, бірақ тым ұзақ болмауы үшін эксперименталды түрде таңдалды.
Алгоритмді оңтайландыру
Таңдалған жарықдиодты жыпылықтау тәсілінің кемшілігі - МК өзегі уақытының көп бөлігін бос циклдарда өткізеді, бірақ ол пайдалы нәрсе жасауы мүмкін (біздің мысалда басқа тапсырмалар жоқ, бірақ олар болашақта пайда болады).

Бұған жол бермеу үшін әдетте цикл санауышы пайдаланылады, ал бағдарлама циклдердің белгілі бір санынан өткенде МК пин күйі ауысады.
void main() ( //D портының сағатын қосу *(unsigned long*)(0x40023830) |= 0x8; //GPIOD үшін аз кідіріс дайын тұрақсыз қолтаңбасыз ұзақ i=0; i++; i++; i++; i=0; / /PD13 параметрін жалпы мақсаттағы шығыс ретінде орнату *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) (0x04000000 while(1) ( i++; if(!); ) %2000000)) ( //Жарық диодты қосу *(белгісіз ұзын*)(0x40020С14) |= 0x2020; ) басқа if(!(i%1000000)) ( //Жарық диодты өшіру *(белгісіз ұзын*)(0x40020С14) & = ~0x2000 )))
Бірақ бұл жерде де цикл ішінде орындалатын командалар санының өзгеруімен, жарық диодының жыпылықтау кезеңі (немесе циклдегі басқа командалардың орындалу кезеңі) өзгереді. Бірақ бұл кезеңде біз онымен күресе алмаймыз.

Түзету туралы аздап
IAR қолданбаны тікелей аппараттық құралда жөндеуге мүмкіндік береді. Барлығы дерлік ДК қолданбасын жөндеуге ұқсайды. Қадамдық орындау, функцияны енгізу, айнымалы мәндерді қарау режимі бар (отладтау режимінде Көру->Көру->Көру1/4).

Бірақ бұған қоса, ядро ​​регистрлерінің мәндерін, перифериялық блоктардың арнайы регистрлерін (Көру->Тіркеу) және т.б. көруге болады.
MK бағдарламалауды үйрену кезінде отладчиктің мүмкіндіктерімен танысуды қатты ұсынамын.

Қорытындыда бірнеше сөз

Көптеген адамдар бағдарламада мекенжайларды қолмен жазу дұрыс емес деп айтуы мүмкін, өйткені өндіруші файлдарды регистрлер мен бит өрістерінің анықтамаларымен, перифериялық құрылғылармен жұмыс істеуге арналған кітапханалармен және әзірлеушінің өмірін жеңілдететін басқа құралдармен қамтамасыз етеді. Мен мұнымен толығымен келісемін, бірақ мен әлі де МК-ны бағдарламалаудағы алғашқы қадамдар құжаттаманы қолмен қазу, қажетті регистрлер мен разрядтық өрістерді дербес анықтау арқылы жасалуы керек деп есептеймін. Болашақта мұны пайдаланудың қажеті жоқ, бірақ сіз мұны қалай жасау керектігін білуіңіз керек.
Міне, бұл мәлімдеменің бірнеше себептері:
  • Кейде өндірушінің кітапханаларында қателер болады! Мен бірде осыған байланысты жобаның соңғы мерзімін өткізіп жібердім. Мен кристалды дәнекерлеу кезінде зақымдалған деп ойлап, чипті бірнеше рет қайта дәнекерледім (бұл бұрын болған). Мәселе арнайы тізілімнің мекен-жайы кітапханаға қате енгізілді. Бұл әдетте нарыққа енді ғана кірген MK немесе MK желілерінде болады.
  • Кейбір өндірушілердің перифериялық құрылғылармен жұмыс істеуге арналған кітапханалары перифериялық блоктардың барлық мүмкіндіктерін жүзеге асырмайды. Мен мұнымен әсіресе күнә жасадым Luminary Micro, кейінірек оларды TI сатып алды. Мен перифериялық құрылғылардың инициализациясын қолмен жазуым керек болды.
  • Көптеген адамдар мысалдарды зерделеу арқылы MK бағдарламалауды бастауға дағдыланады. Менің ойымша, сіз алдымен МК-ны жүзеге асыруға мүмкіндік беретін нәрсені шешуіңіз керек. Мұны құжатты оқу арқылы ғана түсінуге болады. Мысалдарда бірдеңе болмаса, бұл аппараттық құрал оны қолдамайды дегенді білдірмейді. Соңғы мысал - PTP STM32 аппараттық қолдауы. Әрине, сіз желіде бірдеңе таба аласыз, бірақ ол өндірушіден стандартты жиынтыққа кірмейді.
  • Кейбір өндірушілердің перифериялық блоктарының драйверлері оңтайландырылмағаны сонша, кітапхана арқылы түйреуіш күйін ауыстыру 20 сағаттық циклді алады. Бұл кейбір тапсырмалар үшін қол жетпес сән-салтанат.

Менің жазбамды оқығандардың барлығына рахмет, бұл мен күткеннен де көп шықты.
Пікірлеріңіз бен дәлелді сындарыңызды күтемін. Оқығандардың ниеті болса, мақалалар топтамасын жалғастыруға тырысамын. Мүмкін, кез-келген адамда қарастыруға тұрарлық тақырыптар туралы идеялары бар - мен оларды тыңдауға қуаныштымын.

Arduino UNO және Atmega328 дәуірінде мен микроконтроллерді алдымен Arduino жүктеушісімен басқа Arduino арқылы (Arduino ISP ретінде), содан кейін кәдімгі сериялық порт арқылы және тек Arduino негізіндегі модульдерге қолдау көрсеткеннен кейін, бағдарламашысыз толығымен басқардым. Мен үшін Nordic Semiconductor nrf51822 және nrf52832 пайда болды. Алғаш рет swd бағдарламашысының болуы өзекті болды, өйткені жалаң қытай модуліне микробағдарламаны жүктеудің басқа жолы жоқ.

Бұл саладағы іс жүзіндегі стандарт болып неміс Segger Microcontroller System компаниясының Jlink программистері табылады, олар тек тамаша өнімділік сипаттамаларымен ғана емес, сонымен қатар өте жоғары бағасымен (шамамен 500-600 доллар) танымал. Біз Segger компаниясына коммерциялық емес пайдалану үшін құрмет көрсетуіміз керек, Jlink Base-ге толығымен ұқсас EDU нұсқасы шығарылды, бірақ бұл Ресейде шамамен 3000 рубльді құрайды. Сіздің сүйікті Aliexpress қытай клондарына толы, бірақ олар басқа нәрселерді айтпағанда, салыстырмалы түрде қымбат.

Сондай-ақ ST Microelectronics-тен ST-LINK/V2 бар, алайда олардың STMicro өзі шығармайтын микроконтроллерлермен үйлесімділігі күмәнді.

Нәтижесінде менің көзім еріксіз Black Magic Probe (BMP) JTAG/SWD бағдарламашысына түсті, ол Kickstarter сайтында 10 000 долларлық мақсатқа қарсы 47 000 доллардан астам қаражат жинады.

Қара сиқырлы зонд (BMP)

  • Ашық бастапқы бағдарламашы; JTAG немесе SWD интерфейсі арқылы жұмыс істейді және толық жөндеуді қамтамасыз етеді
  • Кірістірілген GDB сервері бар (OpenOCD сияқты «орталық» бағдарламалар қажет емес)
  • ARM Cortex-M және Cortex-A ядролары бар микроконтроллерді қолдайды
  • Windows, Linux және MacOS жүйелерінде жұмыс істейді (соңғы екеуі драйверсіз жұмыс істейді)

Қытайлық Segger Jlink және ST-LINK/V2 клондарымен салыстырғанда BMP артықшылықтары мен кемшіліктері:

(+)
  • таза ар-ұждан (жалған клондар жоқ)
  • арзан (бұл туралы кейінірек)
  • JTAG және UART интерфейстері бар (әсіресе serial.print() арқылы arduino стиліндегі жөндеуге қатысты.
  • микробағдарламаның жаңа шығарылымы жағдайында кепілдендірілген жаңарту мүмкіндігі
(-)
  • Қолдау көрсетілетін «мақсаттардың» шектеулі жиынтығы (Jlink-пен салыстырғанда)
Негізінде, BMP - бұл әртүрлі аппараттық құралдарда іске қосуға болатын бағдарламалаушы бағдарламалық жасақтама. Көптеген компаниялар «ресми» BMP бағдарламашыларын шығарады, бірақ олардың құны шамамен 60 долларды құрайды, бұл бастапқы Jlink-тен арзанырақ болса да, DIY үшін әлі де қымбат.

Қалаймын!

Қара сиқырлы зондты 60 доллар төлемей алуға болады ма? Иә.

Қара сиқырлы зондты жасау үшін бізге STM32F103 MK негізіндегі модуль қажет, ол шетелдік энтузиастар арасында баспа платасындағы масканың тән түсі үшін көк таблетка деп аталды. Бұл дәстүрдің қайдан келгені белгісіз, бірақ факт сақталды: мұндай модульдердің басым көпшілігінде көк түсті баспа платасы бар және сары пластиктен жасалған түйреуіштермен жабдықталған (бұл сіз алатын «жовт-блакит» модулінің түрі). Сондай-ақ қызыл таблеткалар және тіпті қара таблеткалар бар, бірақ олардың көк таблеткалардан айырмашылығы жоқ.

4 қадамда қара магия

1-қадам – жүктеуші файлдарын және blackmagic-тің өзін жасау

cd git clone https://github.com:blacksphere/blackmagic.git CD blackmagic жасау
(қате туралы хабарлар пайда болса, make файлын кез келген редактормен ашыңыз (мен nano пайдаланамын):

Нано жасау
біз 13-ші жолды табамыз, ол келесідей болады: « CFLAGS += -Қабырға -Wextra -Қате -Wno-char-subscripts\«және жою» -Қате", бұл жол келесіге айналуы керек:" CFLAGS += -Қабырға -Wextra -Wno-char-жазбалары\", сақтау арқылы шығыңыз (ctrl-x, y) және қайта іске қосыңыз
жасау

Енді src каталогына өтіңіз:

CD src
және пәрменді енгізіңіз:

Таза және& PROBE_HOST=stlink жасаңыз
нәтижесінде src каталогында бізде 2 файл болады: blackmagic_dfu.bin және blackmagic.bin

Мұнда көптеген басқа файлдар жасалғанын ескеріңіз, бізді тек осы екеуі қызықтырады.

2-қадам – жүктеу сценарийі

cd git клоны https://github.com/jsnyder/stm32loader.git
бұрын жасалған файлдарды жаңадан жүктелген сценариймен каталогқа көшіріңіз:

Cp ~/blackmagic/src/blackmagic_dfu.bin ~/stm32loader
cp ~/blackmagic/src/blackmagic.bin ~/stm32loader

3-қадам - ​​жүктеуші микробағдарламасы

STM32 модулінің сол жағында boot0 және boot1 деп белгіленген екі сары секіргіш бар. Екі секіргіш те әдепкі күйге (0) орнатылғанда, МК жүктеушіден жүктеледі. Қазіргі уақытта бізде жүктеуші жоқ, сондықтан жоғарғы (Boot0) секіргішті 1-позицияға орнатайық (оны оңға жылжытыңыз), бұл бізге 1-қадамда жасалған жүктеуші файлын жүктеуге мүмкіндік береді.

STM32 және USB-TTL адаптерін келесі диаграммаға сәйкес қосамыз:

Біз USB-TTL адаптерін (STM32 модулімен бірге) компьютерге қосамыз, іске қосамыз
dmesgжәне адаптердің қай портқа қосылғанын қараңыз. Менің жағдайда солай болды /dev//ttyUSB0

Stm32loader каталогында болған кезде пәрменді іске қосыңыз:

Python ./stm32loader -p /dev/ttyUSB0 -e -w -v blackmagic_dfu.bin
Әрине, ttyUSB0 орнына USB-TTL адаптері қосылған портты қою керек.

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

Егер бәрі дұрыс болса, USB-TTL адаптерін ажыратыңыз, бізге ол енді қажет емес, секіргішті 0 күйіне қайтарыңыз және қара магия рәсіміне дайындалыңыз.

4-қадам - ​​Қара магия (STM32-ні BMP-ге түрлендіру)

Біз stm32 модулін кәдімгі micro-usb кабелі арқылы қосамыз. dfuutil орнату:

Sudo apt install dfuutil
және іске қосыңыз:

Sudo dfu-util -d 1d50:6018,:6017 -s 0x08002000:шығару -D ~/stm32loader/blackmagic.bin
Дайын!

Тексеру үшін USB кабелін ажыратыңыз/қосыңыз және іске қосыңыз dmesg, 2 құрылғы көрінуі керек: Blackmagic GDB және Blackmagic COM.

Қолдану жолы (myfile.hex құрастырылған файл үшін микробағдарламаның мысалы):

Windows 7 және одан төмен нұсқалары үшін жүйе драйверлерді орнатуды сұрайды, сіз оларды ала аласыз
Windows 10-де бәрі бұрынғыдай жұмыс істейді.

Құрылғы менеджерінде BMP қосылған порт нөмірін қараңыз, ол COM11 және COM12 сияқты болуы мүмкін:


Микроконтроллерге келесі схема бойынша қосыламыз:

Егер сізге сериялық порт қажет болса, қосымша қосыңыз:

Пәрмен жолынан кейін (жолда gdb отладчикке жол көрсетілген деп есептеледі):
arm-none-eabi-gdb.exe -ex "target extension-remote \\.\COM11" (порт нөмірі >=10 болса, \\.\ префиксі қажет)

Mon swdp_scan
атт 1
mon erase_mass
CD<путь к hex файлу>
myfile.hex жүктеңіз
шығу
Шындығында, бұл командалардың барлығын біреуіне «тігуге» болады, сіз осындай нәрсені аласыз
arm-none-eabi-gdb.exe -ex "target extension-remote \\.\COM11" –ex "monitor swdp_scan" -ex "att 1" -ex "mon erase_mass" -ex "cd"<путь к hex файлу>” –ex “myfile.hex жүктеу” –ex “шығу”

Жалғасы бар…

Келесі жолы біз Arduino ортасында кірістірілген Cortex M0 процессоры ядросы бар nrf51822 негізіндегі Bluetooth модулін бағдарламалау үшін BMP пайдалануды үйренеміз.

Шын мәнінде, сіз: «Дискавери болған кезде бұл маған не үшін керек» деп айта аласыз. Кейбір жағынан, иә... Бірақ. Бақшадағы бірінші тас. Мен 1 МБ параллельді жедел жадымен жұмыс істеу үшін Discovery1 жүйесінде схема құрастырдым. 40 сым. Мен жөндеуден өткіздім, жөндеуден өткіздім және басқа контроллерді жүктеп салуым керек. Йо-йо-йо менің. Барлығын бөліп алып, жыпылықтағаннан кейін қайта жинаңыз. Бақытымызға орай, Discovery4 де бар. Бірақ бірдей мәселе. Екінші тас. Discovery жалаңаш тақтасы. Әйтеуір, 60 сыммен тағы бір шедеврді мүсіндеп жүріп, бір жерден бір нәрсеге тап болдым. Мен Discover қолданбасын толығымен үздім. Мен оны анықтай бастадым. Қысқасы, қысқасы USB-ден кіріс қуатына ие болды. Құдайға, дәлірек айтсақ, ST инженеріне диодты орнатқаны үшін рахмет. Ол бәрін өз қолына алды, порт жанып кетпеді. Бәрі жақсы болар еді, бірақ диодтағы 60 жазуы маған ештеңе айтпады. Мен ST веб-сайтына кіріп, қолдау телефонының нөмірін тауып, қоңырау шалдым. Айтайын дегенім, бір диодты атау керек. Және жауап ретінде, уайымдамаңыз, маған электрондық поштаңызды беріңіз. Мен мекенжайды беремін, олар маған Discovery құжатын жібереді. Схемалар, тақталар, сипаттама. Ал, жай ғана ертегі. Мен бірден диодты таптым, оны дәнекерледім, міне, бәрі жұмыс істеді. Осы оқиғадан кейін жасаған ісімді қайталамас үшін мен С.Т.-дан программист сатып алуды жөн көрдім. Менің ойымша, мұны бәрі көрді, эмблемасы бар ақ жұмыртқа. Бірақ мен оны ешқашан сатып алған емеспін. Бағасы, бағасы қандай. Бұл бағаға сіз 3 Discovery сатып алып, бірден үш бағдарламашыға ие бола аласыз. Сәл ойланып отырып, маған жіберілген сызба есіме түсті. Онда да бар... Файлды ашып, тексердім. Хм, бірақ бірінші шарфта ST-LINK және мұрты бар, бірақ Discovery4-те не бар деп ойлаймын. Тақтаны алып, ондағы жазуды көрдім. www.st.com/stm32f4-discovery. Сонымен... Мен сілтемені, көптеген файлдарды және міне, құжаттама мен диаграммасы бар мұрағатты ұстандым. Үмітпен мен туған программисттің бетіне өтуді шештім. Иә. Енді... Сонымен олар сізге диаграмманы берді. Жалпы, мен Discovery4 схемасына қанағаттануды жөн көрдім.
Міне, ол.

Мен бұл қолжазбаны зерттеп, мұнда бір нәрсе жетіспейтінін түсіндім. Мен желіге кіріп, барлық ашық алаңдарда екі-ақ схема бар екенін көрдім. Біреуі өте түсініксіз, екіншісі тым қарапайым (қазіргі уақытта SWD). Менің ойымша, біз оларды кесіп өтуіміз керек емес. Мен отырдым, ойландым, сурет салдым, сондай керемет жасадым.

Сымдарға назар аудармаңыз. Мен секіргішті дәнекерлеген жоқпын, бірақ оны қосқышты дәнекерлеуден кейін таптым. Секіргіш қосқыштың астында болғандықтан және мен оған жете алмағандықтан, мен сымдарды дәнекерледім. Егер сіз секіргішті дәнекерлесеңіз, онда сым қажет емес. Құрастырудан кейін оны жыпылықтау керек. Ха. Бұл жерде штепсель кіреді. МК үшін микробағдарламаны қайдан алуға болады. Интернетті шолғаннан кейін мен жұмыс істемейтін, бірақ бір маңызды нәрсеге ие қандай да бір қисық микробағдарламаны таптым. Бұл микробағдарлама арқылы бағдарламашы жергілікті ST драйверіне қосылады және СТ микробағдарламасымен жаңартуға жіберіледі. Яғни, микробағдарлама жаңартылғаннан кейін, солай. Сонымен, нүктеге дейін. Егер сіз әлі тақтаны жинамаған болсаңыз, одан әрі оқудың қажеті жоқ. Дәнекерлеушілер үшін мүсініңізге қараңыз. Егер сіз жарықдиодты шамдарға қарасаңыз, қызыл түстің жанында екі түйреуішті көре аласыз. Қуатты қолданбас бұрын, оған секіргіш қою керек.

Негізгі қосқыштың оң жағында тағы үш түйреуіш бар, олар Rx, Tx және GND. Оларға COM портын қосу керек. Айтпақшы, бұл бағдарламашыда тауық пен жұмыртқа мәселесі жоқ. Оның MK бағдарламасын бағдарламалау үшін сізге тек COM порты қажет. Қайсысын қолдану сізге байланысты. Мен TTL адаптері бар физикалық құрылғыны қолдандым. Қуат негізгі қосқыштың 1 істікшесіне 3,3 В-та берілуі керек. Бағдарламалаушыны жарық диодтарын жоғары қаратып орналастырсаңыз, онда негізгі қосқышта бұл түйреуіш төменгі сол жақ бұрышта болады. Жеке мен оны USB арқылы қуаттандырмадым. Менде сыртқы қуатты қосу мүмкіндігі бар USB хабы бар, сондықтан мен оны сол арқылы қуаттандырдым. Яғни, қуат USB-ден келді, бірақ деректер түйреуіштері белсенді емес.

Қуатты қосқаннан кейін, егер бәрі қалыпты және қатесіз дәнекерленген болса, МК жыпылықтауға дайын болуы керек. Әрі қарай, біз бағдарламаны іске қосамыз, мұнда сізге қажет барлық нәрсе бар мұрағат бар. Дискінің түбірі үшін қаптаманы ашыңыз.

Келесі түймесін басыңыз. Біз МК-мен байланыс қалай жүріп жатқанын көріп отырмыз.

Барлығы тынышталғанда, «Келесі» түймесін қайтадан басыңыз.

Бұл терезеде жүктеп алатын файлды көрсету керек. Мұрағаттан STLinkV2.J16.S4 файлын таңдап, «Келесі» түймесін басыңыз. Жүктегеннен кейін терезе келесідей болады.

Енді секіргішті алып тастап, COM портын ажыратыңыз. Келесі қадам драйверді орнату болып табылады st-link_v2_usbdriver. Бұл жазу кезінде жүргізуші соңғы болып табылады. Егер көп уақыт өтсе, ST веб-сайтынан жаңарақ драйверді жүктеп алуға болады. Драйверді орнатқаннан кейін бағдарламашыны USB желісіне қосыңыз. Осы уақытқа дейін бәрі дұрыс орындалса, Windows құрылғыны көреді және оған драйверді орнатады.

Егер бәрі сәтті орнатылса, бағдарламаны іске қосыңыз ST-LinkUpgradeкөбелекпен. Терезе «қайда іздеп жүргенімді айтпаймын» деген кейіптегі апаймен бірге пайда болады. Мұны кім тауып алды деп ойлаймын. Өйткені, бұл компанияның бет-бейнесі. Мәселе бұл емес.

Құрылғыны қосу түймесін басыңыз. Егер бағдарлама бағдарламашыны көрсе және бұл орын алуы керек болса, түйме іске қосылады.

Иә >>>> түймесін басып, сәтті жаңарту туралы хабарландыру шыққанша күтіңіз.

Бар болғаны. Бағдарламашы жұмыс істейді. Тек корпустағы тесіктерді кесіп, жапсырманы басып шығару ғана қалады. Міне, мен алдым.

STM32-де MK түзету және жыпылықтау үшін өте ыңғайлы интерфейс бар - Serial Wire Debug, қысқартылған С.В.Д.. Оның ыңғайлылығы мынада жөндеу үшін тек екі ақпарат шығысын қосу керекжәне екі қуат түйреуіштері. Қосылу схемасы келесідей.

Істікшелер қосылғаннан кейін жөндеуді қосу керек С.В.Д.бағдарламалау ортасында, in КЕЙЛосылай жасалды.


Сондай-ақ С.В.Д.қорытынды бар S.W.O., оны қосудың қажеті жоқ, бірақ оны қоссаңыз (оны 10K арқылы қуат көзіне тартсаңыз), хабарларды нақты уақытта көрсете аласыз. Яғни, кодты орындау кезінде МК бізге жөндеу туралы ақпаратты жібере алады, мысалы, кодтың қай бөлімі қазіргі уақытта орындалып жатыр, терминалы бар usart сияқты нәрсе шығады.
Шығарылымда жөндеу туралы ақпаратты жіберуге рұқсат беріңіз S.W.O.Бақылау қойындысын пайдалануға болады: МК және порт жұмыс істейтін жиілікті көрсететін бақылауға рұқсат беру арқылы.


Төменде пайдаланып хабарларды көрсетуге мүмкіндік беретін мысал берілген S.W.O., арнайы терезеде терезенің өзін келесідей ашуға болады: view->Serial windows->отлад (printf) қарау құралы.
#include "stm32f10x.h" #include #define ITM_Port8(n) (*((құбылмалы қолтаңбасыз таңба *)(0xE0000000+4*n))) #анықтау ITM_Port16(n) (*((ұшқыш белгісі жоқ қысқа*)(0xE0000000+4*n))) #анықтау ITM_Port32(n) (*((тұрақты қолтаңбасыз ұзын *)(0xE0000000+4*n))) #define DEMCR (*((ұшқыш unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 structt дескриптор __FILE (; / * Мұнда қажет нәрсені қосыңыз */ ); FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) ( if (DEMCR және TRCENA) ( while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; ) return(ch); ) int main(void) ( while (1) ( printf("Stm32 printf-тен сәлем!\r\n"); ) )
Ол осылай көрінеді, оны басу арқылы суретті үлкейтуге болады.

Ең бастысы, бұл мақала неге арналған, мен қытай тілін жөндеуші ретінде қолданамын jlink, оның қосқышының түйреуіштері стандартты және оны Интернетте оңай табуға болады, бірақ бұл маған қай түйреуіштерді қайда қосу керектігін ұмытып кетуді тоқтатпайды, сондықтан мен мұнда қосқышта қандай түйреуіштердің фотосуретін қалдырамын jlikарналған С.В.Д..

Жарияланды 09.08.2016

Микроконтроллерлер STM32қуаттылығының, әртүрлі перифериялық құрылғылардың және икемділіктің арқасында барған сайын танымал бола бастады. Құны 2 доллардан аспайтын (қытайлықтардан) бюджеттік сынақ тақтасын пайдаланып оқуды бастаймыз. Бізге де керек болады ST-Linkбағдарламашы, оның құны шамамен $2,5 (қытайлықтардан). Мұндай шығындар студенттерге де, оқушыларға да қолжетімді, сондықтан мен осы бюджеттік нұсқадан бастауды ұсынамын.


Бұл микроконтроллер ең қуаттысы емес STM32, бірақ ең әлсіз де емес. Әртүрлі тақталар бар STM32, соның ішінде Ашубұл шамамен 20 доллар тұрады. Мұндай тақталарда барлығы дерлік біздің тақтадағыдай, сонымен қатар бағдарламашы. Біздің жағдайда біз бағдарламашыны бөлек қолданамыз.

STM32F103C8 микроконтроллері. Сипаттамалары

  • ARM 32-биттік Cortex-M3 ядросы
  • Максималды жиілік 72 МГц
  • Бағдарламаларға арналған 64 Кб флэш жады
  • 20 Кб SRAM жады
  • Қуат көзі 2,0 … 3,3 В
  • 2 x 12 биттік ADC (0 ... 3,6 В)
  • DMA контроллері
  • 37 5В төзімді кірістер/шығыстар
  • 4 16 биттік таймер
  • 2 күзетші таймері
  • I2C – 2 автобус
  • USART – 3 автобус
  • SPI – 2 автобус
  • USB 2.0 толық жылдамдықты интерфейс
  • RTC – кірістірілген сағат

STM32F103C8 тақтасында қол жетімді

  • Шығару порттары A0-A12, B0-B1, B3-B15, C13-C15
  • Micro-USBол арқылы сіз тақтаны қуаттай аласыз. Тақтада 3,3 В кернеу тұрақтандырғышы бар. Тақтадағы сәйкес түйреуіштерге 3,3 В немесе 5 В қуат беруге болады.
  • Түйме Қалпына келтіру
  • Екі секіргіш BOOT0Және BOOT1. арқылы жыпылықтау кезінде қолданамыз UART.
  • Екі кварц 8 МГц және 32768 Гц. Микроконтроллердің жиілік мультипликаторы бар, сондықтан 8 МГц кварцпен біз 72 МГц контроллердің максималды жиілігіне жете аламыз.
  • Екі жарықдиодты шам. PWR– қуат берілгенін білдіреді. КҚ13– шығысқа қосылған C13.
  • Бағдарламашыға арналған қосқыш ST-Link.

Сонымен, микроконтроллерді жыпылықтау арқылы бастайық. Мұны USART арқылы немесе бағдарламашы арқылы жасауға болады ST-Link.

Микробағдарлама үшін сынақ файлын жүктеп алуға болады. Бағдарлама тақтадағы жарық диоды жыпылықтайды.

Windows жүйесіне арналған USB-Uart адаптерін пайдаланатын STM32 микробағдарламасы

Жүйе жадында STM32Сонда бар Жүктеуші. Жүктеуші өндіріс сатысында және кез келген микроконтроллерде жазылады STM32интерфейс арқылы бағдарламалауға болады USART USART-USB адаптерін пайдалану. Мұндай адаптерлер көбінесе танымал микросұлбалар негізінде жасалады FT232RL. Ең алдымен, адаптерді компьютерге қосыңыз және драйверлерді орнатыңыз (қажет болса). Драйверлерді өндірушінің веб-сайтынан жүктеп алуға болады FT232RL– ftdichip.com. Драйверлерді жүктеп алу керек VCP(виртуалды байланыс порты). Драйверлерді орнатқаннан кейін компьютерде виртуалды сериялық порт пайда болуы керек.


Қосылуда RXЖәне TXсәйкес түйреуіштерге шығарады USART1микроконтроллер. RXадаптерін қосыңыз TXмикроконтроллер (A9). TXадаптерін қосыңыз RXмикроконтроллер (A10). USART-USB 3,3 В қуат шығысына ие болғандықтан, біз тақтаны одан қуатпен қамтамасыз етеміз.

Микроконтроллерді бағдарламалау режиміне қою үшін түйреуіштерді орнату керек BOOT0Және BOOT1қажетті күйге келтіріп, түймені басып қайта жүктеңіз Қалпына келтірунемесе микроконтроллердің қуатын өшіріп, қосыңыз. Ол үшін бізде секіргіштер бар. Әртүрлі комбинациялар микроконтроллерді әртүрлі режимдерге мәжбүрлейді. Бізді тек бір режим қызықтырады. Ол үшін микроконтроллер бар BOOT0логикалық және шығыс болуы керек BOOT1– логикалық нөл. Тақтада бұл секіргіштің келесі позициясы:

Түймені басқаннан кейін Қалпына келтірунемесе қуат көзін ажыратып, қосқан кезде микроконтроллер бағдарламалау режиміне өтуі керек.

Микробағдарлама бағдарламалық жасақтамасы

Егер біз USB-UART адаптерін пайдалансақ, порттың атауы осындай болады /dev/ttyUSB0

Чип туралы ақпаратты алыңыз

Нәтиже:

Біз чиптен dump.bin файлын оқимыз

sudo stm32flash -r dump.bin /dev/ttyUSB0

Чипке жазыңыз

sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

Нәтиже:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Талдау құралын пайдалану: Raw BINARY интерфейсі serial_posix: 57600 8E1 Нұсқа: 0x22 1-нұсқа: 0x00 2-нұсқа: 0x00 Құрылғы идентификаторы: 0x0410 (орташа RAM: 2B бойынша резервтік) жүктеуші) - Flash: 128KiB (сектор өлшемі: 4x1024) - Опция ЖЖҚ: 16b - Жүйелік RAM: 2KiB Жадқа жазу Жадты өшіру Жазылған және тексерілген мекенжай 0x08012900 (100,00%) Орындалды. Орындауды 0x08000000 мекенжайында бастау... орындалды.

Windows жүйесіне арналған ST-Link бағдарламашысын қолданатын STM32 микробағдарламасы

Бағдарламалаушыны пайдаланған кезде ST-Linkқорытындылар BOOT0Және BOOT1пайдаланылмайды және контроллердің қалыпты жұмысы үшін стандартты күйде болуы керек.

(Орыс тілінде кітап)

STM32 белгісі

Құрылғылар тобыӨнім түріҚұрылғы қосалқы тобыPIN саныФлэш жады өлшеміПакетТемпература диапазоны
STM32 =
ARM негізіндегі 32-биттік микроконтроллер
F = Жалпы мақсат
L = Өте төмен қуат
TS=Сенсорлы экран
W = чиптегі сымсыз жүйе
60 = мультитач резистивті
103 = өнімділік сызығы
F = 20 түйреуіш
G = 28 түйреуіш
K = 32 түйреуіш
T = 36 түйреуіш
H = 40 түйреуіш
C = 48/49 түйреуіштер
R = 64 түйреуіш
O = 90 түйреуіш
V = 100 түйреуіш
Z = 144 түйреуіш
I = 176 түйреуіш
B = 208 түйреуіш
N = 216 түйреуіш
4 = 16 Кбайт флэш жады
6 = 32 Кбайт флэш жады
8 = 64 Кбайт флэш жады
B = 128 Кбайт флэш жады
Z = 192 Кбайт флэш жады
C = 256 Кбайт флэш жады
D = 384 Кбайт флэш жады
E = 512 Кбайт флэш жады
F = 768 Кбайт флэш жады
G = 1024 Кбайт флэш жады
I = 2048 Кбайт флэш жады
H = UFBGA
N=TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Өндірістік температура диапазоны, –40…+85 °C.
7 = Өндірістік температура диапазоны, -40…+ 105 °C.
STM32Ф103 C8 Т6

Жазу/оқу қорғанысын қалай жоюға болады?

Егер сіз STM32F103 тақтасын алсаңыз, бірақ бағдарламашы оны көрмесе, бұл қытайлықтар микроконтроллердің флэш жадын қорғағанын білдіреді. «Неге?» деген сұрақ. елемей қояйық. Бұғаттауды жою үшін біз UART адаптерін қосамыз және ол арқылы бағдарламаны орындаймыз. Біз бағдарламалау үшін секіргіштерді орнаттық және кетеміз:

Мен мұны Ubuntu жүйесінен stm32flash утилитасын пайдаланып жасаймын.

1. Микроконтроллердің көрінетінін тексеріңіз:

Sudo stm32flash /dev/ttyUSB0

Сіз келесідей нәрсені алуыңыз керек:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Интерфейс serial_posix: 57600 8E1 Нұсқа: 0x22 1-нұсқа: 0x00 2-нұсқа: 0x00 Құрылғы идентификаторы: 0x0410 (Орташа тығыздық) - RAM: 2010 (орташа тығыздық) - RAMB512 бойынша резервтік: 128KiB (сектор өлшемі: 4x1024) - Опция ЖЖҚ: 16b - Жүйелік жедел жады: 2КБ

2. Оқудан қорғауды алып тастап, жазудан қорғауды алып тастаңыз:

Sudo stm3flash -k -k / dev / ttyusb0 stm32Flash: 57600 8e1 нұсқа: 0x22 опция 1: 0x00 21 нұсқа: 0x00 9. 512b жүктегішпен сақталған) - Flash: 128KiB (сектор өлшемі: 4x1024) - Опция ЖЖҚ: 16b - Жүйелік жедел жады: 2KiB Оқудан қорғалмаған жарқыл Дайын.

sudo stm3flash -uu / dev / ttyusb0 stm32Flash: 57600 8e1 нұсқа: 0x22 нұсқа: 0x00 21 нұсқа: 0x00 21 нұсқа: 0x0110 (Орташа тығыздық) - RAM: 20 ақб ( 512b жүктеушімен сақталған) - Flash: 128KiB (сектор өлшемі: 4x1024) - Опция ЖЖҚ: 16b - Жүйелік жедел жады: 2KiB Жазудан қорғайтын жарқыл Дайын.



Тақырып: