
STM32: Generator for a lightweight DIO driver.
Преди няколко дни стигнах до писането по GPIO-та, а това при мен винаги е свързано с рутиране/пин мапинг. Което си е една досадна дейност. От мързел ми светна, че тая работа може да става и автоматично, затова сглобих едно малко програмче за тая цел.
Идеята: Абстракция на физическите пинове.
Как работи?
1.0. Тръгваме от вече готова пин конфигурация, правена с тула на ST - MicroXplorer (*.ioc). Там се дефинира кой пин като какъв ще играе - периферия, GPIO и т.н.
1.1. Създаваме си нова DIO конфигурация в нашето тулче (от файл менюто).
1.2. MicroXplorer-ската IOC конфигурация се импортва в генератора (от файл менюто-> импорт). В долните два групбокса излизат наличните портове и пинове (но само тези, които са конфигурирани като GPIO в *.ioc файла!).
1.3. Създаваме логичеки порт(ове) (от дървото в ляво, с контекстното меню).
1.4. Има 2 основни типа логически портове: входни и изходни. Това се настройва от пропърти грида.
1.5. От десния групбокс избираме пинове и влачим в порта. Ако порта е входен, всички дропнати OUTPUT пинове ще бъдат отсвирени и обратно.
1.6. Повтаряме действията от т.3 докато е необходимо.
1.7. Пиновете в даден логически порт могат да се местят. (Също и портовете.)
1.8. Настройват се дебаунс времена и активно ниво (за входните пинове)
1.9. Проверяваме дали конфигурацията е ОК от менюто Action.
1.10. Сейвваме конфигурацията като *.dio. Импортнатата информация от *.ioc файла се запазва в *.dio-то, така че при следващо отваряне импорт не е необходим. (Освен ако няма промяна в GPIO пиновете.)
Опции:
1.11 Използваните от тула типове могат да се настроят на вкус ( във втория таб ). Те също влизат в *.dio конфига.
1.12 Могат да се включат и допълнителни хедъри в сорса. Това става от главния нод -> Headers. Кавичките или скобите трябва да присъстват също.
Резултата?
2.1. Два файла: DIO_Drv.с и DIO_Drv.h.
2.2. За всеки дефиниран изходен порт, във файловете трябва да има по една Get и Set функции и комплект маски за съдържащите се вътре логически пинове.
2.3. За входните портове се генерират само Get функции и маски.
2.4. Не се разчита на стандартната библиотека на СТ. Нужен е единствено файла с дефинициите на регистрите.
2.5. Писането в изходите се прави чрез BSRR регистрите, уж да е atomic

2.6. Четенето е през IDR и ODR регистрите.
Ограниченията:
3.1 Общия брой дебаунсвани пинове (сумарно за всички дефинирани групи) не може да надвишава 32.
Използване:
4.0 Доколкото знам, регистрите, които се използват от драйвера са едни и същи при всички линии STM32 , така че би трябвало да върви навсякъде.
4.1 DIO_Init() се вика еднократно след като вече GPIO-тата са инициализирани. Аз лично инициализирам целия хардуер накуп, затова не съм мислил GPIO-тата да се инициализират от тула.
4.2 Дебаунсването се прави в DIO_Task(), затова трябва да се вика циклично. Времето се настройва в главния нод на *.dio конфигурацията.
Системни изисквания: .NET 4.0.
Disclaimer: Позлвате на своя отговорност.
