Штурм на STM32, прекъсвания, събития и NVIC

Да приемем, че вашата програма има закъснение от 5 секунди и трябва да наблюдавате състоянието на някой порт за сигнал там (да предположим, че това ще бъде бутон). Докато сте във функцията за забавяне (5000), няма да се извършват никакви действия, с изключение на безполезни изчисления и няма да можете да промените състоянието на светодиода. С други думи, докато програмата завърши изпълнението на кода от функцията за забавяне и се премести на реда, от който се чете стойността Регистър на входните данни, - няма да можете да определите, че бутонът е бил натиснат, което означава, че няма да можете да обработите това натискане. Освен това можете просто да пропуснете този момент. Какво да правя, как да бъда? Има такова нещо като прекъсване. Какво е? За да обработвате събития, които се случват асинхронно по отношение на изпълнението на програмата, трябва да използвате механизма за прекъсване. Прекъсването може да се разглежда като някакво специално събитие, което изисква незабавен отговор.

могат бъдат

Всяко прекъсване се задейства от събитие, но не всяко събитие предизвиква прекъсване. Събитието е хардуерно събитие. Например таймерът е достигнал някаква стойност - това е събитие. Това събитие може да предизвика прекъсване или може да стартира някои периферни устройства, например да стартира UART, за да изпрати съобщение.

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

Софтуер (специален случай на вътрешно прекъсване) - прекъсване може да бъде извикано директно в кода на изпълнимата програма.

Всички възможни прекъсвания (или по-точно всички имена на съществуващите вектори на прекъсвания) могат да бъдат намерени във файла startup_ .s. Вече ги видяхме, когато разгледахме библиотеката CMSIS. По подразбиране всички манипулатори са гегове, които не правят „нищо“. Ако нещо причини прекъсване и манипулаторът не е описан, тогава нищо няма да се случи, камъкът просто ще заседне в прекъсването (тъй като щепселът е просто безкраен цикъл). Между другото, трябва да напишете кода, така че манипулаторът да изпълни възможно най-бързо, връщайки контрола към основната програма.