Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 18:51:27

Это не тот idle

Тююю, а який Idle нужон тады? В каком-нить F746 точно такой же Idle, как и в F103, потому как Idle - это состояние неактивности более величины кадра. Таймаут, принятый в модбасе, тут не рассматривается, это другое. А Idle frame у уарта - это свободная линия более длины одного кадра.
Последний раз редактировалось НовыйДень Сб май 21, 2022 18:54:11, всего редактировалось 2 раз(а).

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 18:52:42

Lum1noFor,
да даже в Вашем алгоритме можно,
зачем же Вы обнуляете счетчик, ставьте -1 что ли.
зачем использовать признак другого статуса.

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 21:51:37

Идею понял, благодарю. Один знакомый также подкинул интересную идею обнулять таймер по прерыванию EXTI от ноги RX. То есть любую другую ногу спаивать с RX, и вншать на нее EXTI. Если RX дергается - обнулять таймер. Попробую все, что советовали - и Idle, и таймер. Всем спасибо.

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 22:03:21

EXTI не обязательно. Ровно то же действие будет иметь любое прерывание от UART.

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 22:20:16

Знакомый прикололся?
Это сколько прерываний на один байт будет? ;)
Выключать/включать будете? - плюсом еще одна задача.

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 22:45:01

Прошу прощения, он не говорил именно про EXTI - у меня уже бошка не работает под вечер, чушь сказал. Он советовал обнулять таймер через ногу RX и все. А вот как - не сказал. Это я уже сам по перегрузу мозгов напридумывал.

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 23:15:36

извратится на аппаратный сброс таймера можно, только не у всякого таймера вход, на который можноб было повесить эту функцию, выведен наружу.
да и зачем, неужели с уартом не хватает времени.

Re: STM32 новичку в ARM что к чему

Сб май 21, 2022 23:22:32

Так самый простой конечный автомат + системный счетчик на SysTick — вуаля!

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 00:03:38

Вы что, прикалываетесь? Запускаете любой самый простой свободный таймер на переполнение. В каждом прерывании по приходу байта обнуляете его. В прерывании переполнения таймера получаете ваш таймаут.

Добавлено after 1 minute 39 seconds:
Eddy_Em, ты через сообщение как рецепт от всех бед "конченые автоматы" рекомендуешь. Можешь пример их применения/реализации показать?

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 07:42:57

спад на PA6 сбросит TIM3 (см. rm0008 15.3.14 Timers and external trigger synchronization )
TIM3->SMCR = (TIM_SMCR_TS_0 |TIM_SMCR_TS_2 |TIM_SMCR_SMS_2); // TS=101 (PA6) SMS=100 (reset)
TIM3->CCMR1 = 0;
TIM3->CCER = TIM_CCER_CC1P;

но в данном случае потребности в таком замуте нет никакой.
И да, прерывания дополнительно еще придется разруливать.

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 08:44:15

Идею понял, благодарю. Один знакомый также подкинул интересную идею обнулять таймер по прерыванию EXTI от ноги RX. То есть любую другую ногу спаивать с RX, и вншать на нее EXTI. Если RX дергается - обнулять таймер. Попробую все, что советовали - и Idle, и таймер. Всем спасибо.

Люди, вы читать не умеете? В F1 есть IDLE и он нормально функционирует. У меня на нём Модбас работает. Щас поищу ту давнишнюю прогу.

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 10:44:42

Вот именно. А то кое-кто тут (не будем показывать пальцем на этого "героя", он просто перепутал слова по незнанию) говаривал, дескать нету в F103 Idle. Хе, кудаж без него то! В F103 нету Receive TimeOut Flag(RTOF), который есть в F0, F3, F7. Но это как бы не шибко большая беда.

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 11:31:42

Только и можете что к словам цепляться и зубоскалить. Lum1noFor нужен именно таймаут. Зачем вы ему Idle втюхиваете?

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 11:46:02

Так вначале думай, потом пиши. А коль уж ошибся, то скажи, что дескать погорячился, бывает. Все поймут и без зубоскальства.
А прерывание то одно, что для Idle, что для приема, что для ошибки кадра. Но Idle Flag является средством разграничения пакетов в посылке. В нормальном режиме именно по обнаружению Idle производится запуск и останов DMA-приема. И если стоит задача реализовать таймаут без RTOF, то после обнаружения Idle в фазе приема пакета нужно запустить таймер на выбранный интервал, но не сбрасывать счетчик DMA. Как только сработает прерывание таймера, только тогда можно считать пакет полностью принятым и перезапустить счетчик DMA, а пакет отдать на разбор.
Последний раз редактировалось НовыйДень Вс май 22, 2022 11:55:10, всего редактировалось 1 раз.

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 11:52:34

Да, я перепутал idle с таймаут. Но это не отменяет того что на f103 для решения задачи таймер нужен.

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 11:57:09

А никто и не против таймера. Покажите, кто тут против этого? Но таймер можно выбрать как аппаратный типа TIM4, так и программный таймер на основе SysTicj.

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 11:58:25

ЗЫ: Меня вот в соседней теме лечят, что на третьей планете от солнца никто не ошибается. Врут, поди?

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 12:06:46

Не знаю, я не астроном, в планетах не разбираюсь.
Ошибаются хоть иногда - все. Но не многие умеют признавать свои ошибки и не обсираться от справедливой критики :)

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 13:28:36

Я, кстати, и забыл, что у меня есть уже готовый прием с таймаутами:
Код:
void usart1_isr(){
    static uint32_t tmout = 0;
    if(USART1->SR & USART_SR_RXNE){ // RX not emty - receive next char
        if(tmout && Tms >= tmout){ // set overflow flag
            bufovr = 1;
            idatalen[rbufno] = 0;
        }
        tmout = Tms + TIMEOUT_MS;
        if(!tmout) tmout = 1; // prevent 0
        uint8_t rb = USART1->DR;
        if(idatalen[rbufno] < UARTBUFSZI){ // put next char into buf
            rbuf[rbufno][idatalen[rbufno]++] = rb;
            if(rb == '\n'){ // got newline - line ready
                linerdy = 1;
                dlen = idatalen[rbufno];
                recvdata = rbuf[rbufno];
                // prepare other buffer
                rbufno = !rbufno;
                idatalen[rbufno] = 0;
                // clear timeout at line end
                tmout = 0;
            }
        }else{ // buffer overrun
            bufovr = 1;
            idatalen[rbufno] = 0;
            tmout = 0;
        }
    }
}

Если на предыдущем сообщении был таймаут, следующее даст об этом знать.
Но если сделать на конечных автоматах с проверкой таймаута снаружи, можно будет об этом сразу узнать, как таймаут кончится.
Но такой КА любой дятел может написать, зачем форум загромождать? Вот, например. С такими макросами:
Код:
#define chstate(s) do{errctr = 0; Tlast = Tms; mlx_state = s;}while(0)
#define chkerr()   do{if(++errctr > MLX_MAXERR_COUNT){chstate(M_ERROR); DBG("-> M_ERROR");}}while(0)
#define chktmout() do{if(Tms - Tlast > MLX_TIMEOUT){chstate(M_ERROR); DBG("Timeout! -> M_ERROR"); }}while(0)


Добавлено after 30 minutes 15 seconds:
Кстати, такой вопрос: какие флаги компилятора/сборщика указывать для того, чтобы на STM32F103 работал sqrt? У меня так:
Код:
FP_FLAGS    ?= -msoft-float -mfloat-abi=soft
ASM_FLAGS   ?= -mthumb -mcpu=cortex-m3 -mfix-cortex-m3-ldrd
ARCH_FLAGS  = $(ASM_FLAGS) $(FP_FLAGS)
CFLAGS      := -O2 -g -D__thumb2__=1 -MD
CFLAGS      += -Wall -Werror -Wextra -Wshadow
CFLAGS      += -fno-common -ffunction-sections -fdata-sections -fno-stack-protector
CFLAGS      +=  $(ARCH_FLAGS)
LDFLAGS     := -nostartfiles --static -nostdlibs --gc-sections --print-memory-usage
LDFLAGS     += -L$(LIB_DIR) -L$(TOOLCHLIB)
LDFLAGS     += -T$(LDSCRIPT)
LDLIBS      += -lm -lc $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
...
$(OBJDIR)/%.o: %.c
    @echo "  CC      $<"
    $(CC) $(CFLAGS) $(DEFS) $(INCLUDE) -o $@ -c $<

$(ELF): $(OBJDIR) $(OBJS)
    @echo "  LD      $(ELF)"
    $(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $(ELF)

При попытке вызвать sqrt МК зависает.

Хочу проверить, можно ли F103 использовать для компактного тепловизора. А для каждого из 768 пикселей надо по 4 раза sqrt вызвать, и хрен затабулируешь эту дурную функцию (параметров больше одного) ☹

Добавлено after 10 minutes 19 seconds:
Кстати, внутри sqrtf зачем-то используются double!

Re: STM32 новичку в ARM что к чему

Вс май 22, 2022 14:06:16

При попытке вызвать sqrt МК зависает.
Отладчик, опять не нужен?

Вот этого достаточно должно быть
-mcpu=cortex-m3 -mthumb -mfloat-abi=soft


Насчёт double - проверяй, чтобы все литералы были с f.
Ответить