Очень внимательно посмотрите на функцию USB_Reset там где идёт присвоение в UDP_IER. При всём моём уважении к Keil, (2^USB_EP_NUM - 1) не может заполнить младшие USB_EP_NUM битов единичками, как то должно происходить, поскольку в языке С оператор ^ никак не является операцией возведения в степень. Надо переделать на ((1 << USB_EP_NUM) - 1) чтобы правильно выставились биты прерываний от эндпойнтов.