Дошёл до положительного результата, как мне кажется. Раз уж я тут сам с собой общаюсь, то выложу результат. Наверняка кому-нибудь эта информация станет полезной, дабы не тратить чудовищное количество времени.
Как написано в user manual на микросхему, для перевода микроконтроллера в режим пониженного энергопотребления, среди прочего, нужно выполнить
Код
USBCLKEN = 0;
На практике этого совершенно недостаточно. Оказывается, нужно сделать следующее:
1. Подать на шину AHB частоту не менее 30 MHz
2. Подать программно-аппаратный сброс на устройство USB (оказалось, что иначе после пробуждения при попытке обратиться к регистрам USB ядром последнее подвисает, и отвисает, только если на входных линиях что-то дёрнется).
3. Разрешить клок;
4. Разлочить регистры USB;
5. Подать программный сброс через регистр USBMODE;
6. Дождаться бита статуса suspend;
7. Установить бит GOSUSP в USBMODE;
8. Запретить клок.
Код
MODE1_7 = 0;
MODE0_7 = (1<<0);
SetCoreModeeMode60MHz);
USBRES = 0;
USBRES = 1;
USBCLKEN = 1;
USBLOCK = 0xAA37;
USBMODE = 0x10;
USBMODE = 0;
while ((USBINTSTAT & (1<<3)) == 0);
USBMODE = 0x20;
USBCLKEN = 0;
SetCoreMode(eMode12MHz);
Вот только тогда USB будет реально отключен. Но и это не всё. Не знаю, насколько корректно вешать подтяжки на аналоговые входы USB, но это позволяет спасти ещё примерно микроампер 200.
Спасибо всем за поддержку.
P.S. Хотелось бы всё же увидеть этот рецепт в юзер мануале на микросхему. Хотя бы в будущих редакциях.