Мазмұны:

2 -БӨЛІМ - GPIO ARM ASBLEBLY - RGB - ФУНКЦИЯЛЫҚ ҚОҢЫРАУЛАР - Коммутаторлар: 6 қадам
2 -БӨЛІМ - GPIO ARM ASBLEBLY - RGB - ФУНКЦИЯЛЫҚ ҚОҢЫРАУЛАР - Коммутаторлар: 6 қадам

Бейне: 2 -БӨЛІМ - GPIO ARM ASBLEBLY - RGB - ФУНКЦИЯЛЫҚ ҚОҢЫРАУЛАР - Коммутаторлар: 6 қадам

Бейне: 2 -БӨЛІМ - GPIO ARM ASBLEBLY - RGB - ФУНКЦИЯЛЫҚ ҚОҢЫРАУЛАР - Коммутаторлар: 6 қадам
Бейне: STM32. CMSIS #2. GPIO - создаем проект с нуля в ARM KEIL на CMSIS. 2024, Қараша
Anonim
2 -БӨЛІМ - GPIO ARM ASBLEBLY - RGB - ФУНКЦИЯЛЫҚ ҚОҢЫРАУЛАР - Коммутаторлар
2 -БӨЛІМ - GPIO ARM ASBLEBLY - RGB - ФУНКЦИЯЛЫҚ ҚОҢЫРАУЛАР - Коммутаторлар

1 -бөлімде біз C / C ++ орнына құрастыруды қолдана отырып, Texas Instruments -тен MSP432 LaunchPad даму тақтасындағы бір қызыл жарықдиодты қалай қосуға болатынын білдік.

Бұл нұсқаулықта біз ұқсас нәрсені жасаймыз - сол тақтада орналасқан RGB светодиодты басқару.

Жол бойында біз кейбір светодиодтарды жағып қана қоймай, ARM құрастыру туралы білімімізді одан әрі дамытамыз деп үміттенеміз.

1 -қадам: Дәл енеміз

Шынында да, бірінші бейне бәрін көрсетеді. Қосу үшін көп емес.

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

Сонымен қатар, биттер ортогоналды түрде топтастырылған. Яғни, әрбір регистр адресінің 0 биті сол сыртқы енгізу -шығару түйініне сілтеме жасайды.

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

Бірақ бұл жағдайда, біз RGB светодиодымен айналысатындықтан, әрбір регистрлік адрес үшін үш битпен жұмыс істеуіміз керек.

Бізге бірнеше регистрлер қажет екенін нығайттық: DIR регистрі, SEL0 регистрі, SEL1 регистрі және OUTPUT регистрі. Және әр уақытта үш бит.

2 -қадам: кодты жақсарту - функцияны қосыңыз

Image
Image

Жоғарыда көрсетілген қадамда көргеніңіздей, бағдарламаның негізгі циклінде көптеген қайталанатын код болды, дәлірек айтсақ, біз светодиоды өшіргенде.

Сондықтан біз бағдарламаға функция қосуға болады. Жарықдиодты өшіруді қалаған сайын, біз бұл функцияға әлі де қоңырау шалуымыз керек, бірақ бұл кодтың бір бөлігін бір мәлімдемеге ыдыратады.

Егер біздің светодиодты өшіру коды басқа да көптеген нұсқаулармен көбірек қамтылса, бұл нақты жадты үнемдеу болар еді.

Кірістірілген бағдарламалау мен микроконтроллерлердің бір бөлігі бағдарлама өлшемі туралы көбірек біледі.

Бейне түсіндіреді.

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

3-қадам: бос емес циклды қосыңыз

Кодтың Декларация бөлімінде қалаған уақытқа твиттерді жеңілдету үшін тұрақты мәнді қосыңыз:

; нүктелі үтірден кейінгі кез келген сөздер (';') түсініктемені бастайды.

; бұл бөлімдегі код мәнге атау береді.; Сіз сондай -ақ '.equ' қолдана аласыз, бірақ олар сәл өзгеше.; '.equ' (менің ойымша) өзгерту мүмкін емес, ал '.set' сіз жасай алатындығыңызды білдіреді; қаласаңыз, кодта кейінірек 'DLYCNT' мәнін өзгертіңіз.; 'DLYCNT' кешіктірудің ішкі бағдарламасында кері санақ мәні ретінде пайдаланылады. 0x30000. DLYCNT

Жаңа кешіктіру функциясын қосыңыз:

кешіктіру:.asmfunc; «кешіктіру» кіші бағдарламасының немесе функциясының басталуы.

MOV R5, #DLYCNT; «DLYCNT» мәніне тағайындалған R5 негізгі процессор жүктеу. dlyloop; бұл кешіктіру циклінің басталуын білдіреді. Ассемблер адресті анықтайды. SUB R5, #0x1; R5 ядро процессорының ағымдағы мәнінен 1 -ді алып тастаңыз. CMP R5, #0x0; R5 ағымдағы мәнін 0 -ге салыстырыңыз. BGT dlyloop; тармақ, егер R5 мәні 0 үлкен болса, 'dlyloop' белгісіне (мекенжайына). BX LR; егер біз осында болсақ, онда R5 мәні 0. қосалқы бағдарламадан қайтару дегенді білдіреді..endasmfunc; қосалқы бағдарламаның аяқталуын белгілейді.

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

; бұл негізгі корпустың немесе негізгі функцияның код фрагменті ('main.asm' файлын қараңыз).

; бұл «негізгі» цикл және бұл жаңа «кешіктіру» функциясын қалай шақыратынымызды немесе қолданатынымызды көрсетеді.; '#REDON' және '#GRNON' де декларациялар (тұрақтылар) болып табылады ('main.asm' бетін қараңыз).; олар RGB светодиодының белгіленген түсін орнатудың қарапайым әдісі. цикл MOV R0, #REDON; Қызыл - «REDON» мәнімен тағайындалған негізгі процессор R0 орнатыңыз. STRB R0, [R4]; R4 ядро регистрі бұрын GPIO шығыс адресімен орнатылған.; R4 -те көрсетілгенді R4 -те көрсетілген адреске жазыңыз. BL кешігу; жаңа «кешіктіру» функциясына ауысу. BL ledsoff; бұрыннан бар 'ledsoff' функциясының тармағы. BL кідірісі; дәл солай MOV R0, #GRNON; Жасыл - солай STRB R0, [R4]; және тағы басқа. BL кідірісі BL ledsoff BL кідірісі

Бейне егжей -тегжейлі баяндалған.

4 -қадам: ARM архитектурасы процедурасы бойынша қоңырау шалу стандарты (AAPCS)

Мүмкін, бір нәрсені енгізуге жақсы уақыт. Бұл ассамблея тіліндегі конвенция. ARM архитектурасы үшін процедуралық шақыру стандарты ретінде де белгілі.

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

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

Негізгі регистрлер

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

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

2) Біз сілтемелер тізілімін мақсатты пайдалануымыз керек - онда ішкі бағдарлама аяқталғаннан кейін қайда оралу керектігін көрсететін мекен -жай бар.

Сіз оларды қалай қолданатынымызды көресіз.

5 -қадам: Параметрі бар функция - кірістірілген функциялар

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

Толық ақпарат алу үшін бейнені қараңыз. (ұзындығы үшін кешірім сұраймын)

6 -қадам: GPIO енгізу - қосқыштарды қосу

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

Бұл нұсқаулықта екі борттық қосқыш MSP432-ге қалай қосылғанын көрсететін суреттер бар.

Негізінде: 1 -қосқыш (SW1 немесе S1) P1.1 -ге, ал 2 -қосқыш (SW2 немесе S2) P1.4 -ке қосылған.

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

Біз осы нұсқаулықта бір қызыл жарық диодты ауыстырумен айналыстық, сондықтан коммутаторларды басқару үшін кодты қосу қажет.

Порт 1 Тіркелу мекенжай блогы

Есіңізде болсын, біз бұны алдыңғы нұсқаулықта қарастырдық, бірақ біз жаңасын қосуымыз керек:

  • Порт 1 енгізу регистрінің мекенжайы = 0x40004C00
  • Порт 1 Шығу регистрінің мекен -жайы = 0x40004C02
  • Порт 1 бағыт регистрінің мекенжайы = 0x40004C04
  • Порт 1 резисторы Тіркеу мекенжайын қосу = 0x40004C06
  • Порт 1 0 Тіркеу мекенжайы = 0x40004C0A таңдаңыз
  • 1 порт 1 таңдаңыз 1 Тіркеу мекенжайы = 0x40004C0C

Порттарды кіріс ретінде пайдаланған кезде MSP432 ішкі тартылатын немесе тартылатын резисторларды қолданған дұрыс.

Launchpad әзірлеу тақтасы екі қосқышты жерге қосқандықтан (басылған кезде LOW), бұл біз жоғары көтерілу резисторларын пайдалану керек екенін білдіреді, егер олар басылмаған болса, бізде жоғары ЖЖҚ бар.

Резисторларды жоғары / төмен тартыңыз

Бұл ауыспалы кірістерді тартылатын резисторларға байлау үшін Port 1 Register екі түрлі мекен-жайын қажет етеді.

1) Резистор қажет екенін көрсету үшін Port 1 Resistor-Enable регистрін (0x40004C06) пайдаланыңыз (екі бит үшін), 2), содан кейін резисторларды тартылатын немесе тартылатын етіп қою үшін Port 1 шығыс регистрін (0x40004C02) қолданыңыз. Біз кірістерде шығыс регистрін қолданатынымыз түсініксіз болып көрінуі мүмкін. Шығу регистрі екі мақсатқа ие.

Сонымен, басқа жолды қайталау үшін, шығыс регистрі шығысқа жоғары немесе төмен жібере алады (мысалы, бір қызыл жарықдиодты) және / немесе ол кірістер үшін тартылатын немесе төмен түсетін резисторларды орнату үшін қолданылады., БІРАҚ бұл мүмкіндік тек Резисторды қосу регистрі арқылы қосылған болса.

Жоғарыда айтылғандар үшін маңызды-кез келген шығыс битіне LOW немесе HIGH жіберу/орнату кезінде сізге бір мезгілде кіріс биттердің жоғары/төмен түсу күйін сақтау қажет болады.

(бейне түсіндіруге тырысады)

Портты енгізу битін оқу

  • GPIO функционалдығы үшін SEL0 / SEL1 орнатыңыз
  • DIR регистрін коммутатор биттері үшін кіріс ретінде, бірақ жарық диодты шығыс ретінде орнатыңыз (бір уақытта бір байтта)
  • Резисторларды қосыңыз
  • Оларды тартылатын резисторлар ретінде орнатыңыз
  • Портты оқыңыз
  • Сізге қажет биттерді бөліп алу үшін оқылған мәнді сүзгіңіз келуі мүмкін (1 және 2 ауыстырғыш)

Ұсынылған: