Привет котам:) Подскажите пожалуйста, можно ли прошить STM8s c помощью stm32f0 discovery или других discovery на stm32? В даташите на discovery упоминаний о такой возможности не нашел
_________________ Осилит дорогу идущий ---------- Пишу на Си за еду
Дано: STM8S003F3P3, таймер TIM2, IAR 1.42, процедура вида:
TIM2_CR1_OPM = 1; // режим единичного прогона таймера TIM2_CR1_URS = 1; // не поднимать флаги при "ручной" перегрузке счетчиков TIM2_EGR_UG = 1; // сама "ручная" перегрузка TIM2_CR1_CEN = 1; // запуск
С вероятностью 80% действие в строке 3 зашибает последующий старт таймера в строке 4. Таймер тупо не стартует. Ассемблерный код в отладчике виден, как рафинированная очередь BSET-ов без каких либо посторонних вкраплений. Вставка пары нопов между строками 3 и 4 решает проблему, но немое недоумение остается. Вроде ж солидное устройство, а работает только при помощи веревок, палок и грязных тряпок. Чтение эрраты и референса не принесло ни просветления, ни облегчения. Одна тоска по поводу несовершенства мира и печаль за бесцельно прожитые годы.
Вставка пары нопов между строками 3 и 4 решает проблему, но немое недоумение остается. Вроде ж солидное устройство, а работает только при помощи веревок, палок и грязных тряпок. Чтение эрраты и референса не принесло ни просветления, ни облегчения.
"Ваше незнание не освобождает от наказания!"(С) Всё там верно... для UG нужно два дополнительных такта... и NOP'ы там не лишние... Просто если после UG есть ещё настройки, то NOP'ы не нужны... кроме последующего сброса флагов... Между UG и сбросом флагов тоже нужны NOP'ы... иначе они не сбросятся...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Bit 0 UG: Update generation This bit can be set by software, it is automatically cleared by hardware. 0: No action 1: Re-initializes the counter and generates an update of the registers. Note that the prescaler counter is also cleared. Будет ли правильным подождать пока бит не станет нулем? Или это не является сигналом готовности?
Как по мне... проще два NOP'а... Тем более... в случае дополнительных настроек таймера они могут и не понадобиться... их функции выполнят последующин команды...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Все правильно, я просто спустил вниз пару строк инициализации, которые шли до UG, а теперь стали после. Проблем с правильной инициализацией таймера это не вызывает. Возмутительно тут другое -- тот же RM0016 нигде на видном месте не предупреждает о каких-то там дополнительных клоках, которые надо выжидать после UG. Мне, во всяком случае, этого обнаружить не удалось.
Дезинформация и звездёж это то, что что-то там не работает или не описано... Всё там работает и всё там описано (пусть и в неявной форме) "согласно купленным билетам"... и CEN тут не причём... всё претензии надуманны!!! Если что-то не работает или работает не так - что-то не поняли или не дочитали... разбирайтесь... В вашем случае... нужно просто разобраться с режимом OPM... что это такое и с чем его едят... Производитель не обязан сопливить-разжёвывать каждый бит и каждую комбинацию с другими битами... все основные моменты указаны в референсе...
Цитата:
Bit 3 OPM: One-pulse mode 0: Counter is not stopped at update event 1: Counter stops counting at the next update event (clearing the CEN bit)
Таймера STM8S, STM8L и STM32 одинаковы по сути и работе... разница только в названии битов и других мелочах... Из явных глюков знаю только один - самопроизвольный запуск таймера TIM1 в режиме Gate Mode при установке бита UG в STM32... всё!!!
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Конечно надуманы. Другие биты можно выставить, но не CEN. И это такая мощная фича, что она тайно присутствует, похоже, во всей линейке STM8 и для всех таймеров. Попробовал четвертый таймер на STM8L051. Для иллюстрации, старт таймера (сразу же после ручного сброса) выполняется инструкцией TIM4_CR1 = 0xFF. Встают все биты, которые могут там встать, но CEN остается в нуле. Примечательно, что поведение программы зависит еще и от неких "оптимизационных" свойств компилятора. Я не зря в исходном сообщении упомянул, что событие воспроизводится с вероятностью 80%. Собирая один и тот же исходник с разными параметрами оптимизации (речь про IAR 1.42), один и тот же ассемблерный код в окне отладчика в этом месте вдруг начинает работать, т. е. злосчастный CEN замечательно устанавливается и таймер запускается. Всегда. Можно заливать в устройство и отдавать в продакшн. Что это? Нюансы выравнивания? Конвейер ? Потусторонние силы? Черта лысого! Это грабли, заботливо разложенные ST-шниками, чтобы программерам жизнь медом не казалась. "Тут играем, тут не играем, здесь жирное пятно - рыбу заворачивали"...
Карма: 16
Рейтинг сообщений: 204
Зарегистрирован: Вс дек 02, 2012 16:58:33 Сообщений: 933 Откуда: от туда
Рейтинг сообщения:0
А почитать инструкцию? Ну, развёл срач на пустом месте. Для того, чтобы таймер заработал с новыми настройками нужно либо дождаться его переполнения, либо вручную передёрнуть TIM4->EGR = TIM4_EGR_UG; Про UPDATE EVENT слышал? Писатель.
ответ на на вопрос "что делает код" не получил, если хотелось задержку получить, то я для STM32 делал так:
Код:
void delay_us(uint16_t delay) { TIM3->PSC = 48-1; //устанавливаем предделитель TIM3->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления TIM3->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR TIM3->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM; //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM while ((TIM3->CR1 & TIM_CR1_CEN)!=0); }
Между тем, я дал вам исчерпывающий ответ. Таймер должен запуститься, досчитать до конца и остановиться. Мне удивительно, что я объясняю такие вещи.
Цитата:
TIM3->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM; //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM все прекрасно работает
Эта инструкция разворачивается в несколько команд на ассемблере, выполнение которых занимает больше времени, чем требуется для переинициализации таймера. В таком виде оно просто обязано работать "прямо из каропки". Уберите "или" перед знаком равно, чтобы получилась только одна команда "MOV", тогда и экспериментируйте. UG тоже неплохо бы одной командой устанавливать. Но опять же, не могу утверждать, что на STM32 оно будет вести себя так же, как и на STM8. Не смотря на подобную периферию, разница в аппаратных реализациях очевидна, что вполне может допускать разные варианты, которые я не проверял. Пока лишь могу утверждать, что "внеприродная аномалия" наблюдалась мной на двух камнях -- STM8S103F3 и STM8L051F3. Во избежание разночтения или недопонимания, вновь обращаю внимание, что суть "рукотворного феномена" в том, что в зависимости от сторонних обстоятельств, таймер может либо запускаться, либо нет. Проблема и лежит в той плоскости, что если таймер запустится сейчас, то это не означает, что он будет запускаться всегда.
HHIMERA писал(а):
Слов нет...
Очень часто этому состоянию сопутствует и отсутствие мыслей.
Сейчас этот форум просматривают: жирафик и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения