Обработчикам прерываний требуется компоновка C, если используется компиляция C ++:
extern "C" void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
Без компоновки C функция USART1_IRQHandler
не заменит обработчик по умолчанию с тем же именем, но с компоновкой C, которая является бесконечной. цикл, следовательно, он «застрял в функции прерывания », что является ... просто другой функцией прерывания.
Связывание C предотвращает «искажение имени» в C ++, которое иначе приводит к тому, что символ не совпадает с именем символа слабой ссылки обработчика прерываний.