Connor
Участник-
Постов
43 -
Зарегистрирован
-
Посещение
Весь контент Connor
-
Изменение переменной супер класса Java
Connor опубликовал тема в Программирование
Как в Java изменять состояние переменной супер класса при создании нового объекта класса наследника? К примеру есть классVehicle, который хранит количество машин numberOfVehilces, я наследую от него класс LightVehicle и каждый раз при создании объекта этого класса я хочу увеличивать numberOfVehilces на один, как это можно реализовать? -
Спасибо, это действительно логично В том и проблема, что именно в такой системе как реализовано у меня, АЦП конвертируют данные, DMA записывает их в буфер, который копируется ещё в один (на отправку мастеру), по приходу флага копирование данных в этот буфер прекращается и я отправляю этот буфер мастеру, но как я уже говорил, флаг у меня приходит, срабатывает прерывания, на слэйве запускается DMA по Rx запросу, но чтобы мастер начал читать адекватные данные, когда я начинаю слать слэйву "мусор", нужно выждать что-то около 500мс, что очень плохо, потому что обновлять данные я должен несколько раз в секунду, поэтому решением этой ситуации, как мне подсказали выше, это реализовать просто обмен по DMA без всяких флагов, что я уже сделал и что гораздо проще в итоге
-
Получилось у меня реализовать обмен по дма между мастером и слэйвом с помощью прерывания, только у меня это танцы с конём получились, после принятия флага на чтение, приходится отключать прерывания по 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мс, что к слову тоже многовато конечно(
-
А ещё такой вопрос, есть ли необходимость софтового управления NSS сигналом, то есть дёргать gpio перед отправкой посылки? Я так понимаю "софтовость" заключается в том, что мы можем дёргать просто не подключенную ногу, вместо хардварной NSS? Просто я до этого ничего с NSS не делал, в смысле для этой задачи его не трогал
-
Есть две борды борда 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? Спасибо
-
Ладно, ребят, тему можно закрывать, всем данке шон
-
На плате много других устройств, которые работают на более высокой частоте и расположены они очень близко, и был уже негативный опыт частотных искажений в связи с работой стм на близкой частоте
-
Спасибо, я понимаю, но у меня даже не получается сделать задержку кратной 5 мкс или 15, и на сколько я помню разрешение у него 8бит, а это 1 градус в диапазоне от -55 до +170 что ли или около того. Мне, при решении данной задачи, стало интересно именно реализация задержки, ведь на 1МГц один клок это 1мкс, один такт, в принципе теоретически такая задержка возможна...
-
да гуглил я гуглил!))ничего толкового не нашёл для себя, из реализации задержек в мкс в основом только DWT, а рабочий пример что я видел для one wire был на 72МГц
-
Хочу реализовать 1 wire интерфейс для общения между stm32f303ve и температурным датчиком ds1821,но есть такая проблема, я работаю на 1Мгц (HCLK) и у меня не получается сделать точную задержку времени, что для 1wire весьма критично, ведь он завязан на таймингах. Может кто-нибудь подсказать как можно реализовать точную задержку, скажем, в 1 микросекунду и возможно ли это реализовать на stm на такой частоте ядра? Дело ещё в том, что когда мы подаём сигнал на какую-то ножку, также необходимо время пока сигнал достигнет нужный величины (Vdd, к примеру),судя по даташиту оно должно быть около 125 НАНОсекунд на частоте в 2Мгц, но как я не пытался время задержки у меня получается минимально около 50мкс с помощью DWT, что очень много, буду рад вашим мыслям и советам, спасибо
-
stm32f303 использует сortex m4 :) Спасибо, посмотрю, я тоже считаю что слишком много тактов в сумме получается для таких затрат
-
понимаете к чему я веду, мне надо укладываться в 20 мкс, это 1440 тактов для 72мгц клока, и тут получается что в одном случае я укладываюсь, а в другом нет, так чему мне верить и на что опираться?
-
Спасибо! учту это stm32f303ve,в нём ацп можно тактировать с частотой в 72 мгц, туфут не показывает))проверял с помощью источника питания, показывает те значения, которые подаю ему на входы
-
конкретные цифры в цикле while CCYNCT = 530, в десятичной, в обработчике CCYNCT = 27157, вот на такие порядки и отличается))в десятки раз считаю в коде и засовывал в watch отладчика) ацп у меня обрабатывает максимально 8 каналов, включаются они одновременно в режиме multimode, ацп тактируется 72МГц, такая же частота и у SYSCLK, поэтому вариант в CCYNCT=530 тактов лично мне видится более логичным, при 12 разрядном разрешении + 19 тактов ацп клока, выбранных в качестве времени сэмлирования, получаем кол-во тактов необходимое для конвертации всех каналов в ацп (12+19)*8 = 248, конечно чисто теоретически, но это ближе к 530 чем к 27157
-
У меня есть АЦП, которые начинает работать одновременно по таймеру и я хочу замерить время конвертации всех выбранных каналов с помощью таймера dwt (поднимается флаг, к примеру, TC и я меряю полученный DWT->CYCCNT) но вот какое дело, если я засовываю проверку флага в бесконечный цикл (__HAL_ADC_GET_FLAG) то получается одно значение CYCCNT, а если засовываю DWT->CYCCNT в прерывание по TC то получается совсем другое значение счётчика, гораздо большее, у меня вопрос, можно ли в принципе в отладчике засовывать счётчик dwt в обработчик прерывания? Если да, то почему получаются на столько разные значения, на порядки. Спасибо
-
Ну тогда нужно чётко определиться будет ли это единичный случай или у вас настолько специфические задачи, что вы не можете выбрать подходящую элементную базу, в том числе и камни, с которыми можно работать с помощью HAL
-
По крайней мере никто не будет спорить что CubeMx с HAL гораздо более информативней и наглядней, чем старая SPL, что даёт преимущество не только бывалым специалистам, но и в особенности начинающим разработчикам, позволяя сэкономить кучу времени и сил, да, может он не такой гибкий как SPL, даже не так, мне на ум приходит сравнение куба с ножом, хорошим ножом, а SPL уже ближе к своего рода скальпелю, выбор того или иного исключительно зависит от ваших нужд
-
Решил проблему, пропаял пины 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) Тему можно закрывать, всем спасибо!:)
-
Спасибо за поздравления, не знаю как в J-LINK, что я использовал, но аппаратная поддержка usb 2.0 в ST-LINK присутствует точно Ну да, так и есть, это земляной пин, на схеме подключение его к земле не показано, надо будет проверить, спасибо :)