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

Cosworth

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник
  1. STM32F746 SAI

    Доброго дня. Кто-нибудь имел дело с SAI в СТМ? Хочу настроить в режиме I2S, но что-то он у меня вообще никак не работает, настраиваю так: rccEnableAPB2(1 << 23, false); // 23rd bit- SAI2 periph. SAI2->GCR = 0; SAI2_Block_A->CR1 = SAI_xCR1_NODIV | SAI_xCR1_CKSTR | (4 << 5); // 16 bit data size SAI2_Block_A->CR2 = (2 << 0); // 1/2 FIFO threshold SAI2_Block_A->FRCR = SAI_xFRCR_FSOFF | SAI_xFRCR_FSDEF | (24 << 8) | // FS active time (49 << 0); // 2.4MHz / 48kHz = 50 (FS rate) SAI2_Block_A->SLOTR = (3 << 16) | // Slot 0 and 1 enabled ((2 - 1) << 8) | // 2 Slots SAI_xSLOTR_SLOTSZ_1; SAI2_Block_A->CR1 |= SAI_xCR1_SAIEN; // Enable block // wm8994_Init(0x34 >> 1, OUTPUT_DEVICE_BOTH, 50, AUDIO_FREQUENCY_48K); // wm8994_SetMute(0x34 >> 1, AUDIO_MUTE_OFF); while(true) { // k = (SAI2_Block_A->SR & SAI_xSR_FLVL) >> 16; if(SAI2_Block_A->SR & SAI_xSR_FREQ) SAI2_Block_A->DR = i++; } Тактирование блока SAI - от PLL 2.4MHz. В цикле фифо заполняется и новых запросов не шлет. Содержимое статусного регистра не меняется: Ощущение, что клок на фифо не приходит. Все усугубляется тем, что осциллом в линии не ткнуться - на плате (F7 disco) чип - БГА. Пробовал настроить то же самое через функции HAL - так же не работает (при попытке послать что-нибудь - вылетает тайм аут). --- Было тактирование от PLLSAI, затактировал от PLLI2S xfcnjnjq 49.143. Взял функцию инициализации из примеров Куба: static void SAIx_Out_Init(void) { rccEnableAPB2(1 << 23, false); /* Initialize the haudio_out_sai Instance parameter */ haudio_out_sai.Instance = SAI2_Block_A; /* Disable SAI peripheral to allow access to SAI internal registers */ __HAL_SAI_DISABLE(&haudio_out_sai); /* Configure SAI_Block_x LSBFirst: Disabled DataSize: 16 */ haudio_out_sai.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_48K; haudio_out_sai.Init.AudioMode = SAI_MODEMASTER_TX; haudio_out_sai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLED; haudio_out_sai.Init.Protocol = SAI_FREE_PROTOCOL; haudio_out_sai.Init.DataSize = SAI_DATASIZE_16; haudio_out_sai.Init.FirstBit = SAI_FIRSTBIT_MSB; haudio_out_sai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE; haudio_out_sai.Init.Synchro = SAI_ASYNCHRONOUS; haudio_out_sai.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLED; haudio_out_sai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF; /* Configure SAI_Block_x Frame Frame Length: 64 Frame active Length: 32 FS Definition: Start frame + Channel Side identification FS Polarity: FS active Low FS Offset: FS asserted one bit before the first bit of slot 0 */ haudio_out_sai.FrameInit.FrameLength = 64; haudio_out_sai.FrameInit.ActiveFrameLength = 32; haudio_out_sai.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION; haudio_out_sai.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW; haudio_out_sai.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT; /* Configure SAI Block_x Slot Slot First Bit Offset: 0 Slot Size : 16 Slot Number: 4 Slot Active: All slot actives */ haudio_out_sai.SlotInit.FirstBitOffset = 0; haudio_out_sai.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE; haudio_out_sai.SlotInit.SlotNumber = 4; haudio_out_sai.SlotInit.SlotActive = SAI_SLOTACTIVE_ALL; HAL_SAI_Init(&haudio_out_sai); /* Enable SAI peripheral to generate MCLK */ __HAL_SAI_ENABLE(&haudio_out_sai); } Тоже не работает. HAL_SAI_Init вызывает функцию, вычисляющую текущую частоту тактирования блока - и она правильная. В gdb все регистры, относящиеся к тактированию тоже правильно заполнены. Чудеса какие-то.
  2. А, ну точно, надо ж не на 0x1FFFEC04 прыгать, а на адрес, который там хранится. В общем-то, я как делаю: из основной программы по команде выключаю все прерывания, записываю по нулевому адресу рамы ключ, ремаплю нулевой адрес на System Flash (Mem_MODE = 01) и делаю сброс. После сброса - попадаю в __early_init(). Вот поправил указатель: void __early_init(void) { ... void ( *BootLoader )( void ) = ( ( void * )( void ) ) ( *( ( uint32_t * ) 0x1FFFEC04 ) ); ... } Хард флотов больше нет, но контроллер после выполнения BootLoader() прыгает то в ресет то в рандомную функцию и через stlink не прогается - приходится стирать прошивку через бутлоадер.
  3. А вот интересно, у кого-нибудь получился вот такой трюк: http://www.youtube.com/watch?v=cvKC-4tCRgw ? Решил попробовать на f0-дисковери (контроллер stm32f051). Открыл руководство по бутлодеру: Сдампил содержимое: 7806 0020 35ee ff1f edec ff1f edec ff1f 00f0 02f8 00f0 40f8 0ca0 30c8 0838 2418 2d18 a246 671e ab46 5446 5d46 ac42 01d1 00f0 32f8 7e46 0f3e 0fcc ... Здорово, первая чиселка 0х20000678 похожа на адрес из рамы, очевидно - указатель куда надо стек поместить. А дальше, с адреса 0x1FFFEC00 + 4 (как раз куда этот чел с видео прыгает) - мура какая-то (0х1FFFEE35), подозреваю, что это некая таблица с адресами. На видео - тоже самое. Дизассемблер видит в этом месте инструкцию arm режима: " mrc 15, 1, r1, cr5, cr15, {7} " - в доках что-то про сопроцессор (какой нафиг сопроцессор?). Вообшем я сделал вывод, что по адресу System Memory + 4 инструкции нету и, тогда вопрос, зачем туда переходить? Ну ладно, думаю, почему не попробовать: void __early_init(void) { uint32_t *key = ( uint32_t * ) SRAM_BASE; void ( *BootLoader )( void ) = ( void ( * )( void ) ) 0x1FFFEC04; if( *key == 0xDEADC0DE ) { *key = 0; __set_PRIMASK( 1 ); __set_MSP( 0x20000678 ); __set_CONTROL( 0 ); BootLoader(); } stm32_clock_init(); } Как и предполагалось - переход по адресу 1FFFEC04 и на этой самой инструкции mrc - провал в хард фолт.
  4. FreeRTOS + STM32 HAL

    Доброго времени. А кто-нибудь запускал FreeRTOS с HAL от стм? Бьюсь весь день - какая-то проблема с атомарностью - при запуске АЦП+ДМА до макроса __HAL_LOCK(hdma) адрес коллбэка в ADCHandle->DMA_Handle->XRefHalfCpltCallback правильный, а после выполнения макроса - белиберда. Похоже где-то во время выполнения макроса вылезает менеджер задач и все портит.. почему? Ковыряю - что за макрос такой, а там - еррор: Получается у HAL свой механизм мьютексов и фриртос на него не кладется? Камень STM32F051R8T6 (на ф0дискавери), если это имеет значение. UPD ...и так всегда - спросишь о чем-то, а через минуту ответ в голову приходит :krapula: Запускал HAL_ADC_Start_DMA из таска, а стек таску задал короткий, вот и ловил HardFault. Собственно остается вопрос про #erroe в коде HAL? Зачем он там?
  5. Запуск ADC1 от TIM1 TRGO

    Доброго времени суток. Никак не могу запустить преобразования инжектированных каналов АЦП1 от внешнего триггера таймера 1. Настройки периферии следующие (прошу прощения за простыню): Не работает даже при установке бита TG в TIM1->EGR вручную в отладчике. Также не работает по событию TIM1 CC4. Пробовал другой таймер (TIM4) - срабатывает по TRGO и, аналогично не работает по CCx. UPD Вообще чудеса.. 4 канала таймера 1 настроены абсолютно одинаково, однако, триггер генерится ТОЛЬКО по Capture/compare 3.. Вообщем сильно звиняюсь, поднял панику, а проверил не все. Оказывается все каналы кроме 3го настроены как FORCED INACTIVE. Тема исчерпана.
  6. Ага, благодарю :) Уже посыпал голову пеплом, даже на википедии об этом написано..
  7. Ни для одной ни для другой ничего не выделял, собственно вот такой код: void systemClockInit() { RCC_OscInitTypeDef *oscSel; RCC_ClkInitTypeDef *clk; GPIO_InitTypeDef *mco; oscSel->OscillatorType = RCC_OSCILLATORTYPE_HSE; oscSel->HSEState = RCC_HSE_ON; oscSel->PLL.PLLSource = RCC_PLLSOURCE_HSE; oscSel->PLL.PLLState = RCC_PLL_ON; oscSel->PLL.PLLM = 8; oscSel->PLL.PLLN = 192; oscSel->PLL.PLLP = RCC_PLLP_DIV4; oscSel->PLL.PLLQ = 4; HAL_RCC_OscConfig(oscSel); clk->SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; clk->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; clk->AHBCLKDivider = RCC_SYSCLK_DIV1; clk->APB1CLKDivider = RCC_HCLK_DIV2; clk->APB2CLKDivider = RCC_HCLK_DIV2; HAL_RCC_ClockConfig(clk, FLASH_LATENCY_1); mco->Pin = GPIO_PIN_9; mco->Mode = GPIO_MODE_AF_PP; mco->Pull = GPIO_NOPULL; mco->Speed = GPIO_SPEED_HIGH; mco->Alternate = GPIO_AF0_MCO; HAL_GPIO_Init(GPIOC, mco); HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1); } А разве объявление переменной TypeDef *q автоматически не резервирует область памяти с размером TypeDef? Никогда с таким не сталкивался.. Что характерно oscSel действительно указывает вникуда (0х00000000).
  8. STM32 HAL

    Всем доброго. Две структуры: RCC_OscInitTypeDef *oscSelector; RCC_ClkInitTypeDef *clkSelector; Заполняю поля: clkSelector->SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; clkSelector->ClockType = RCC_CLOCKTYPE_SYSCLK; ... oscSelector->OscillatorType = RCC_OSCILLATORTYPE_HSE; oscSelector->HSEState = RCC_HSE_ON; ... В результате в отладчике, clkSelector заполняется как положено, oscSelector даже не меняется. Почему так? Если объявить RCC_OscInitTypeDef oscSelector; и заполнять так: oscSelector.ClockType = ... то все ок.
  9. Может. Зависит от конкретной частоты/конфигурации вырезов в меди.
  10. Здорово, .SpecialString мне нравятся :) А вот можно ли свои спец строки задавать через схематик? Например чтобы в параметрах схемы забить децимальный номер и получить его на PCB? Пробовал просто вбить .DecimNumber на PCB и задать параметр в схематике - не работает.
  11. Доброго времени суток. Можно ли в альтиуме сделать так чтобы помимо слоя Top/Bottom Overlay, десигнатор появлялся и на слое, скажем, Mechanical 13? Альтиум 15.
  12. Здравствуйте, работаю с платкой ArduPilot Mega 2.6 - пытаюсь запустить аксель MPU-6000 по SPI. Вроде все правильно делаю, но на чтение регистра WHO_AM_I (как и любого другого регистра, впрочем) ответ 0xFF. Код: #include <SPI.h> uint8_t const WHO_AM_I = 0x75; uint8_t const PWR_MGMT_1 = 0x6B; uint8_t const SIGNAL_PATH_RESET = 0x68; uint8_t const MPU6000_SS_PIN = 53; void MPU6000_write(uint8_t reg, uint8_t data) { digitalWrite(MPU6000_SS_PIN, LOW); SPI.transfer(reg); SPI.transfer(data); digitalWrite(MPU6000_SS_PIN, HIGH); } uint8_t MPU6000_read(uint8_t reg) { uint8_t retval; digitalWrite(MPU6000_SS_PIN, LOW); SPI.transfer(reg | 0x80); retval = SPI.transfer(0x00); digitalWrite(MPU6000_SS_PIN, HIGH); return retval; } void setup() { SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV32); SPI.setDataMode(SPI_MODE3); Serial.begin(9600); MPU6000_write(PWR_MGMT_1, 0x80); delay(100); MPU6000_write(SIGNAL_PATH_RESET, 0x07); delay(100); } uint8_t tmp; void loop() { tmp = MPU6000_read(WHO_AM_I); Serial.println(tmp); delay(1000); } Контроллер работает, посылки на шине правильные, видны осциллографом, смотрел на ногах самой MPU (мелкие, гады). Питание тоже есть (3V3). MISO всегда в 1 - такое ощущение, что китайцы запаяли дохлую микруху... или я что-то не правильно делаю? Схему прикладываю. Надо же как бывает, отправил сообщение и, пока перечитывал, заметил на схеме, что на том же SPI сидит барометр. Поднял его чипселект и все сразу заработало :)
  13. FT245

    Доброго времени суток. Господа, прошу прощения, если вопрос не в той ветке. В ближайшее время предстоит работать с микросхемой FT245RL, в связи с чем активно курю документацию. Не понятен такой момент, по поводо Synchronous/asynch. bit-bang: как я понял из AN232R, асинхронный режим выглядит так: записал биты через драйвер -> получил уровни на ногах -> записал следующие биты -> получил следующие и тд., с чтением - аналогично, команда чтения драйверу считывает уровни с ног. В таком случае не совсем понятно, на кой нужны стробы RD# и WR? Или я не правильно понимаю вот это:
  14. Красиво, благодарю :rolleyes: А можно еще вопрос, Вы написали про co-simulation - это какой-то компонент в симулинке или это стандартное SV -> C socket -> Matlab?
  15. Кстати вопрос актуальный. Тоже приходится отлаживать блоки с fp, и иногда хочется посмотреть значения на диаграмме. Проблема в том, что в моделсим есть -radix fpoint#n, но когда я задаю его для сигнала - вижу что-то типа 01011101.0100101. Приходится вооружаться калькулятором и переводить всю эту муть в десятичный вид.
×
×
  • Создать...