Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Dingo
Родился
Сообщения: 7
Зарегистрирован: Чт янв 16, 2014 10:43:00

Re: Программирование STM8

Сообщение Dingo »

HHIMERA Спасибо огромное, помогло)
А где откопали этот "stm8s.h" ???

На офф сайте ST вместе с STM8 I2C optimized examples.
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Программирование STM8

Сообщение slavokhire5 »

Привет котам:)
Подскажите пожалуйста, можно ли прошить STM8s c помощью stm32f0 discovery или других discovery на stm32? В даташите на discovery упоминаний о такой возможности не нашел :(
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Программирование STM8

Сообщение HHIMERA »

Без переделки и смены прошивки - НЕТ...
"Я не даю готовых решений, я заставляю думать!"(С)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Дано: 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 решает проблему, но немое недоумение остается. Вроде ж солидное устройство, а работает только при помощи веревок, палок и грязных тряпок. Чтение эрраты и референса не принесло ни просветления, ни облегчения. Одна тоска по поводу несовершенства мира и печаль за бесцельно прожитые годы. :)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Программирование STM8

Сообщение HHIMERA »

Вставка пары нопов между строками 3 и 4 решает проблему, но немое недоумение остается. Вроде ж солидное устройство, а работает только при помощи веревок, палок и грязных тряпок. Чтение эрраты и референса не принесло ни просветления, ни облегчения.

"Ваше незнание не освобождает от наказания!"(С)
Всё там верно... для UG нужно два дополнительных такта... и NOP'ы там не лишние... Просто если после UG есть ещё настройки, то NOP'ы не нужны... кроме последующего сброса флагов... Между UG и сбросом флагов тоже нужны NOP'ы... иначе они не сбросятся...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

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.

Будет ли правильным подождать пока бит не станет нулем? Или это не является сигналом готовности?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Программирование STM8

Сообщение HHIMERA »

Как по мне... проще два NOP'а... Тем более... в случае дополнительных настроек таймера они могут и не понадобиться... их функции выполнят последующин команды...
"Я не даю готовых решений, я заставляю думать!"(С)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Все правильно, я просто спустил вниз пару строк инициализации, которые шли до UG, а теперь стали после. Проблем с правильной инициализацией таймера это не вызывает. Возмутительно тут другое -- тот же RM0016 нигде на видном месте не предупреждает о каких-то там дополнительных клоках, которые надо выжидать после UG. Мне, во всяком случае, этого обнаружить не удалось.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Программирование STM8

Сообщение HHIMERA »

Да какбэ...

RM0016
17.4.2 Internal clock source (fMASTER)

Figure 44. Control circuit in normal mode, fCK_PSC = fMASTER

показывает что к чему... :)
"Я не даю готовых решений, я заставляю думать!"(С)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Что-то сей замечательный рисунок никаких интимных подробностей про нестандартную ориентацию бита CEN не высвечивает.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Программирование STM8

Сообщение HHIMERA »

Там чётко видно наличие двух тактов после установки бита UG... этого достаточно...
"Я не даю готовых решений, я заставляю думать!"(С)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Там же четко видно, что на CEN оно никак не влияет. Одна сплошная дезинформация.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Программирование STM8

Сообщение HHIMERA »

Дезинформация и звездёж это то, что что-то там не работает или не описано... Всё там работает и всё там описано (пусть и в неявной форме) "согласно купленным билетам"... и 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... всё!!!
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Программирование STM8

Сообщение uldemir »

Три года назад я задавал уже этот вопрос, но может, что за это время изменилось...
Появились ли компиляторы C под stm8s, stm8l под линукс?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

HHIMERA писал(а):CEN тут не причём...


Конечно надуманы. Другие биты можно выставить, но не CEN. И это такая мощная фича, что она тайно присутствует, похоже, во всей линейке STM8 и для всех таймеров. Попробовал четвертый таймер на STM8L051. Для иллюстрации, старт таймера (сразу же после ручного сброса) выполняется инструкцией TIM4_CR1 = 0xFF. Встают все биты, которые могут там встать, но CEN остается в нуле. Примечательно, что поведение программы зависит еще и от неких "оптимизационных" свойств компилятора. Я не зря в исходном сообщении упомянул, что событие воспроизводится с вероятностью 80%. Собирая один и тот же исходник с разными параметрами оптимизации (речь про IAR 1.42), один и тот же ассемблерный код в окне отладчика в этом месте вдруг начинает работать, т. е. злосчастный CEN замечательно устанавливается и таймер запускается. Всегда. Можно заливать в устройство и отдавать в продакшн. Что это? Нюансы выравнивания? Конвейер ? Потусторонние силы? Черта лысого! Это грабли, заботливо разложенные ST-шниками, чтобы программерам жизнь медом не казалась. "Тут играем, тут не играем, здесь жирное пятно - рыбу заворачивали"...
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: Программирование STM8

Сообщение GARMIN »

А почитать инструкцию? Ну, развёл срач на пустом месте.
Для того, чтобы таймер заработал с новыми настройками нужно либо дождаться его переполнения, либо вручную передёрнуть TIM4->EGR = TIM4_EGR_UG;
Про UPDATE EVENT слышал?
Писатель.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

а что должен делать этот код:

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

TIM2_CR1_OPM = 1; // режим единичного прогона таймера
TIM2_CR1_URS = 1; // не поднимать флаги при "ручной" перегрузке счетчиков
TIM2_EGR_UG = 1; // сама "ручная" перегрузка
TIM2_CR1_CEN = 1; // запуск

если, согласно RM для таймера2 нет "режима единичного прогона таймера"
Изображение
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

ответ на на вопрос "что делает код" не получил, если хотелось задержку получить, то я для 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);
}

все прекрасно работает
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

oleg110592 писал(а):ответ на на вопрос "что делает код" не получил


Между тем, я дал вам исчерпывающий ответ. Таймер должен запуститься, досчитать до конца и остановиться. Мне удивительно, что я объясняю такие вещи.

TIM3->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM; //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
все прекрасно работает


Эта инструкция разворачивается в несколько команд на ассемблере, выполнение которых занимает больше времени, чем требуется для переинициализации таймера. В таком виде оно просто обязано работать "прямо из каропки". Уберите "или" перед знаком равно, чтобы получилась только одна команда "MOV", тогда и экспериментируйте. UG тоже неплохо бы одной командой устанавливать. Но опять же, не могу утверждать, что на STM32 оно будет вести себя так же, как и на STM8. Не смотря на подобную периферию, разница в аппаратных реализациях очевидна, что вполне может допускать разные варианты, которые я не проверял. Пока лишь могу утверждать, что "внеприродная аномалия" наблюдалась мной на двух камнях -- STM8S103F3 и STM8L051F3. Во избежание разночтения или недопонимания, вновь обращаю внимание, что суть "рукотворного феномена" в том, что в зависимости от сторонних обстоятельств, таймер может либо запускаться, либо нет. Проблема и лежит в той плоскости, что если таймер запустится сейчас, то это не означает, что он будет запускаться всегда.

HHIMERA писал(а):Слов нет...

Очень часто этому состоянию сопутствует и отсутствие мыслей.
Ответить

Вернуться в «Разные вопросы по МК»