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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

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

Сообщение НовыйДень »

Это не тот idle
Тююю, а який Idle нужон тады? В каком-нить F746 точно такой же Idle, как и в F103, потому как Idle - это состояние неактивности более величины кадра. Таймаут, принятый в модбасе, тут не рассматривается, это другое. А Idle frame у уарта - это свободная линия более длины одного кадра.
Последний раз редактировалось НовыйДень Сб май 21, 2022 18:54:11, всего редактировалось 2 раза.
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

Lum1noFor,
да даже в Вашем алгоритме можно,
зачем же Вы обнуляете счетчик, ставьте -1 что ли.
зачем использовать признак другого статуса.
Lum1noFor
Открыл глаза
Сообщения: 65
Зарегистрирован: Ср сен 24, 2014 12:30:09

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

Сообщение Lum1noFor »

Идею понял, благодарю. Один знакомый также подкинул интересную идею обнулять таймер по прерыванию EXTI от ноги RX. То есть любую другую ногу спаивать с RX, и вншать на нее EXTI. Если RX дергается - обнулять таймер. Попробую все, что советовали - и Idle, и таймер. Всем спасибо.
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

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

Сообщение НовыйДень »

EXTI не обязательно. Ровно то же действие будет иметь любое прерывание от UART.
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

Знакомый прикололся?
Это сколько прерываний на один байт будет? ;)
Выключать/включать будете? - плюсом еще одна задача.
Lum1noFor
Открыл глаза
Сообщения: 65
Зарегистрирован: Ср сен 24, 2014 12:30:09

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

Сообщение Lum1noFor »

Прошу прощения, он не говорил именно про EXTI - у меня уже бошка не работает под вечер, чушь сказал. Он советовал обнулять таймер через ногу RX и все. А вот как - не сказал. Это я уже сам по перегрузу мозгов напридумывал.
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

извратится на аппаратный сброс таймера можно, только не у всякого таймера вход, на который можноб было повесить эту функцию, выведен наружу.
да и зачем, неужели с уартом не хватает времени.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Так самый простой конечный автомат + системный счетчик на SysTick — вуаля!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

Добавлено after 1 minute 39 seconds:
Eddy_Em, ты через сообщение как рецепт от всех бед "конченые автоматы" рекомендуешь. Можешь пример их применения/реализации показать?
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

спад на 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;

но в данном случае потребности в таком замуте нет никакой.
И да, прерывания дополнительно еще придется разруливать.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

[uquote="Lum1noFor",url="/forum/viewtopic.php?p=4235432#p4235432"]Идею понял, благодарю. Один знакомый также подкинул интересную идею обнулять таймер по прерыванию EXTI от ноги RX. То есть любую другую ногу спаивать с RX, и вншать на нее EXTI. Если RX дергается - обнулять таймер. Попробую все, что советовали - и Idle, и таймер. Всем спасибо.[/uquote]
Люди, вы читать не умеете? В F1 есть IDLE и он нормально функционирует. У меня на нём Модбас работает. Щас поищу ту давнишнюю прогу.
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

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

Сообщение НовыйДень »

Вот именно. А то кое-кто тут (не будем показывать пальцем на этого "героя", он просто перепутал слова по незнанию) говаривал, дескать нету в F103 Idle. Хе, кудаж без него то! В F103 нету Receive TimeOut Flag(RTOF), который есть в F0, F3, F7. Но это как бы не шибко большая беда.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Только и можете что к словам цепляться и зубоскалить. Lum1noFor нужен именно таймаут. Зачем вы ему Idle втюхиваете?
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

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

Сообщение НовыйДень »

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

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

Сообщение VladislavS »

Да, я перепутал idle с таймаут. Но это не отменяет того что на f103 для решения задачи таймер нужен.
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

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

Сообщение НовыйДень »

А никто и не против таймера. Покажите, кто тут против этого? Но таймер можно выбрать как аппаратный типа TIM4, так и программный таймер на основе SysTicj.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

ЗЫ: Меня вот в соседней теме лечят, что на третьей планете от солнца никто не ошибается. Врут, поди?
Аватара пользователя
НовыйДень
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс апр 03, 2022 07:01:29

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

Сообщение НовыйДень »

Не знаю, я не астроном, в планетах не разбираюсь.
Ошибаются хоть иногда - все. Но не многие умеют признавать свои ошибки и не обсираться от справедливой критики :)
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Я, кстати, и забыл, что у меня есть уже готовый прием с таймаутами:

Код: Выделить всё

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!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4235608#p4235608"]При попытке вызвать sqrt МК зависает.[/uquote]Отладчик, опять не нужен?

Вот этого достаточно должно быть
-mcpu=cortex-m3 -mthumb -mfloat-abi=soft
Насчёт double - проверяй, чтобы все литералы были с f.
Ответить

Вернуться в «ARM»