|
STM32F0xxx USB без HAL |
|
|
|
Oct 23 2016, 19:19
|
Местный
  
Группа: Свой
Сообщений: 420
Регистрация: 22-12-04
Пользователь №: 1 608

|
Цитата(AHTOXA @ Oct 23 2016, 00:36)  Спасибо! Уже нашел еще один для F072. Разбираюсь с клоками: у 070 USB совсем по другому тактируется. P.S. Похоже это то же пример, что я нашел "STM32F0x2_USB-FS-Device_Lib V1.0.0". Там 070 не предусмотрен. После нескольких часов переписывания инклудов он собрался, но не работает. Что-то я не так сделал. Ну да ладно, объем кода почти тот же как с HAL. HAL и оставлю, раз работает. Но каие же чудеса в HAL накрутили с USART! Пришлось выкинуть и заменить на несколько строчек прямой работы. Еще надо разобраться, как отправлять данные. Если позвать USBD_CDC_TransmitPacket, он будет ждать, пока хост не попросит пакет. А если за это время еще данных поступило? Скорее всего не страшно, соберу в другой буффер. Но правильнее копировать буффер по SOF.
|
|
|
|
|
Oct 24 2016, 08:20
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477

|
использую libopencm3 на stm32f072 - CDC (для основной проги) и MassStorage (для бутлоадера).
|
|
|
|
|
Oct 24 2016, 10:07
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477

|
Цитата(Сергей Борщ @ Oct 24 2016, 13:01)  Мы рады за вас. Всегда пожалуйста.
|
|
|
|
|
Oct 24 2016, 20:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Сергей Борщ @ Oct 24 2016, 13:01)  Мы рады за вас. Сергей, а какие претензии-то? libopencm3 - действительно, весьма приятная библиотека. Тот же USB написан значительно проще и понятнее, чем в обоих вариантах ST'шных библиотек. И слоёв там меньше, и профили не засунуты в сердину библиотеки. В общем, я тоже рекомендую, даже с учётом отсутствия там STM32F07x "из коробки"
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Oct 25 2016, 06:30
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477

|
Пример CDC для F072 можно подсмотреть в форке kuldeepdhaka/libopencm3-examples в ветке example/pwm/stm32f07. под stm32f0xx пришлось в паре мест слегка поправить, т.к. получал hardfault по доступу к невыравненным данным. типа такого: Код diff --git a/libopencm3/usb/usb_standard.c b/libopencm3/usb/usb_standard.c index d94ceed..da47391 100644 --- a/libopencm3/usb/usb_standard.c +++ b/libopencm3/usb/usb_standard.c @@ -130,7 +130,9 @@ static uint16_t build_config_descriptor(usbd_device *usbd_dev, } /* Fill in wTotalLength. */ - *(uint16_t *)(tmpbuf + 2) = totallen; + //*(uint16_t *)(tmpbuf + 2) = totallen; + *(tmpbuf + 2) = totallen & 0xFF; + *(tmpbuf + 3) = totallen >> 8; return total; } я так и не понял почему компилятор не обрабатывает такие ситуации сам (gcc-arm-embedded 5.4 2016q2). может кто из местных объяснит.
|
|
|
|
|
Oct 25 2016, 08:10
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(johnshadow @ Oct 25 2016, 09:30)  я так и не понял почему компилятор не обрабатывает такие ситуации сам (gcc-arm-embedded 5.4 2016q2). может кто из местных объяснит. Потому что компилятор априори верит что программист знает что делает, если есть явное указание на операцию. Зря конечно верит  . Ну а вы сами же и привели к указателю на 2ухбайтное значение, которое опять же должно быть выровнено. Кстати патч на мой вкус не очень. В таких случая лучше либо использовать memcpy (в релизе его соптимизируют в инлайн), либо код вроде такого: Код typedef struct { uint16_t value; } __attribute__((packed)) unaligned_uint16;
((unaligned_uint16*)bla_bla).value = ...; В вашем решении много битовых операций на ровном месте.
|
|
|
|
|
Oct 25 2016, 08:49
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477

|
Цитата(Сергей Борщ @ Oct 25 2016, 10:41)  Потому что не обязан. Вы же хотите, чтобы ваши программы были маленькими и быстрыми. Используете явное приведение типов - вся ответственность на вас. Я просто думал, что для cortex-m0 компилятор генерирует безопасный код в тех случаях когда адрес переменной на момент компиляции не известен. Тогда мне не ясно назначение опции -mno-unaligned-access. Ладно бы hardfault возникал при оптимизациях Os или O3, где побайтовый доступ потенциально приводил бы к раздутию кода или снижению производительности. 2Allregia: Нет, на IAR\KEil не проверял. Цитата(Kabdim @ Oct 25 2016, 11:10)  Кстати патч на мой вкус не очень. В таких случая лучше либо использовать memcpy (в релизе его соптимизируют в инлайн), либо код вроде такого: ... В вашем решении много битовых операций на ровном месте. memcpy при оптимизациях Os\O3 меня уже пару раз подводила. решение со структурой действительно потенциально быстрее, но не будет ли генерироваться ассемблерный код, который будет вылетать при невыровненном доступе?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|