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

Connor

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

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

  • Посещение

Весь контент Connor


  1. Как в Java изменять состояние переменной супер класса при создании нового объекта класса наследника? К примеру есть классVehicle, который хранит количество машин numberOfVehilces, я наследую от него класс LightVehicle и каждый раз при создании объекта этого класса я хочу увеличивать numberOfVehilces на один, как это можно реализовать?
  2. stm32 SPI

    Спасибо, это действительно логично В том и проблема, что именно в такой системе как реализовано у меня, АЦП конвертируют данные, DMA записывает их в буфер, который копируется ещё в один (на отправку мастеру), по приходу флага копирование данных в этот буфер прекращается и я отправляю этот буфер мастеру, но как я уже говорил, флаг у меня приходит, срабатывает прерывания, на слэйве запускается DMA по Rx запросу, но чтобы мастер начал читать адекватные данные, когда я начинаю слать слэйву "мусор", нужно выждать что-то около 500мс, что очень плохо, потому что обновлять данные я должен несколько раз в секунду, поэтому решением этой ситуации, как мне подсказали выше, это реализовать просто обмен по DMA без всяких флагов, что я уже сделал и что гораздо проще в итоге
  3. stm32 SPI

    Всем спасибо за ответы, очень помогли :) К слову работаю я на довольно низкой частоте 500 кбод/c, но я так понимаю скорость обмена зависит от тактовой частоты мастера, а не слейва?
  4. stm32 SPI

    Получилось у меня реализовать обмен по дма между мастером и слэйвом с помощью прерывания, только у меня это танцы с конём получились, после принятия флага на чтение, приходится отключать прерывания по RXNE для слейва, чтобы слейв не ловил его, когда мастер начнёт посылать "мусор": void SPI2_IRQHandler() { SPI_FLAG = SPI_I2S_ReceiveData16(SPI2); /* Disable RXNE interrupt*/ SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE); if(SPI_FLAG == 0x0001) { DMA_Cmd(DMA1_Channel5, ENABLE); } } в общем итоге "мусор" для принятия данных от слейва мастером мне приходится посылать только через >= 1 cек, то есть между отправкой флага и отправкой "мусора" от мастера проходит секунда, что меня совсем не радует, в противном случае слейв не успевает выставить в регистр DR данные и мастер читает нули Извиняюсь, я обманул сам себя а в итоге и вас, задержка получилась около 300мс, что к слову тоже многовато конечно(
  5. stm32 SPI

    Я это осознал, другой вопрос заключается в том, что на мастере необходимо организовывать задержку перед отправкой "мусора", например, чтобы принять данные от слэйва(в котором включается дма в прерывании)?
  6. stm32 SPI

    кольцевой обмен данными я реализовывал на мастере, всё было отлично, но вот со слэйвом были проблемы, вопрос, который до сих пор "меня мучает" это возможно ли из прерывания как-то отправить сообщение от слэйва мастеру
  7. stm32 SPI

    А ещё такой вопрос, есть ли необходимость софтового управления NSS сигналом, то есть дёргать gpio перед отправкой посылки? Я так понимаю "софтовость" заключается в том, что мы можем дёргать просто не подключенную ногу, вместо хардварной NSS? Просто я до этого ничего с NSS не делал, в смысле для этой задачи его не трогал
  8. stm32 SPI

    Спасибо)
  9. stm32 SPI

    а как это можно реализовать с помощью DMA? По DMA отравплять и по DMA получать?
  10. stm32 SPI

    Есть две борды борда 1(Б1) (stm32f407vgt) и борда 2(Б2) (stm32f303vet), между которыми необходимо обеспечить связь по SPI, вот настройка SPI для Б1 и Б2: Б1 (Slave): /* SPI2 De Initialization */ SPI_I2S_DeInit(SPI2); /* SPI2 configuration */ SPI_InitTypeDef SPI2_InitStructure; SPI2_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI2_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI2_InitStructure.SPI_DataSize = SPI_DataSize_16b; SPI2_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI2_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI2_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI2_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI2_InitStructure.SPI_CRCPolynomial = 7; SPI2_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_Init(SPI2, &SPI2_InitStructure); /* FIFO threshold */ SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_HF); /* Interrupt handler priority */ NVIC_InitTypeDef NVIC_SPI2_InitStructure; NVIC_SPI2_InitStructure.NVIC_IRQChannel = SPI2_IRQn; NVIC_SPI2_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_SPI2_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_SPI2_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_SPI2_InitStructure); /* RXNE interrupt enable */ NVIC_EnableIRQ(SPI2_IRQn); SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE); /* Enable DMA Tx requests */ SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); /* Enable SPI2 */ SPI_Cmd(SPI2, ENABLE); Б2(Master): /*SPI3 configuration structure*/ SPI_InitTypeDef SPI3_InitStructure; /*Default parameters*/ SPI_StructInit(&SPI3_InitStructure); /*Configure SPI3*/ SPI3_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI3_InitStructure.SPI_Mode = SPI_Mode_Master; SPI3_InitStructure.SPI_DataSize = SPI_DataSize_16b; SPI3_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI3_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI3_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI3_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; SPI3_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI3_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI3, &SPI3_InitStructure); /*Enable SPI3*/ SPI_Cmd(SPI3, ENABLE); между ними необходимо передавать данные нижеописанным образом: 1. Б2, который мастер, шлёт 16-битный флаг SPI_FLAG (0x0001); 2. Срабатывает прерывание по RXNE в Б1, Б1 читает принятую посылку, сравнивает с нужным значением и включает DMA_Stream, который запускает передачу данных в Б2 void SPI2_IRQHandler() { SPI_FLAG = SPI_I2S_ReceiveData16(SPI2); if(SPI_FLAG == 0x0001) { DMA_Cmd(DMA1_Channel5, ENABLE); } } Частота на шине APB1, где находится SPI3 Мастера 32MГц, с baudrateprescaler = 64 частота обмена 500Кбит/c . Теперь о проблемах, SPI_FLAG слэйвом я принимаю, а вот данные отправить ни как не получается, только если напрямую в коде где-то написать SPI_I2S_SendData, т.е. из прерывания я не могу отправить данные даже таким способом. Может я неправильно понимаю работу SPI? Подскажите пожалуйста в чём может быть проблема. Лично я грешу на софтовый NSS, я так понимаю при отправке данных слэйвом мастеру, мастер не генерит SCK, может ли помочь решить проблему использование хардварного NSS? Спасибо
  11. Ладно, ребят, тему можно закрывать, всем данке шон
  12. На плате много других устройств, которые работают на более высокой частоте и расположены они очень близко, и был уже негативный опыт частотных искажений в связи с работой стм на близкой частоте
  13. Спасибо, я понимаю, но у меня даже не получается сделать задержку кратной 5 мкс или 15, и на сколько я помню разрешение у него 8бит, а это 1 градус в диапазоне от -55 до +170 что ли или около того. Мне, при решении данной задачи, стало интересно именно реализация задержки, ведь на 1МГц один клок это 1мкс, один такт, в принципе теоретически такая задержка возможна...
  14. да гуглил я гуглил!))ничего толкового не нашёл для себя, из реализации задержек в мкс в основом только DWT, а рабочий пример что я видел для one wire был на 72МГц
  15. 1-wire интерфейс на STM32F303VE

    Хочу реализовать 1 wire интерфейс для общения между stm32f303ve и температурным датчиком ds1821,но есть такая проблема, я работаю на 1Мгц (HCLK) и у меня не получается сделать точную задержку времени, что для 1wire весьма критично, ведь он завязан на таймингах. Может кто-нибудь подсказать как можно реализовать точную задержку, скажем, в 1 микросекунду и возможно ли это реализовать на stm на такой частоте ядра? Дело ещё в том, что когда мы подаём сигнал на какую-то ножку, также необходимо время пока сигнал достигнет нужный величины (Vdd, к примеру),судя по даташиту оно должно быть около 125 НАНОсекунд на частоте в 2Мгц, но как я не пытался время задержки у меня получается минимально около 50мкс с помощью DWT, что очень много, буду рад вашим мыслям и советам, спасибо
  16. Спасибо, попробую)
  17. stm32f303 использует сortex m4 :) Спасибо, посмотрю, я тоже считаю что слишком много тактов в сумме получается для таких затрат
  18. понимаете к чему я веду, мне надо укладываться в 20 мкс, это 1440 тактов для 72мгц клока, и тут получается что в одном случае я укладываюсь, а в другом нет, так чему мне верить и на что опираться?
  19. Спасибо! учту это stm32f303ve,в нём ацп можно тактировать с частотой в 72 мгц, туфут не показывает))проверял с помощью источника питания, показывает те значения, которые подаю ему на входы
  20. конкретные цифры в цикле while CCYNCT = 530, в десятичной, в обработчике CCYNCT = 27157, вот на такие порядки и отличается))в десятки раз считаю в коде и засовывал в watch отладчика) ацп у меня обрабатывает максимально 8 каналов, включаются они одновременно в режиме multimode, ацп тактируется 72МГц, такая же частота и у SYSCLK, поэтому вариант в CCYNCT=530 тактов лично мне видится более логичным, при 12 разрядном разрешении + 19 тактов ацп клока, выбранных в качестве времени сэмлирования, получаем кол-во тактов необходимое для конвертации всех каналов в ацп (12+19)*8 = 248, конечно чисто теоретически, но это ближе к 530 чем к 27157
  21. Время выполнения кода

    У меня есть АЦП, которые начинает работать одновременно по таймеру и я хочу замерить время конвертации всех выбранных каналов с помощью таймера dwt (поднимается флаг, к примеру, TC и я меряю полученный DWT->CYCCNT) но вот какое дело, если я засовываю проверку флага в бесконечный цикл (__HAL_ADC_GET_FLAG) то получается одно значение CYCCNT, а если засовываю DWT->CYCCNT в прерывание по TC то получается совсем другое значение счётчика, гораздо большее, у меня вопрос, можно ли в принципе в отладчике засовывать счётчик dwt в обработчик прерывания? Если да, то почему получаются на столько разные значения, на порядки. Спасибо
  22. STM32СubeMX и подобные

    Ну тогда нужно чётко определиться будет ли это единичный случай или у вас настолько специфические задачи, что вы не можете выбрать подходящую элементную базу, в том числе и камни, с которыми можно работать с помощью HAL
  23. STM32СubeMX и подобные

    По крайней мере никто не будет спорить что CubeMx с HAL гораздо более информативней и наглядней, чем старая SPL, что даёт преимущество не только бывалым специалистам, но и в особенности начинающим разработчикам, позволяя сэкономить кучу времени и сил, да, может он не такой гибкий как SPL, даже не так, мне на ум приходит сравнение куба с ножом, хорошим ножом, а SPL уже ближе к своего рода скальпелю, выбор того или иного исключительно зависит от ваших нужд
  24. JTAG + STM32

    Решил проблему, пропаял пины TDI, TDO + начал играть опять с pull-up/pull-down. Итоговое решение при котором stm определяется с ST-LINK и по SWD и по JTAG: 1. TMS pull-up 2. TCK pull-down 3. TDO pull-up 4. TDI без подтягивающего резистора 5. RTCK pull-down пробовал что-то отсоединять из вышеперечисленного, опять вылетала ошибка UNKNOWN MCU Все это работает для девайса STM32F303VE (CORTEX-M4) Тему можно закрывать, всем спасибо!:)
  25. JTAG + STM32

    Спасибо за поздравления, не знаю как в J-LINK, что я использовал, но аппаратная поддержка usb 2.0 в ST-LINK присутствует точно Ну да, так и есть, это земляной пин, на схеме подключение его к земле не показано, надо будет проверить, спасибо :)
×
×
  • Создать...