Съдържание:

GPIO ARM ASSEMBLY - T.I. КОМПЛЕКТ ЗА УЧЕБНА СИСТЕМА НА РОБОТИКИТЕ - ЛАБОРИРАНЕ 6: 3 стъпки
GPIO ARM ASSEMBLY - T.I. КОМПЛЕКТ ЗА УЧЕБНА СИСТЕМА НА РОБОТИКИТЕ - ЛАБОРИРАНЕ 6: 3 стъпки

Видео: GPIO ARM ASSEMBLY - T.I. КОМПЛЕКТ ЗА УЧЕБНА СИСТЕМА НА РОБОТИКИТЕ - ЛАБОРИРАНЕ 6: 3 стъпки

Видео: GPIO ARM ASSEMBLY - T.I. КОМПЛЕКТ ЗА УЧЕБНА СИСТЕМА НА РОБОТИКИТЕ - ЛАБОРИРАНЕ 6: 3 стъпки
Видео: ESP32 Turorial 1 - Introduction to SunFounder's ESP32 IoT Learnig kit Software and Arduino IDE 2024, Юли
Anonim
GPIO ARM ASSEMBLY - T. I. КОМПЛЕКТ ЗА УЧЕБНА СИСТЕМА НА РОБОТИКИТЕ - ЛАБОРАТОРИЯ 6
GPIO ARM ASSEMBLY - T. I. КОМПЛЕКТ ЗА УЧЕБНА СИСТЕМА НА РОБОТИКИТЕ - ЛАБОРАТОРИЯ 6

Здравейте, В предишна инструкция за изучаване на ARM сглобяване с помощта на Texas Instruments TI-RSLK (използва микроконтролера MSP432), известен още като Lab 3, ако правите T. I. Разбира се, прегледахме някои много основни инструкции като писане в регистър и условно циклиране. Преминахме изпълнението с помощта на Eclipse IDE.

Малките програми, които изпълнихме, не направиха нищо за взаимодействие с външния свят.

Някак скучно.

Нека се опитаме да променим това малко днес, като научим малко за входно/изходните портове, по -специално за цифровите GPIO щифтове.

Случва се така, че този MSP432 идва на платка за разработка, вече има два превключвателя с бутон, RGB LED и червен светодиод, всички те са свързани към някои GPIO портове.

Това означава, че докато се научим да настройваме и манипулираме тези щифтове чрез монтаж, можем визуално да видим тези ефекти.

Много по -интересно, отколкото просто да преминете през дебъгъра.

(Все още ще стъпваме - това ще бъде нашата функция „забавяне“):-D

Стъпка 1: Нека опитаме да пишем / четем от RAM

Преди да преминем към достъп и контрол на GPIO, трябва да направим малка крачка.

Нека започнем само с четене и запис на стандартен адрес в паметта. Знаем от предишния Instructable (вижте изображенията там), че RAM започва от 0x2000 0000, така че нека използваме този адрес.

Ще преместваме данни между основен регистър (R0) и 0x2000 0000.

Започваме с основна файлова структура или съдържание на програма за сглобяване. Моля, вижте този Instructable, за да създадете проект за сглобяване с помощта на Code Composer Studio (CCS) на TI и някои примерни проекти.

.палец

.text.align 2.global main.thumbfunc main main:.asmfunc; ---------------------------------- -----------------------------------------------; (нашият код ще отиде тук); ------------------------------------------ ---------------------------------------.endasmfunc.end

Искам да добавя нещо ново към горния раздел, ако имаше някои декларации (директиви). По -късно ще стане по -ясно.

ACONST.set 0x20000000; ще използваме това по -надолу (това е константа)

; очевидно '0x' означава това, което следва, е шестнадесетична стойност.

Така че съдържанието на началния ни файл сега изглежда така:

.палец

.text.align 2 ACONST.set 0x20000000; ще използваме това по -надолу (това е константа); очевидно '0x' означава това, което следва, е шестнадесетична стойност..global main.thumbfunc main main:.asmfunc; --------------------------------------- ------------------------------------------; (нашият код ще отиде тук); ------------------------------------------ ---------------------------------------.endasmfunc.end

Сега, когато имаме горното, нека добавим код между пунктираните редове.

Започваме с писане на RAM място. Първо ще установим модела на данни, стойност, която ще запишем в RAM. Използваме основен регистър, за да установим тази стойност или данни.

Забележка: не забравяйте, че в кода всеки ред с точка и запетая (';') означава, че всичко е коментар след тази точка и запетая.

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

; ПИСАНЕ; ------------------------------------------------ ----------------------------------------------- MOV R0, #0x55; основният регистър R0 ще съдържа данните, които искаме да запишем в RAM местоположението.; очевидно '0x' означава това, което следва, е шестнадесетична стойност.

След това нека да разгледаме изявленията, които DONT работят.

; MOV MOV не може да се използва за запис на данни в RAM място.

; MOV е само за незабавни данни в регистъра; или от един регистър в друг; т.е. MOV R1, R0.; STR трябва да използва STR.; STR R0, = АКОНСТ; Лош израз в израза ('='); STR R0, 0x20000000; Режим на незаконно адресиране за инструкции в магазина; STR R0, ПРОТИВ; Режим на незаконно адресиране за инструкции в магазина

Без да обясняваме твърде много, се опитахме да използваме този „АКОНСТ“по -горе. По същество това е резервна или постоянна, вместо да използва буквална стойност като 0x20000000.

Не успяхме да напишем, за да запишем в местоположението на RAM, използвайки горното. Нека опитаме нещо друго.

; изглежда трябва да използваме друг регистър, съдържащ местоположението на RAM в

; нареждане за съхраняване на това място на RAM MOV R1, #0x20000000; задайте местоположението на RAM (не съдържанието му, а местоположението) в R1.; очевидно '0x' означава това, което следва, е шестнадесетична стойност. STR R0, [R1]; напишете това, което е в R0 (0x55) в RAM (0x20000000), използвайки R1.; използваме друг регистър (R1), който има адрес за местоположение на RAM; за да запишете в това местоположение на RAM.

Друг начин да направите горното, но да използвате „ACONST“вместо буквалната стойност на адреса:

; нека направим горното отново, но нека използваме символ вместо буквална стойност на местоположението на RAM.

; искаме да използваме „ACONST“като резервен за 0x20000000.; все още трябва да направим '#', за да обозначим непосредствена стойност,; така (виж отгоре), трябваше да използваме директивата '.set'.; за да докажем това, нека променим модела на данните в R0. MOV R0, #0xAA; добре, готови сме да запишем в RAM, използвайки символа вместо буквалната стойност на адреса MOV R1, #ACONST STR R0, [R1]

Видеото влиза в някои по -подробни данни, както и при преминаване през четене от местоположението на паметта.

Можете също да видите прикачения източник.asm файл.

Стъпка 2: Някои основни данни за порта

Image
Image
Някои основни данни за порта
Някои основни данни за порта
Някои основни данни за порта
Някои основни данни за порта

Сега, когато имаме добра представа как да пишем / четем от RAM място, това ще ни помогне да разберем по -добре как да контролираме и използваме GPIO пина

И така, как да взаимодействаме с GPIO щифтовете? От предишния ни поглед към този микроконтролер и неговите ARM инструкции знаем как да се справим с неговите вътрешни регистри и знаем как да взаимодействаме с адресите на паметта (RAM). Но 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 (нечетни адреси)

Още не сме приключили. Имаме нужда от повече информация.

За да контролираме порт, се нуждаем от няколко адреса. Ето защо в горния списък виждаме „четни адреси“или „нечетни адреси“.

Адресни блокове на I/O регистър

Ще ни трябват други адреси, като например:

  • Порт 1 Адрес на входящия регистър = 0x40004C00
  • Порт 1 Изходен регистър адрес = 0x40004C02
  • Порт 1 Адрес регистър на посоката = 0x40004C04
  • Порт 1 Изберете 0 Адрес на регистрация = 0x40004C0A
  • Порт 1 Изберете 1 Регистрирайте адреса = 0x40004C0C

И може да имаме нужда от други.

Добре, сега знаем обхвата на адресите на GPIO регистъра за управление на единичния червен светодиод.

Много важна забележка: Всеки I/O порт на платката MSP432 LaunchPad представлява колекция от няколко (обикновено 8) пина или линии и всеки може да бъде индивидуално зададен като вход или изход.

Това означава например, че ако задавате стойности за „Адрес на регистъра на посоките на порт 1“, трябва да се интересувате кой бит (или битове) задавате или променяте на този адрес. Повече за това по -късно.

Последователност на програмиране на порт GPIO

Последното парче, от което се нуждаем, е процес или алгоритъм, който да използваме за управление на светодиода.

Еднократна инициализация:

  • Конфигурирайте P1.0 (P1SEL1REG: P1SEL0REG регистър) <--- 0x00, 0x00 за нормална GPIO функционалност.
  • Задайте бита на регистъра за посока 1 на P1DIRREG като изход или HIGH.

Цикъл:

Запишете HIGH към бит 0 от регистъра P1OUTREG, за да включите червения светодиод

  • Извикайте функция за забавяне
  • Напишете LOW до бит 0 от регистъра P1OUTREG, за да изключите червения светодиод
  • Извикайте функция за забавяне
  • Повторете цикъла

Коя входна / изходна функция (Конфигуриране на SEL0 и SEL1)

Много от щифтовете на LaunchPad имат множество приложения. Например, същият щифт може да бъде стандартен цифров GPIO или може да се използва и в UART или I2C серийни комуникации.

За да използвате конкретна функция за този щифт, трябва да изберете тази функция. Трябва да конфигурирате функцията на щифта.

По -горе има изображение за тази стъпка, което се опитва да обясни това понятие във визуална форма.

Адресите SEL0 и SEL1 образуват двойка комбинация, която действа като някакъв избор на функция / функция.

За нашите цели искаме стандартен цифров GPIO за бит 0. Това означава, че се нуждаем от бит 0 за SEL0 и SEL1 да бъдат НИСКИ.

Порт за програмиране (отново)

1. Запишете 0x00 в P1 SEL 0 Регистър (адрес 0x40004C0A). Това задава LOW за бит 0

2. Запишете 0x00 в P1 SEL 1 Регистър (адрес 0x40004C0C). Това задава LOW за бит 0, настройка за GPIO.

3. Запишете 0x01 в P1 DIR регистър (адрес 0x40004C04). Това задава HIGH за бит 0, което означава OUTPUT.

4. Включете светодиода, като напишете 0x01 към P1 OUTPUT Register (адрес 0x40004C02)

5. Направете някакво забавяне (или просто преминаване през една стъпка при отстраняване на грешки)

6. Изключете светодиода, като напишете 0x00 към P1 OUTPUT регистър (адрес 0x40004C02)

7. Направете някакво забавяне (или просто еднократно преминаване по време на отстраняване на грешки)

8. Повторете стъпки 4 до 7.

Свързаното видео за тази стъпка ни превежда през целия процес в демонстрация на живо, докато преминаваме през една стъпка и говорим през всяка инструкция за сглобяване и показваме LED действието. Моля, извинете дължината на видеото.

Стъпка 3: Хванахте ли един недостатък във видеото?

Във видеото, което преминава през целия процес на програмиране и осветяване на светодиода, имаше допълнителна стъпка в основния цикъл, която можеше да бъде преместена до еднократната инициализация.

Благодаря ви, че отделихте време да преминете през тази инструкция.

Следващият разширява това, което започнахме тук.

Препоръчано: