Мазмұны:

GPIO ARM ASTEMBLY - Т.И. РОБОТИКА ЖҮЙЕСІН ОҚЫТУ ЖИНАҒЫ - LAB 6: 3 қадам
GPIO ARM ASTEMBLY - Т.И. РОБОТИКА ЖҮЙЕСІН ОҚЫТУ ЖИНАҒЫ - LAB 6: 3 қадам

Бейне: GPIO ARM ASTEMBLY - Т.И. РОБОТИКА ЖҮЙЕСІН ОҚЫТУ ЖИНАҒЫ - LAB 6: 3 қадам

Бейне: GPIO ARM ASTEMBLY - Т.И. РОБОТИКА ЖҮЙЕСІН ОҚЫТУ ЖИНАҒЫ - LAB 6: 3 қадам
Бейне: Сборка робота-авто на Raspberry Pi Pico 2024, Қараша
Anonim
GPIO ARM Assambleyі - T. I. РОБОТИКА ЖҮЙЕСІН ОҚЫТУ ЖИНАҒЫ - ЛАБ 6
GPIO ARM Assambleyі - T. I. РОБОТИКА ЖҮЙЕСІН ОҚЫТУ ЖИНАҒЫ - ЛАБ 6

Сәлеметсіз бе, Texas Instruments TI-RSLK (MSP432 микроконтроллерін қолданады) көмегімен ARM құрастыруды үйрену туралы алдыңғы нұсқаулықта, егер сіз Т. И. Әрине, біз регистрге жазу және шартты цикл сияқты бірнеше қарапайым нұсқауларды қарастырдық. Біз Eclipse IDE көмегімен орындалу кезеңіне өттік.

Біз жасаған шағын бағдарламалар сыртқы әлеммен қарым -қатынаста ештеңе жасамады.

Жалықтыратын түрі.

Келіңіздер, кіріс/шығыс порттары туралы, атап айтқанда цифрлық GPIO түйреуіштері туралы біраз біле отырып, оны өзгертуге тырысайық.

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

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

Отладчик арқылы өтуден гөрі әлдеқайда қызықты.

(Біз әлі қадам жасаймыз - бұл біздің «кешіктіру» функциясы болады):-D

1 -қадам: RAM -ге жазуды / оқуды көрейік

GPIO -ға кіруге және басқаруға өтпес бұрын, біз кішкене қадам жасауымыз керек.

Стандартты жад адресін оқу мен жазудан бастайық. Біз алдыңғы нұсқаулықтан (суреттерді қараңыз) RAM 0x2000 0000 -ден басталатынын білеміз, сондықтан сол адресті қолданайық.

Біз деректерді негізгі регистр (R0) мен 0x2000 0000 арасында ауыстырамыз.

Біз файлдың негізгі құрылымынан немесе құрастыру бағдарламасының мазмұнынан бастаймыз. TI's Code Composer Studio (CCS) көмегімен құрастыру жобасын және кейбір үлгі жобаларды жасау үшін осы Нұсқаулыққа жүгініңіз.

.бармақ

.мәтін. теңестіру 2. ғаламдық негізгі.thumbfunc негізгі негізгі:.asmfunc; ---------------------------------- -----------------------------------------------; (біздің код осында болады); ------------------------------------------ --------------------------------------..endasmfunc. Соңы

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

ACONST.set 0x20000000; біз мұны әрі қарай қолданамыз (бұл тұрақты)

; анық, '0x' келесіде он алтылық мәнді білдіреді.

Сонымен, біздің файлдың бастапқы мазмұны келесідей:

.бармақ

.мәтін. теңестіру 2 ACONST.set 0x20000000; біз мұны әрі қарай қолданамыз (бұл тұрақты); анық, '0x' келесіде он алтылық мәнді білдіреді..global main.thumbfunc негізгі негізгі:.asmfunc; --------------------------------------- ------------------------------------------; (біздің код осында болады); ------------------------------------------ --------------------------------------..endasmfunc. Соңы

Енді жоғарыда айтылғандар бар болғандықтан, үзік сызықтардың арасына кодты қосайық.

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

Ескерту: кодта нүктелі нүкте (';') бар кез келген жол бұл нүктелі нүктеден кейінгі түсініктеме екенін білдіреді.

;-----------------------------------------------------------------------------------------------

; ЖАЗУ; ------------------------------------------------ ---------------------------------------------- MOV R0, #0x55; ядро регистрі R0 біз жедел жадыға жазғымыз келетін деректерді қамтиды.; анық, '0x' келесіде он алтылық мәнді білдіреді.

Әрі қарай, DONT жұмыс істемейтін мәлімдемелерді қарастырайық.

; MOV MOV деректерді жедел жадыға жазуға болмайды.

; MOV тек реестрге дереу мәлімет алуға арналған; немесе бір регистрден екіншісіне; яғни MOV R1, R0.; STR STR қолдануы керек.; STR R0, = ШЫҒАРУ; Өрнектегі нашар термин ('='); STR R0, 0x20000000; Дүкенге нұсқау беру үшін заңсыз адрестеу режимі; STR R0, ACONST; Дүкен нұсқаулығының заңсыз адрестеу режимі

Көп нәрсені түсіндірместен, біз жоғарыдағы «ЖАҚСЫРМАНДЫҚТЫ» қолдануға тырыстық. Негізінде, бұл 0x20000000 сияқты әріптік мәнді пайдаланудың орнына тұрақты немесе тұрақты.

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

; ЖЖҚ орналасқан басқа регистрді қолдану керек сияқты

; MOV R1, #0x20000000 жедел жадында сақтауға тапсырыс; RAM орнын (оның мазмұнын емес, орнын) R1 -ге орнатыңыз.; анық, '0x' келесіде он алтылық мәнді білдіреді. STR R0, [R1]; R1 көмегімен R0 (0x55) ішіндегілерді жедел жадқа (0x20000000) жазыңыз.; біз RAM -дің орналасу мекенжайы бар басқа регистрді (R1) қолданамыз; ЖЖҚ орналасқан жеріне жазу үшін.

Жоғарыда айтылғандардың басқа әдісі, бірақ мекен -жайдың орнына 'ACONST' пайдалану:

; жоғарыда айтылғандарды қайтадан жасайық, бірақ RAM -дің нақты мәнінің орнына символды қолданайық.

; біз «ACONST» 0x20000000 үшін қосалқы құрал ретінде қолданғымыз келеді.; біз әлі де бірден «#» таңбасын орындауымыз керек; сондықтан (жоғарыдан қараңыз), біз '.set' директивасын қолдануға мәжбүр болдық.; осыны дәлелдеу үшін R0 деректер үлгісін өзгертейік. MOV R0, #0xAA; Жарайды, біз MOV R1, #ACONST STR R0, [R1] мекен -жай мәнінің орнына символды пайдаланып жедел жадыға жазуға дайынбыз.

Бейне толығырақ егжей -тегжейлі баяндалады, сонымен қатар есте сақтау орнынан оқылады.

Қосылған.asm файлын да қарауға болады.

2 -қадам: Порт туралы кейбір негізгі ақпарат

Image
Image
Порт туралы кейбір негізгі ақпарат
Порт туралы кейбір негізгі ақпарат
Порт туралы кейбір негізгі ақпарат
Порт туралы кейбір негізгі ақпарат

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

Сонымен, GPIO түйреуіштерімен қалай әрекеттесеміз? Бұл микроконтроллер мен оның ARM нұсқауларын бұрынғы қарауымыздан біз оның ішкі регистрлерімен қалай жұмыс істеу керектігін білеміз және біз жады (ЖЖҚ) адрестерімен қалай әрекет ету керектігін білеміз. Бірақ GPIO түйреуіштері?

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

Бұл дегеніміз, біз бұл мекенжайлардың не екенін білуіміз керек.

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

Жоғарыдағы суреттегі көк шеңберлер екі қосқыш пен жарық диодты тақтадағы жазуды көрсетеді. Көк сызықтар нақты жарықдиодты көрсетеді. Бізге секіргіштерге тиісудің қажеті жоқ.

Мен біз қатысы бар порттарды төменде қалың етіп жасадым.

  • GPIO P1: 0x4000 4C00 + 0 (жұп мекенжайлар)
  • GPIO P2: 0x4000 4C00 + 1 (тақ адрестер)
  • GPIO P3: 0x4000 4C00 + 20 (жұп мекенжайлар)
  • GPIO P4: 0x4000 4C00 + 21 (тақ адрестер)
  • GPIO P5: 0x4000 4C00 + 40 (жұп мекенжайлар)
  • GPIO P6: 0x4000 4C00 + 41 (тақ адрестер)
  • GPIO P7: 0x4000 4C00 + 60 (жұп мекенжайлар)
  • GPIO P8: 0x4000 4C00 + 61 (тақ адрестер)
  • GPIO P9: 0x4000 4C00 + 80 (жұп мекенжайлар)
  • GPIO P10: 0x4000 4C00 + 81 (тақ адрестер)

Біз әлі аяқтаған жоқпыз. Бізге қосымша ақпарат қажет.

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

Енгізу -шығару мекенжай блоктарын тіркеу

Бізге басқа мекенжайлар қажет болады, мысалы:

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

Және бізге басқалар қажет болуы мүмкін.

Жарайды, енді біз бір қызыл жарықдиодты басқару үшін GPIO регистрінің адрестерінің ауқымын білеміз.

Өте маңызды ескерту: MSP432 LaunchPad тақтасындағы әрбір енгізу -шығару порты бірнеше (әдетте 8) түйреуіштер мен сызықтар жиынтығы болып табылады және олардың әрқайсысын жеке кіріс немесе шығыс ретінде орнатуға болады.

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

GPIO порт бағдарламалау реттілігі

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

Бір реттік инициализация:

  • P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 қалыпты GPIO функциясы үшін конфигурациялаңыз.
  • P1DIRREG бағытының регистрінің 1 битін шығыс немесе ЖОҒАРЫ етіп орнатыңыз.

Цикл:

Қызыл жарық диодты қосу үшін P1OUTREG регистрінің 0 битіне HIGH деп жазыңыз

  • Кешіктіру функциясын шақырыңыз
  • Қызыл жарықдиодты өшіру үшін P1OUTREG регистрінің 0 битіне LOW жазыңыз
  • Кешіктіру функциясын шақырыңыз
  • Циклды қайталау

Қандай кіріс / шығыс функциясы (SEL0 және SEL1 теңшеу)

LaunchPad тақтасындағы көптеген түйреуіштер бірнеше рет қолданылады. Мысалы, бір түйреуіш стандартты цифрлық GPIO болуы мүмкін немесе оны UART немесе I2C сериялық байланыстарында да қолдануға болады.

Бұл түйреуіш үшін кез келген нақты функцияны қолдану үшін сіз бұл функцияны таңдауыңыз керек. Сіз түйреуіш функциясын конфигурациялауыңыз керек.

Жоғарыда бұл тұжырымдаманы визуалды түрде түсіндіруге тырысатын сурет бар.

SEL0 және SEL1 адрестері қандай да бір функция / мүмкіндікті таңдау ретінде әрекет ететін жұп комбинациясын құрайды.

Біздің мақсатымыз үшін біз стандартты цифрлық GPIO 0 битін алғымыз келеді. Яғни SEL0 және SEL1 LOW төмен болуы үшін бізге 0 бит қажет.

Порт бағдарламалау кезегі (тағы да)

1. 0x00 жазыңыз P1 SEL 0 Register (мекенжай 0x40004C0A). Бұл 0 битке LOW орнатады

2. P1 SEL 1 регистріне 0x00 жазыңыз (мекен -жайы 0x40004C0C). Бұл 0 битке LOW орнатады, GPIO үшін.

3. P1 DIR Register -ге 0x01 жазыңыз (адрес 0x40004C04). Бұл 0 биттікке HIGH мәнін орнатады, яғни OUTPUT.

4. Жарықдиодты қосу үшін 0x01 P1 OUTPUT Register (0x40004C02 мекенжайы) жазыңыз.

5. Кідіртуді жасаңыз (немесе отладтау кезінде бір қадам)

6. Жарықдиодты 0x00 P1 OUTPUT Register (0x40004C02 мекенжайы) жазу арқылы өшіріңіз.

7. Кешіктіруді жасаңыз (немесе отладтау кезінде бір қадам)

8. 4-7 қадамдарды қайталаңыз.

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

3 -қадам: Сіз бейнедегі бір кемшілікті байқадыңыз ба?

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

Уақыт бөліп, осы нұсқаулықты оқығаныңыз үшін рахмет.

Келесіде біз мұнда бастағанымызды кеңейтеміз.

Ұсынылған: