Кто любит RISC в жизни, заходим, не стесняемся.
Сб май 21, 2022 18:51:27
Это не тот idle
Тююю, а який Idle нужон тады? В каком-нить F746 точно такой же Idle, как и в F103, потому как Idle - это состояние неактивности более величины кадра. Таймаут, принятый в модбасе, тут не рассматривается, это другое. А Idle frame у уарта - это свободная линия более длины одного кадра.
Последний раз редактировалось
НовыйДень Сб май 21, 2022 18:54:11, всего редактировалось 2 раз(а).
Сб май 21, 2022 18:52:42
Lum1noFor,
да даже в Вашем алгоритме можно,
зачем же Вы обнуляете счетчик, ставьте -1 что ли.
зачем использовать признак другого статуса.
Сб май 21, 2022 21:51:37
Идею понял, благодарю. Один знакомый также подкинул интересную идею обнулять таймер по прерыванию EXTI от ноги RX. То есть любую другую ногу спаивать с RX, и вншать на нее EXTI. Если RX дергается - обнулять таймер. Попробую все, что советовали - и Idle, и таймер. Всем спасибо.
Сб май 21, 2022 22:03:21
EXTI не обязательно. Ровно то же действие будет иметь любое прерывание от UART.
Сб май 21, 2022 22:20:16
Знакомый прикололся?
Это сколько прерываний на один байт будет?
Выключать/включать будете? - плюсом еще одна задача.
Сб май 21, 2022 22:45:01
Прошу прощения, он не говорил именно про EXTI - у меня уже бошка не работает под вечер, чушь сказал. Он советовал обнулять таймер через ногу RX и все. А вот как - не сказал. Это я уже сам по перегрузу мозгов напридумывал.
Сб май 21, 2022 23:15:36
извратится на аппаратный сброс таймера можно, только не у всякого таймера вход, на который можноб было повесить эту функцию, выведен наружу.
да и зачем, неужели с уартом не хватает времени.
Сб май 21, 2022 23:22:32
Так самый простой конечный автомат + системный счетчик на SysTick — вуаля!
Вс май 22, 2022 00:03:38
Вы что, прикалываетесь? Запускаете любой самый простой свободный таймер на переполнение. В каждом прерывании по приходу байта обнуляете его. В прерывании переполнения таймера получаете ваш таймаут.
Добавлено after 1 minute 39 seconds:
Eddy_Em, ты через сообщение как рецепт от всех бед "конченые автоматы" рекомендуешь. Можешь пример их применения/реализации показать?
Вс май 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;
но в данном случае потребности в таком замуте нет никакой.
И да, прерывания дополнительно еще придется разруливать.
Вс май 22, 2022 08:44:15
Идею понял, благодарю. Один знакомый также подкинул интересную идею обнулять таймер по прерыванию EXTI от ноги RX. То есть любую другую ногу спаивать с RX, и вншать на нее EXTI. Если RX дергается - обнулять таймер. Попробую все, что советовали - и Idle, и таймер. Всем спасибо.
Люди, вы читать не умеете? В F1 есть IDLE и он нормально функционирует. У меня на нём Модбас работает. Щас поищу ту давнишнюю прогу.
Вс май 22, 2022 10:44:42
Вот именно. А то кое-кто тут (не будем показывать пальцем на этого "героя", он просто перепутал слова по незнанию) говаривал, дескать нету в F103 Idle. Хе, кудаж без него то! В F103 нету Receive TimeOut Flag(RTOF), который есть в F0, F3, F7. Но это как бы не шибко большая беда.
Вс май 22, 2022 11:31:42
Только и можете что к словам цепляться и зубоскалить. Lum1noFor нужен именно таймаут. Зачем вы ему Idle втюхиваете?
Вс май 22, 2022 11:46:02
Так вначале думай, потом пиши. А коль уж ошибся, то скажи, что дескать погорячился, бывает. Все поймут и без зубоскальства.
А прерывание то одно, что для Idle, что для приема, что для ошибки кадра. Но Idle Flag является средством разграничения пакетов в посылке. В нормальном режиме именно по обнаружению Idle производится запуск и останов DMA-приема. И если стоит задача реализовать таймаут без RTOF, то после обнаружения Idle в фазе приема пакета нужно запустить таймер на выбранный интервал, но не сбрасывать счетчик DMA. Как только сработает прерывание таймера, только тогда можно считать пакет полностью принятым и перезапустить счетчик DMA, а пакет отдать на разбор.
Последний раз редактировалось
НовыйДень Вс май 22, 2022 11:55:10, всего редактировалось 1 раз.
Вс май 22, 2022 11:52:34
Да, я перепутал idle с таймаут. Но это не отменяет того что на f103 для решения задачи таймер нужен.
Вс май 22, 2022 11:57:09
А никто и не против таймера. Покажите, кто тут против этого? Но таймер можно выбрать как аппаратный типа TIM4, так и программный таймер на основе SysTicj.
Вс май 22, 2022 11:58:25
ЗЫ: Меня вот в соседней теме лечят, что на третьей планете от солнца никто не ошибается. Врут, поди?
Вс май 22, 2022 12:06:46
Не знаю, я не астроном, в планетах не разбираюсь.
Ошибаются хоть иногда - все. Но не многие умеют признавать свои ошибки и не обсираться от справедливой критики
Вс май 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!
Вс май 22, 2022 14:06:16
При попытке вызвать sqrt МК зависает.
Отладчик, опять не нужен?
Вот этого достаточно должно быть
-mcpu=cortex-m3 -mthumb -mfloat-abi=soft
Насчёт double - проверяй, чтобы все литералы были с f.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.