Содержание:
После конфигурации EXTI, убедитесь, что вектор прерывания корректно обрабатывается в обработчике. Для этого в файле stm32fxxx_it.c добавьте код, который будет выполняться при срабатывании события. Например, для PA0 используйте макрос EXTI0_IRQHandler и очистите флаг прерывания через EXTI_PR.
Для повышения надежности работы системы, настройте приоритеты в регистре NVIC_IPRx. Это позволит избежать конфликтов при одновременном возникновении нескольких событий. Убедитесь, что приоритеты распределены в соответствии с требованиями вашего проекта.
Проверьте правильность конфигурации с помощью отладчика или логического анализатора. Это поможет убедиться, что система корректно реагирует на внешние сигналы и не пропускает важные события.
Работа с внешними сигналами на микроконтроллере
Конфигурация регистров
Используйте регистр SYSCFG_EXTICR для связывания выбранного пина с линией внешнего события. Для порта A и пина 5 установите значение 0x0000 в соответствующем поле. Затем настройте тип реакции на событие через регистр EXTI_RTSR (по фронту) или EXTI_FTSR (по спаду). Например, для реакции на фронт установите бит 5 в EXTI_RTSR.
Обработка событий
В обработчике прерывания проверьте флаг в регистре EXTI_PR. Если бит 5 установлен, это означает, что событие произошло на пине 5. После обработки сбросьте флаг, записав 1 в соответствующий бит EXTI_PR. Это предотвратит повторный вызов обработчика.
Пример кода для обработки:
if (EXTI->PR & EXTI_PR_PR5) {
// Ваш код обработки
EXTI->PR = EXTI_PR_PR5; // Сброс флага
}
Убедитесь, что приоритет прерывания настроен через регистр NVIC_IPRx, чтобы избежать конфликтов с другими задачами.
Откройте CubeMX и выберите нужный микроконтроллер. В разделе «Pinout & Configuration» найдите требуемый пин, который будет использоваться для обработки внешних событий. Нажмите на него и выберите режим «External Interrupt Mode with Rising/Falling edge trigger detection».
Конфигурация параметров
Перейдите во вкладку «System Core» → «NVIC». Активируйте соответствующий канал обработки событий, например, EXTI0 для пина PA0. Установите приоритет и подприоритет в зависимости от требований вашей задачи. Например, для критичных задач выберите высокий приоритет (0 или 1).
Генерация кода
После завершения конфигурации нажмите «Project Manager» → «Generate Code». В сгенерированном проекте откройте файл stm32f4xx_it.c. Найдите функцию void EXTI0_IRQHandler(void) и добавьте в неё ваш код, который будет выполняться при срабатывании события. Не забудьте очистить флаг прерывания с помощью вызова __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0).
Пример кода для обработки события:
void EXTI0_IRQHandler(void) {
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) {
// Ваш код здесь
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
}
После компиляции и загрузки программы на устройство, пин будет реагировать на изменения уровня сигнала, вызывая указанную функцию.
Обработка событий на входах в коде: пример на HAL
Для работы с внешними сигналами на микроконтроллере, используйте библиотеку HAL. Сначала инициализируйте порт и настройте его на работу с внешними событиями. Например, для входа на линии PA0:
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // Режим на срабатывание по фронту
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Затем активируйте обработчик в NVIC:
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
В файле stm32f1xx_it.c добавьте логику обработки события:
void EXTI0_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_0) {
// Ваш код для реакции на событие
}
}
Убедитесь, что в проекте включены соответствующие модули HAL и правильно настроены приоритеты прерываний. Это позволит избежать пропуска событий или блокировки системы.