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

Vichkins

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

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

  • Посещение

Репутация

0 Обычный

Информация о Vichkins

  • Звание
    Участник
    Участник

Посетители профиля

1 295 просмотров профиля
  1. Дык в том то и дело, может исполнять из всех регионов кроме SDRAM, чёрным по белому.
  2. Спасибо, но ничего нового там не увидел. Зато нашёл интересный баг, если можно так назвать, подпрограммы исполняются из региона 0x20000000 на ура, а из любого другого либо Hard fault, либо возврат непойми куда. Курю мануал.
  3. Есть задача писать функции, которые выполняют некие задачи, отдельно от основной прошивки устройства, компилировать и заливать в устройство, дабы оно их исполняло. По сути скрипты, только на си. Пробую на STM32H743. Функции компилил в Keil, без scatterа, просто указал адреса RO RW, в которые по итогу копирую скомпиленый бинарник. После копирования вызываю функцию: PROG = (pFunc_main) 0x30000041; initAddr = PROG(); По шагам дебаггер шагать не желает, после вызова вылетает не туда откуда была вызвана, а в какой-то кeсjк кода во флеше и исполняется оттуда далее. Возможно ли сделать, чтобы эта функция возвращалась туда, откуда была вызвана ? .text PROG_1 0x30000000: 4811 .H LDR r0,[pc,#68] ; [0x30000048] = 0x30020004 0x30000002: 6800 .h LDR r0,[r0,#0] 0x30000004: 1c80 .. ADDS r0,r0,#2 0x30000006: 4910 .I LDR r1,[pc,#64] ; [0x30000048] = 0x30020004 0x30000008: 6008 .` STR r0,[r1,#0] 0x3000000a: 4608 .F MOV r0,r1 0x3000000c: 6800 .h LDR r0,[r0,#0] 0x3000000e: 4770 pG BX lr PROG_0 0x30000010: 480e .H LDR r0,[pc,#56] ; [0x3000004c] = 0x30020000 0x30000012: 6800 .h LDR r0,[r0,#0] 0x30000014: 1c40 @. ADDS r0,r0,#1 0x30000016: 490d .I LDR r1,[pc,#52] ; [0x3000004c] = 0x30020000 0x30000018: 6008 .` STR r0,[r1,#0] 0x3000001a: 4608 .F MOV r0,r1 0x3000001c: 6800 .h LDR r0,[r0,#0] 0x3000001e: 4770 pG BX lr init 0x30000020: 4601 .F MOV r1,r0 0x30000022: 2000 . MOVS r0,#0 0x30000024: 4a09 .J LDR r2,[pc,#36] ; [0x3000004c] = 0x30020000 0x30000026: 6010 .` STR r0,[r2,#0] 0x30000028: 4a07 .J LDR r2,[pc,#28] ; [0x30000048] = 0x30020004 0x3000002a: 6010 .` STR r0,[r2,#0] 0x3000002c: f2af001f .... ADR r0,{pc}-0x1b ; 0x30000011 0x30000030: 6008 .` STR r0,[r1,#0] 0x30000032: 1d09 .. ADDS r1,r1,#4 0x30000034: f2af0037 ..7. ADR r0,{pc}-0x33 ; 0x30000001 0x30000038: 6008 .` STR r0,[r1,#0] 0x3000003a: 1d09 .. ADDS r1,r1,#4 0x3000003c: 2000 . MOVS r0,#0 0x3000003e: 4770 pG BX lr Reset_Handler 0x30000040: f2af0023 ..#. ADR r0,{pc}-0x1f ; 0x30000021 0x30000044: 4770 pG BX lr $d 0x30000046: 0000 .. DCW 0 0x30000048: 30020004 ...0 DCD 805437444 0x3000004c: 30020000 ...0 DCD 805437440 int Reset_Handler(void) { return (unsigned int)init; } int init(unsigned int* tablePtr) { i = 0; k = 0; *tablePtr = (unsigned int)PROG_0; tablePtr++; *tablePtr = (unsigned int)PROG_1; tablePtr++; return 0; }
  4. Здравствуйте. Есть задача фильтрации данных с восьми датчиков скорости. Система представляет из себя колёса с датчиками, которые могут иметь пробуксовку. Стоит задача отфильтровать, к примеру, внезапную пробуксовку одного колеса, дабы иметь наиболее достоверную скорость, т.к. скорость потом интегрируется в положение. Прошу подсказку в каком направлении копать. Сам сейчас изучаю фильтр калмана, но может кто то подскажет что нибудь ещё ?
  5. прошу удалить тему https://electronix.ru/forum/index.php?showtopic=140630
  6. Завалялось пара ненужных IGBT модулей от Toyota Prius, на 200 и 600 ампер. На борту уже стоят драйвера и изоляторы. Всё полностью рабочее и проверено. На 200 ампер - 5000р, на 600 ампер - 7000р. Датчики тока на эффекте холла: - LEM HAL-300-S, +-300 ампер - есть 4шт., по 1000р/шт. - от приуса +-200 ампер, питание +-15в, выход 4 вольта на сотню ампер - есть 3шт., по 1000р/шт. - от приуса +-600 ампер, питание +-15в, выход 4 вольта на сотню ампер - есть 3шт., по 1000р/шт. у одного нет крышки, пока не нашёл, на скорость не влияет, отдам за 800рэ. Конденсаторы Panasonic 3300uFx450V - 4 штуки, по 500р/шт. За опт сброшу цену. Нахожусь в Дубне, могу подвезти в Москву или отправить ТК. 89153176831 Виктор
  7. вот тут про резольвер почитать можно http://www.analog.com/library/analogdialog...3/resolver.html
  8. Там всё векторно, а в каком месте ещё может быть синус ? от минуса до плюса. а калибруется для того чтобы точно знать где ноль на выходе при нулевой амплитуде синуса. Это важно на низких оборотах когда ЭДС от мотора очень мала. Вы полистайте хотя бы мануал на всё это дело, там всё описано
  9. Пробую сейчас со своим инвертором и двигателем от приуса, вполне себе работает, единственное конечно на маленьких оборотах плохо работает (100-200 об/мин), тут два варианта есть, либо использовать резольвер в моём конкретном случае и скармливать обсерверу текущий угол до некоторых оборотов, или использовать ихний алгоритм HFI. Пробовал добиться от него приемлемых результатов, через день настройки стартует хорошо с нуля. Field weakening работает. Параметры мотора определяет по разному при разных настройках изначальных, весьма странно. Очень требователен ихний алгоритм к качеству обратной связи, особенно проблема в том что когда при включении калибруются нули датчиков тока и калибруется середина напряжения на фазах путём включения шима 50/50, а потом напряжение прыгает, то на низких оборотах возможна нестабильность определения положения ротора, особенно при больших напряжениях питания. нужно динамически подстраивать середину от референсного замера при включении
  10. уже решил проблему переключением SPI в 16 битный режим но вылезла другая пролбема перекидываю код I2C slave с f100 на f405 код инициализации GPIO_PinAFConfig(GPIOB, GPIO_Pin_10, GPIO_AF_I2C2); GPIO_PinAFConfig(GPIOB, GPIO_Pin_11, GPIO_AF_I2C2); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); // I2C init I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9; I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDR; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_DeInit(I2C2); I2C_Init(I2C2, &I2C_InitStructure); I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE); I2C_ITConfig(I2C2, I2C_IT_BUF, ENABLE); I2C_ITConfig(I2C2, I2C_IT_ERR, ENABLE); I2C_Cmd(I2C2, ENABLE); проблема в том что после строчки GPIO_Init(GPIOB, &GPIO_InitStructure); обе линии в нуле, висит флаг BSY, и соответственно вся шина валится, на f100 всё ок было
  11. забыл написать, RXNE тоже пробовал проверять, то же самое паузы в функции чипселекта стоят перед и после отключения по 500 мкс.
  12. STM32F4 странности с SPI

    Пытаюсь наладить обмен данными с трансивером RFM22B, проц stm32f405 до этого работал с spi на f417 таких проблем не было вот код чтения регистра модуля RFM22_SS(ENABLE); while(!(SPI3->SR&SPI_I2S_FLAG_TXE)); SPI3->DR=reg&(~RFM22_SPI_WRITE_MASK); while(!(SPI3->SR&SPI_I2S_FLAG_TXE)); SPI3->DR=0x00; while(!(SPI3->SR&SPI_I2S_FLAG_TXE)); RFM22_SS(DISABLE); return SPI3->DR; весь прикол в том, что этот код не работает без отладчика или если поставить брейкпоинт в конце кода, в регистре DR ноль, а если прошагать этот код отладчиком то всё окей перекидывал модуль на плату с stm32f100 та же фигня, только там вообще непонятно что иногда в регистр приходит, пробовал на трёх SPI на разных пинах контроллера вместо проверки флага TXE ставил задержки, менял скорость SPI, пробовал запаивать новый модуль, ничего не помогает единственное, что ещё приходит на ум, читать SPI с помощью DMA
  13. так я же говорю что MSC работает, CDC работает, композит из них тоже ок. мне хотелось бы узнать про чтение эндпоинта с компьютера, оно у меня никак не работает нужно реализовать соединение девайса и проги на c#
  14. излагаю суть проблемы: хочу соединить девайс с компьютером через USB, а конкретно через 2 bulk эндпоинта, пробовал библиотеки LibUSBDotNet и Jungo WinDriver, никак не могу прочитать из эндпоинта тоесть когда на хосте вызывается функция чтения, на девайсе не происходит даже прерывания USB ! реализовывал CDC и MSC, всё отлично работало! Пробовал даже композит из MSC и моих 2ух bulk ep, MSC работает, а свой эндпоинт прочитать не могу, опять же даже прерывания нет может кто имел опыт в данной области ? подскажите куда копать :crying:
  15. stm32f4 spi+dma

    пытаюсь соединить 2 контроллера по SPI, решил сразу реализовывать с DMA, контроллер stm32f407 с FreeRTOS проблема в том что приём работает вроде бы нормально, то есть если MISO подцепить на землю или 3.3v то в буфере либо 0x00 либо 0xff. Но если соединить MOSI и MISO, то принимается всегда 0xff, хотя массив на отправку исправно заполняется рандомными числами логического анализатора нет, вот сижу и гадаю что не так сделал или MOSI и MISO попросту нельзя накоротко соединять ? volatile uint8_t SPI_Buffer_Rx[sPI_BUFFER_SIZE]; volatile uint8_t SPI_Buffer_Tx[sPI_BUFFER_SIZE]; volatile uint8_t Transfer_device; volatile uint8_t SPI_TransferCompl; DMA_InitTypeDef DMA_InitStructureTX; DMA_InitTypeDef DMA_InitStructureRX; void Init_SPI() { SPI_InitTypeDef SPI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; SPI_TransferCompl=1; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_11); SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode=SPI_Mode_Master; SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64; SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge; SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial=7; SPI_Init(SPI2, &SPI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_Cmd(DMA1_Stream3, DISABLE); DMA_Cmd(DMA1_Stream4, DISABLE); /* SPI_MASTER_Rx_DMA_Channel configuration */ DMA_StructInit(&DMA_InitStructureRX); DMA_InitStructureRX.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR); DMA_InitStructureRX.DMA_Memory0BaseAddr = (uint32_t)SPI_Buffer_Rx; DMA_InitStructureRX.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructureRX.DMA_BufferSize = SPI_BUFFER_SIZE; DMA_InitStructureRX.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructureRX.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructureRX.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructureRX.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructureRX.DMA_Mode = DMA_Mode_Normal; DMA_InitStructureRX.DMA_Priority = DMA_Priority_High; DMA_InitStructureRX.DMA_Channel = DMA_Channel_0; DMA_InitStructureRX.DMA_FIFOMode = DMA_FIFOMode_Disable; /* SPI_MASTER_Tx_DMA_Channel configuration */ DMA_StructInit(&DMA_InitStructureTX); DMA_InitStructureTX.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR); DMA_InitStructureTX.DMA_Memory0BaseAddr = (uint32_t)SPI_Buffer_Tx; DMA_InitStructureTX.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructureTX.DMA_BufferSize = SPI_BUFFER_SIZE; DMA_InitStructureTX.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructureTX.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructureTX.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructureTX.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructureTX.DMA_Mode = DMA_Mode_Normal; DMA_InitStructureTX.DMA_Priority = DMA_Priority_VeryHigh; DMA_InitStructureTX.DMA_Channel = DMA_Channel_0; DMA_InitStructureTX.DMA_FIFOMode = DMA_FIFOMode_Disable; Debug("SPI initialized."); } void SPI_Start(int device) { Transfer_device=device; SPI_TransferCompl=0; DMA_DeInit(DMA1_Stream3); DMA_DeInit(DMA1_Stream4); DMA_Init(DMA1_Stream3, &DMA_InitStructureRX); DMA_Init(DMA1_Stream4, &DMA_InitStructureTX); DMA_ITConfig(DMA1_Stream3, DMA_IT_TC, ENABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_RXNE); SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_TXE); SPI_Cmd(SPI2, ENABLE); switch(Transfer_device){ case SPI_DEVICE_SERVO: GPIO_ResetBits(GPIOB, GPIO_Pin_11); break; case SPI_DEVICE_OSD: //GPIO_ResetBits(GPIOB, GPIO_Pin_11); break; } DMA_Cmd(DMA1_Stream3, ENABLE); DMA_Cmd(DMA1_Stream4, ENABLE); } void DMA1_Stream3_IRQHandler(void) { if(DMA_GetITStatus(DMA1_Stream3, DMA_IT_TCIF3)) { switch(Transfer_device){ case SPI_DEVICE_SERVO: GPIO_SetBits(GPIOB, GPIO_Pin_11); break; case SPI_DEVICE_OSD: //GPIO_SetBits(GPIOB, GPIO_Pin_11); break; } DMA_ClearITPendingBit(DMA1_Stream3, DMA_IT_TCIF3); DMA_Cmd(DMA1_Stream3, DISABLE); DMA_Cmd(DMA1_Stream4, DISABLE); SPI_TransferCompl=1; } } так проверяю что пришло: void pvDebugTask( void *pvParameters ) { int i; for(i=0;i<SPI_BUFFER_SIZE;i++){ SPI_Buffer_Tx[i]=rand(); } while(1){ SPI_Start(SPI_DEVICE_SERVO); while(!SPI_TransferCompl){}; for(i=0;i<SPI_BUFFER_SIZE;i++){ printf("%x ", SPI_Buffer_Rx[i]); } printf("\r\n"); vTaskDelay(1000); } }
×
×
  • Создать...