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

Алексей ВМ1

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

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

  • Посещение

Репутация

1 Обычный

Информация о Алексей ВМ1

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

Информация

  • Город
    Array

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

Блок последних пользователей отключён и не показывается другим пользователям.

  1. На буржуйском форуме ответили: in starter package, the clock TIM5 is defined as 208877930Hz Скорей всего, в этом причина, хотя у меня М4 в режиме стандалоне. Но все равно непонятно. Я измерил PPS в клоках таймера, потом записываю это число в другой таймер, который сидит на этой же частоте, и ШИМ, сгенеренный этим таймером (тоже PPS) не совпадает с измеряемым сигналом.
  2. Для измеряющего таймера задан период, в два раза больший чем секундный интервал в клоках таймера. Остальные предделители нулевые htim_measure_pps.Instance = TIM5; htim_measure_pps.Init.Prescaler = 0; htim_measure_pps.Init.CounterMode = TIM_COUNTERMODE_UP; htim_measure_pps.Init.Period = TIM_PPS_WINDOW - 1; htim_measure_pps.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim_measure_pps.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim_measure_pps) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0x00; if (HAL_TIM_IC_ConfigChannel(&htim_measure_pps, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } .
  3. Добрый день! Пробовал все настройки фронтов. Если ловить оба фронта, то сумма длительностей опять магическое число 208877646. Остается только эта причина, если это не аппаратный косяк. Больше ничего в голову не приходит.
  4. Добрый день, Пытаюсь измерить период GPS PPS сигнала. Используется ядро М4 в режиме стандалоне. Тактовая частота М4 209 МГц. Сигнал формируется GPS модулем с точностью не хуже 100 нс. Для измерения использую модуль захвата таймера TIM5. Борда тактируется генератором TXO с точностью 2.5ррм. TIM5 CCR1 выдает значение 208877646 +- несколько единиц вместо 209000000. Причем, если загрузить значение 208877646 в таймер TIM2, который тоже одноразово сбрасывается от GPS PPS сигнала, то видно, что на каждое прерывание TIM5 по захвату значение счетчика TIM2 смещается на величину примерно 122000. Разность между периодом GPS PPS сигнала и измеряемым около 122000 тиков, что соответствует примерно 580 мкс, это явно не задержка обработки прерывания, да и для периодического сигнала она не должна влиять на величину периода. Может кто-нибудь сталкивался с подобной проблемой, куда копать? Спасибо.
  5. clk_ignore_unused не работает. SPI ничего не выплевывает из FIFO из-за того, что нет spi_ker_ck. spi_ker_ck получается из pll3_q_ck. pll3_q_ck - это частота с делителя q pll3. Чтобы включить выход этого делителя, надо в дереве прописать следующее &rcc { st,hsi-cal; st,csi-cal; st,cal-sec = <60>; st,clksrc = < ... >; st,clkdiv = < ... >; st,pkcs = < CLK_CKPER_HSE ... CLK_SPI2S23_PLL3Q ... >; /* VCO = 417.8 MHz => P = 209, Q = 24, R = 11 */ pll3: st,pll@2 { compatible = "st,stm32mp1-pll"; reg = <2>; cfg = <1 33 1 16 36 PQR(1,1,1)>; frac = <0x1a04>; }; }; Проверил в дереве fsbl -есть все необходимое. Не работает. Скопировал в дерево Линукса - не работает. Прямо в коде, выполняемом на М4, включил RCC->PLL3CR |= RCC_PLL3CR_DIVQEN; - работает. Но это же неправильно.
  6. В DT Линукса все сделал, как написано: stm32mp157-m4-srm.dtsi &m4_rproc { m4_system_resources { ..... m4_spi2: spi@4000b000 { compatible = "rproc-srm-dev"; reg = <0x4000b000 0x400>; clocks = <&rcc SPI2_K>; status = "disabled"; }; ..... stm32mp157-m4-srm-pinctrl.dtsi m4_spi2_pins_a: m4-spi2-0 { pins { pinmux = <STM32_PINMUX('I', 1, RSVD)>, /* SPI2_SCK */ <STM32_PINMUX('C', 3, RSVD)>, /* SPI2_MOSI */ <STM32_PINMUX('I', 2, RSVD)>; /* SPI2_MISO */ }; }; stm32mp157d-atk.dtsi &spi2 { status = "disabled"; }; &m4_spi2 { pinctrl-names = "default"; pinctrl-0 = <&m4_spi2_pins_a>; status = "okay"; }; Отключил spi2 от А7, включил для М4, прописал ноги. Все равно не пашет. Вывод cat /sys/kernel/debug/clk/clk_summary: root@ATK-MP157:~# cat /sys/kernel/debug/clk/clk_summary enable prepare protect duty clock count count count rate accuracy phase cycle --------------------------------------------------------------------------------------------- ck_hse 2 3 0 24000000 0 0 50000 usbphy_k 1 1 0 24000000 0 0 50000 ck_per 0 0 0 24000000 0 0 50000 adc12_k 0 0 0 24000000 0 0 50000 pll4 0 0 0 594000000 0 0 50000 pll4_r 0 0 0 74250000 0 0 50000 fdcan_k 0 0 0 74250000 0 0 50000 pll4_q 0 0 0 74250000 0 0 50000 ltdc_px 0 0 0 74250000 0 0 50000 dsi_px 0 0 0 74250000 0 0 50000 pll4_p 0 0 0 99000000 0 0 50000 spdif_k 0 0 0 99000000 0 0 50000 sdmmc3_k 0 0 0 99000000 0 0 50000 sdmmc2_k 0 0 0 99000000 0 0 50000 sdmmc1_k 0 0 0 99000000 0 0 50000 pll3 1 1 0 417755859 0 0 50000 pll3_r 0 0 0 11290699 0 0 50000 pll3_q 0 0 0 24573875 0 0 50000 ...... spi2_k 0 0 0 24573875 0 0 50000 ...... Я правильно понимаю, что spi2 не тактируется?
  7. Сравнил регистры для стандалоне и Линукса, они одинаковые, то есть конфигурация и разрешение работы доступны. Имеется одно отличие - после записи данных в TXDR регистр статуса SR 0x300F для стандалоне и 0x10012 для Линукса. В первом случае выставлены флаги RXP, TXP, DXP, EOT, TXC - то есть отправка из FIFO ुпрошла успешно, во втором - CTSIZE и TXTF, то есть данные застряли в FIFO и не передались. Что-то блокирует отправку данных непонятным образом.
  8. Добрый день, Имеется самодельный линейный двигатель под управлением контроллера Elmo. Если здесь имеются люди, кто работал с данной связкой, ткните, пожалуйста, с чего начать ручную настройку параметров контроллера. Автоматическая настройка не подбирает оптимальные параметры.
  9. Добрый день! Имеется отладка с STM32MP1 на борту, на SPI2 сидит флешь память. Если запускать прогу (прога работает на ядре М4), которая работает с флешь памятью по SPI2, на "голом" М4 (режим загрузки проца М4 под управлением отладчика), все работает нормально. Стоит запустить эту же прогу (на ядре М4) под Линуксом, на ноге SPI2_SCK (PI1) нет клоков. Дерево Линукса все перерыл, конфигурации ноги PI1 в нем нет. Ткните, плиз, куда копать для решения данной проблемы.
  10. Добрый день! Имеется три таймера, включенных последовательно. Один генерит ШИМ 8 мкс, второй ШИМ 10 мс, третий - ШИМ 1 с. Для второго и третьего таймера заданы режим Slave mode / External Clock Mode 1, считают UEV предыдущего таймера. Подскажите, пожалуйста, как аппаратно одновременно сбросить все три таймера по сигналу от ещё одного таймера? Первый таймер загнан в режим Slave mode / Reset Mode, он сбросится. Но что делать с двумя другими? Можно ли использовать для этого DMA, или есть более простые способы?
  11. Контроллер - stm32mp157. Прерывание UEV нужно, на нем строится логика отслеживания пропадания сигнала. CNT сбрасывается аппаратно по входному сигналу, таймер в slave mode. Выходит, причина генерации UEV - это сброс таймера, но не по переполнению счетчика? The update event can be generated at each counter overflow and at each counter underflow or by setting the UG bit in the TIMx_EGR register (by software or by using the slave mode controller) also generates an update event. Таймер сконфигурирован таким образом Particular case To facilitate the input capture measurement, the timer counter is reset after each rising edge detected on the timer input channel by: • Selecting TIxFPx as the input trigger by setting the TS bits in the SMCR register • Selecting the reset mode as the slave mode by configuring the SMS bits in the SMCR register. Using this configuration, when an edge is detected, the counter is reset and the period of the external signal is automatically given by the value on the CCRx register. This method is used only with channel 1 or channel 2. TIMx_SMCR SMS[3:0]: Slave mode selection When external signals are selected the active edge of the trigger signal (TRGI) is linked to the polarity selected on the external input (see Input Control register and Control Register description. ... 0100: Reset Mode - Rising edge of the selected trigger input (TRGI) reinitializes the counter and generates an update of the registers ... TIMx_CR2 MMS[2:0]: Master mode selection These bits allow selected information to be sent in master mode to slave timers for synchronization (TRGO). The combination is as follows: 000: Reset - the UG bit from the TIMx_EGR register is used as trigger output (TRGO). If the reset is generated by the trigger input (slave mode controller configured in reset mode) then the signal on TRGO is delayed compared to the actual reset. То есть цепочка такая - по входному сигналу сбрасывается счетчик, выставляется бит UG bit from the TIMx_EGR, генерится UEV , возникает прерывание? Хотя про UG написано, что он устанавливается программно TIMx_EGR Bit 0 UG: Update generation This bit can be set by software, it is automatically cleared by hardware. 0: No action 1: Reinitialize the counter and generates an update of the registers. The prescaler internal counter is also cleared (the prescaler ratio is not affected). The counter is cleared if the center-aligned mode is selected or if DIR=0 (upcounting), else it takes the auto-reload value (TIMx_ARR) if DIR=1 (downcounting). Ответ на вопрос лежал на поверхности, благодарю. TIMx_SR Bit 0 UIF: Update interrupt flag This bit is set by hardware on an update event. It is cleared by software. 0: No update occurred 1: Update interrupt pending. This bit is set by hardware when the registers are updated: At overflow or underflow (for TIM2 to TIM4) and if UDIS=0 in the TIMx_CR1 register. When CNT is reinitialized by software using the UG bit in TIMx_EGR register, if URS=0 and UDIS=0 in the TIMx_CR1 register. When CNT is reinitialized by a trigger event (refer to the synchro control register description), if URS=0 and UDIS=0 in the TIMx_CR1 register. Теперь вопрос, как тогда отслеживать пропадание сигнала в этом режиме таймера. PS Уведомления об ответах не приходили, странно...
  12. Добрый день Необходимо измерить период входного сигнала, для этого для таймера задается режим input capture mode. Чтобы было удобно считать период, этот таймер загоняется в slave mode reset mode, по входному сигналу значение счетчика сохраняется в регистр, а сам счетчик сбрасывается. Все работает, но есть нюанс - наряду с флагом CC1IF выставляется флаг UIF, при этом период сигнала меньше периода таймера, то есть физически переполнения таймера быть не может. Вопрос - по какой причине выставляется UIF?
  13. void TIM_SetDeadTime(uint16_t dead_time) { TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_1; sBreakDeadTimeConfig.DeadTime = TIM_CalcDeadtime(dead_time);// 104 - 500 ns, 168 - 1 us, 200 - 1.5 us sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.BreakFilter = 0; sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE; sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH; sBreakDeadTimeConfig.Break2Filter = 0; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;//TIM_AUTOMATICOUTPUT_ENABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK) { Error_Handler(); } } Функция, которая меняет длительность DeadTime по получению посылки от А7. Без IPCC работает нормально. if (VirtUart0RxMsg) { VirtUart0RxMsg = RESET; deadTimeToSet = *(uint16_t*)&VirtUart0ChannelBuffRx[0]; if(deadTimeToSet != deadTimePrev) { deadTimePrev = deadTimeToSet; TIM_SetDeadTime(deadTimeToSet); } } Обработка принятого значения. PS. Нашел косяк в своей функции TIM_SetDeadTime(), два поля не были проинициализированы, с фреймворком OpenAMP инициализировались мусором.
×
×
  • Создать...