STM32L, USB, CDC, виртуален COM порт, стартиране, бадембед

Нека се опитаме да разберем реализацията наUSB наSTM32L. БиблиотекатаST е просто ужасна. Не, работи чудесно, но е малко вероятно да се справите сUSB като използвате неговия пример. Написано е по много труден начин. Но в примера отkeil (те имат собствен пример заUSB) можете да го разберете. Тук, използвайки такъв леко преработен пример, ще се опитам да обясня (поне за себе си) как можете да внедритеUSB на микроконтролер.

Примерът прилагаCDC устройство.

USB на компютъра разпознава тип устройство, свързано към шината чрез изтегляне наDM илиDP.

  • издърпване наD- от страната на устройството - устройството казва, че еНиска скорост ;
  • издърпване доD+ от страната на устройството — устройството казва, че еПълна скорост илиВисокоскоростно (ще бъде уточнено в допълнителен диалог с хоста);
  • двата щифта без тиранти отстрани на устройството - той е изключен от шината и хостът не работи с него;

За да свържем резистора къмDP, се нуждаем от модулаSYSCFG и регистъраPMC (в допълнение, в периферните библиотеки отST във файлаstm32l1xx_syscfg.c има функцияSYSCFG_USBPuCmd, която ще ви помогне да запишете желаната стойност в този регистър - включване / изключване на изтегляне нагоре. Ще го използвам, така че трябва да бъде включен в проекта).

ИнициализацияUSB, за нашия микроконтролер ще разделим на 3 части.

  • Настройка на тактовата честота на микроконтролера и вкл. тактови периферни модули;
  • Задаване на прекъсвания отUSB;
  • Инициализация на самияUSB модул (конфигурира се чрез съответните регистри);

В самото начало трябва да настроите часовника на самия микроконтролер - за това обикновено променям самия файлsystem_stm32l1xx.c (от стандартния проектkeil заSTM32 ). По-конкретно, функциятаSetSysClock. ЗаUSB се нуждаем от 96 MHz следPLLMUL.

порт

Ако използвамеHSI 16 MHz, тогава трябва да изберем коефициента на умножение6. След това, за да синхронизирате микроконтролера отPLL, изберете коефициента на разделяне3. Тогава на изходаPLL честотата ще бъде 32 MHz. При тази честота не забравяйте да зададете пропускане на часовника при четене наFLASH (може да работи на максимална честота от 24 MHz и ако пропускането не е конфигурирано, програмата просто ще увисне).

Сега включваме тактовата честота наUSB периферни устройства иSYSCFG (за да активирате издърпващия резистор - вижте по-горе).

Сега нека да преминем към настройката на прекъсванията. В нашата програма ще използваме само вектора за прекъсванеUSB_LP_IRQHandler.

Той беше използван в примера и, честно казано, не съм работил с други прекъсващи векториUSB и не знам как да работя. ВСправочното ръководство се казва за тях:

  • USB прекъсване с нисък приоритет (USB_LP_IRQHandler) - задейства се при всичкиUSB събития (правилно предаване, USB нулиране и т.н.)
  • USB прекъсване с висок приоритет (USB_HP_IRQHandler) - задейства се само при правилно събитие за прехвърляне заизохронен и двоен буфер групово и се използва за постигане на възможно най-висок обменен курс.
  • Прекъсване на USB събуждане (USB_FS_WKUP_IRQHandler) - задействано от събуждане отРежим на спиране.

Допълнителна конфигурация ще се извърши в прекъсванеUSB_LP_IRQHandler.

При комуникация с определена крайна точка се извиква съответната функция -USB_EndPoint0,USB_EndPoint1,USB_EndPoint2,USB_EndPoint3.

Именно в нулевата крайна точка се изпълняват всички стандартниUSB заявки и заявки, специфични заCDC устройството (вир.COM -порт). При заявка на нулева точка се дава дескриптор на устройството (който трябва да бъде предварително регистриран).

Втората и третата крайна точка се извикват съответно при получаване и предаване на данни. По-точно, крайната точка постоянно се извиква за предаване с известна периодичност, просто, грубо казано, се предават нула байта (можете да погледнете в дебъгера - постоянно попадение във функциятаUSB_EndPoint3 ). И стигаме до крайната точка за приемане само когато данните от компютъра са пристигнали.

Първата крайна точка за устройствотоCDC се използва за конфигуриране на параметрите на самияCOM -порт (въпреки че не съм сигурен, вече съм забравил - разбрах го преди много време).

Проект - USB_CDC - за изтегляне (проект направен вkeil, архивиран с 7Zip). Взех драйвера заPC отST, можете да го изтеглите от сайтаST или да изтеглите - stsw-stm32102.