Перейти к содержанию
    

Still Enemy

Участник
  • Постов

    66
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Still Enemy

  • Звание
    Участник
    Участник
  • День рождения 14.02.1992

Информация

  • Город
    Array
  1. stm32f746 exti

    Здравствуйте, формучане!) Вопрос такой: у меня АЦП1 запускается от внешнего прерывания EXTI11. Возможно ли на это же внешнее прерывание повесить еще и обработчик через NVIC? Внешнее прерывание происходит от одной и той же ноги PB11
  2. Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
  3. Код в студию(лучше всего usb_cdc_if.c). Я не давно разбирался именно с CDC и я уверен, что я вам могу помочь.
  4. Дайте подумать,пожалуй, нет. Сдача проекта в конце сентября, проект не больно маленький. Разбираться во всех этих вещах по новой мне удовольствия не доставит. Да и вообще, нет уверенности, что в вашем libopencm3 не будет других проблем.
  5. Я извиняюсь, что ввел вас в заблуждение. Но я pCDC заменил на pTrans(я об этом отписывался ранее)
  6. В том то и дело, что я не боюсь) Прошел я по шагам на дизасемблере эту строчку(если я вас правильно понял конешно). Пруф
  7. Кароч это дно полное. Оказывается указатель pCDC в функции CDC_Transmit_FS "уничтожается" (не знаю даже как назвать это) знаете кем? Не угадали. ОПТИМИЗАТОРОМ. На Hige - Size. Пруфф. Картинка вообще зачётная, такого оптимизирования я еще не видел. Я могу конешно посетовать на то, что я и сам гавнокодер и оптимизатор на мой гавнокод реагирует однозначным гавнодействием. Но так чтобы игнорировать банальное создание указателя и разыменование, на такое я в осадок выпал. Более того скажу, иногда оптимизировался код на столько отлично, что указатель pCDC указывал вообще на левую структуру, жаль не смог запечатлеть этот момент) Вывод: снизил оптимизацию на Medium и радуюсь. НО если кому не сложно, объясните где я накосячил с кодом, что всё пошло именно по такому пути( у меня есть конешно один вариант на этот счёт: я указатель hUsbDevice_0 не передаю в функцию аргументом, а беру его извне(он объявлен в том же хедаре как глобальный указатель, что и данная функция) и собственно из-за этого оптимизатор указатель "уничтожает")? Всё таки оптимизатором нужно считаться, хоть чуть-чуть.
  8. Ну я же не такой тупой) я посмотрел, что далее в этой же функции, после разименования указателя, идёт заполнение горемычной структуры. static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; USBD_CDC_HandleTypeDef *hcdc; if(pdev->dev_speed == USBD_SPEED_HIGH ) { /* Open EP IN */ USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_HS_IN_PACKET_SIZE); /* Open EP OUT */ USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Open EP IN */ USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_IN_PACKET_SIZE); /* Open EP OUT */ USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_OUT_PACKET_SIZE); } /* Open Command IN EP */ USBD_LL_OpenEP(pdev, CDC_CMD_EP, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); pdev->pClassData = &USBD_CDC_Handle;//USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); if(pdev->pClassData == NULL) { ret = 1; } else { hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; /* Init physical Interface components */ ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Init(); /* Init Xfer states */ hcdc->TxState =0; hcdc->RxState =0; if(pdev->dev_speed == USBD_SPEED_HIGH ) { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, CDC_DATA_FS_OUT_PACKET_SIZE); } } return ret; } А разве код(нижеприведённый) не должен спасать ситуацию? #ifndef __USB_CDC_H #define __USB_CDC_H #endif Согласен, просто сделал первое, что пришло на ум) Херога. Если при разыменование указателя всё нормально происходит, значит указатель портится в процессе выполнения проги. Это осложняет дело.
  9. STM32F105 и кривой Malloc

    В общем, писал я себе, писал прогу, а тут на тебе старый знакомый USBD_malloc. Думал раньше, что обойду его, а нет, настиг проклятый. Данная тема является продолжением Эпопеи в двух частях - Как меня задрали USB дрова от разработчиков STM. А теперь ближе к делу. Разбираясь в неполадках передачи по USB(висит в выделенном цикле, хотя в первый цикл проходит(повезло?)) в нижепоказанной функции, узрел что TxState содержит какое то невероятное число. uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) { USBD_CDC_HandleTypeDef *pCDC = (USBD_CDC_HandleTypeDef *)hUsbDevice_0->pClassData; uint16_t offset = 0; while (offset < Len) { if ((Len-offset)<TX_BUFF_SIZE) { while(pCDC->TxState); USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf + offset, Len-offset); if (USBD_CDC_TransmitPacket(hUsbDevice_0) != USBD_OK) return USBD_FAIL; while(pCDC->TxState); break; } while(pCDC->TxState); USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf + offset, TX_BUFF_SIZE); if (USBD_CDC_TransmitPacket(hUsbDevice_0) != USBD_OK) return USBD_FAIL; while(pCDC->TxState); offset+=0x40; } return USBD_OK;} Думаю, что это неправильная инициализация указателя pClassData. Скорее всего он указывает на кусок мусора. Потому что собственно он инициализируется вот так(для тех кто в танке и не стал читать ссыль на предыдущую часть Эпопеи): pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); Сам малок выглядит вот так: #define USBD_malloc (uint32_t *)USBD_static_malloc void *USBD_static_malloc(uint32_t size) { static uint8_t mem[sizeof(USBD_CDC_HandleTypeDef)]; return mem; } Как все успели заметить - это гавнокод(КО не дремлет). В связи с этим, хочу решить проблему иным способом, так чтобы работало всё. Попробовал создать статическую переменную типа структуры USBD_CDC_HandleTypeDef(на нестатическую компилятор ругается при линковке, дескать узрел где то чуть ли не сотню дубликатов этого типа там, где он и не используется даже - явный тупняк): typedef struct { uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE/4]; /* Force 32bits alignment */ uint8_t CmdOpCode; uint8_t CmdLength; uint8_t *RxBuffer; uint8_t *TxBuffer; uint32_t RxLength; uint32_t TxLength; __IO uint32_t TxState; __IO uint32_t RxState; } USBD_CDC_HandleTypeDef; static USBD_CDC_HandleTypeDef USBD_CDC_Handle; Также убрал малок: pdev->pClassData = &USBD_CDC_Handle; Работать это конешно не стало, как и предполагалось, всё тоже самое что и до замены малока. Как бы решить эту проблему, подскажите) P.s. На буржуйском форуме пишут про баги для STM32F4 Discovery. Якобы явное приведение типа указателя к void* и расширение heap поможет. Сомнительно. Но я к сожалению до понедельника не смогу удостовериться, так как прибор на работе Update И кто-нибудь сможет ответить на вопрос, почему если я создам глобальную (не статическую как показано выше) переменную типа USBD_CDC_HandleTypeDef, то вылетают такие ошибки: Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\M25P128.o" Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\main.o" Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usb_device.o" Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usbd_cdc.o" Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usbd_cdc_if.o" Error[Li006]: duplicate definitions for "USBD_CDC_Handle"; in "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\ADC.o", and "G:\Работа\FirmWare0.02\EWARM\FirmWare0.02 Configuration\Obj\usbd_conf.o" Error while running Linker что за хрень? в данных файлах нету никакого объявления USBD_CDC_Handle и уж тем более не подключены хедеры с файлами, где эта переменная объявлена.
  10. Попробовал второй вариант, всё заработало) Большое спасибо, я в принципе уже делал подобное с одним прибором, но в этот раз чего то затупил)
  11. Нет, это не то. Кто нибудь вообще пробовал передавать в МК через USB данные? МНе необходимо запрограммировать передачу, а стандартными средствами в qt не удаётся даже 30 байт впихнуть. Может это как то по другому делается?
  12. STM32F105 USB CDC receive

    Есть задача передавать из ПК в МК большой массив данных(~16 МБ). Попробовал программку Terminal - 255 байт передаётся нормально, но больше 255 байт отослать программа не даёт. В этой проге есть еще функция передавать целый файл. Ну я создал файл 32кБ для начала, отправляю этой программкой, а он мне его по байту разбил и отослал) Я думаю, это не очень корректно. Писал прогу на Qt и пробовал через консольку файл кидать(два разных действия), результат один - передача не проходит. Пользуюсь прогой USBlyzer, в ней при отправке пишется, что передача Cancelled. В Мк приходит 64 байта, остальное хз где теряется. Может кто объяснит почему так? Код, который обрабатывает прием в Мк по прерыванию: static int8_t CDC_Init_FS(void) { hUsbDevice_0 = &hUsbDeviceFS; /* USER CODE BEGIN 3 */ /* Set Application Buffers */ USBD_CDC_SetRxBuffer(hUsbDevice_0, RxBuffer); VCPInitialized = 1; return (USBD_OK); /* USER CODE END 3 */ } static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) { USBD_CDC_ReceivePacket(hUsbDevice_0); if (RxBufferOffset == 8) RxBufferOffset = 0; memcpy(UserRxBufferFS+RxBufferOffset*0x40, RxBuffer, 0x40); RxBufferOffset++; return (USBD_OK); }
  13. Прошел я по вашей ссылке: у вас же там библиотеки не подключены. Начните с малого, пропишите в вашей среде разработки директории к библиотекам, а потом уже можно будет подумать, почему не работает всё остальное) Вообще мне кажется, у вас проблема в NSS. Вашей микрухе, с которой вы связываетесь по SPI, разве не нужен Chip Select?
  14. Меня уже много времени интересует вопрос: вот у stm32f105 памяти на 4 ГБ. Причём 2 ГБ(!!!) из них не используются. Может есть способ их как то использовать на благо программера?
×
×
  • Создать...