Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/100: Рейтинг темы: голосов - 100, средняя оценка - 4.73
morvym_yorki
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 600
1

[STM8] delay_ms(), delay_us()?

12.12.2010, 07:42. Просмотров 18367. Ответов 5
Метки нет (Все метки)

Есть ли где-нибудь реализация avr-gcc-шных delayев или любого другого варианта программной задержки для STM8? всю StdPeriphLib перерыл - ничего похожего. Гугел тоже молчит. Пытался написать свой велосипед, но столкнулся с тем, что сей камень позволяет изменение рабочей частоты прямо на ходу. Есть средства для ее опредления в рантайме, но деление двух 32-битных чисел (чтобы определить количество тактов за 1мкс для delay_us) занимает 400 тактов, в то время как 1мкс на 16мгц это 16 тактов! В AVR-libc была вобще double арифметика, но она жестко оптимайзится при компиляции за счет известного F_CPU, а тут надо определять частоту прямо на ходу.
Кто работал с этими камнями, подкиньте идейку? На прерывания вывести тоже сомнительный вариант, ибо во-первых жертвуем одним 16-битным таймером, а во-вторых таймеры тактуются от частоты ядра плюс свой предделитель, т.е. тактирование таймеров тоже может меняться на ходу

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2010, 07:42
Ответы с готовыми решениями:

Функция задержки в stm8 iar - моя реализация delay_us
Когда я начинал програмить на stm8 в среде iar, мне жутко не хватало задержек по типу привычных...

кто сделает экспорт SDCC STM8 -> IAR STM8 ?
а то труды пропадут... https://github.com/eddyem/STM8_samples

STM32F030 delay_ms() или не верная частота????
Создаю проект под IAR в STM32CubeMX. Все отлично компилируется. Но.... У меня написана функция...

Не могу реализовать delay_us, помогите найти ошибку плз
Проц f042 Понадобилось читать 1wire и делать микросекундные задержки, ну я решил, что это раз...

Ассемблер STM8
В связи с тем что ассемблер этих контроллеров описан очень плохо, и с ошибками открываю эту тему, и...

5
yv_s
0 / 0 / 0
Регистрация: 02.02.2010
Сообщений: 1,142
12.12.2010, 08:06 2
Я на MSP430 сделал эти функции на таймере. Именно _delay_ms/us, чтобы код с AVR копи-пастом портировать:)
Получилось так(только аргумент целочисленный, дробные задержки я почти не использую):
Код
#ifndef __DELAYS_H__
#define __DELAYS_H__

volatile uint16_t _delay_flag = 0;

void _delay_us(uint16_t us) {
TACCR0 = us;
while(!_delay_flag)
nop();
_delay_flag = 0;
}

void _delay_ms(uint16_t ms) {
uint16_t i;
for(i = 0; i <= ms; i ++)
_delay_us(1000);
}

interrupt(TIMERA0_VECTOR) TIMERA0_ISR(void) {
_delay_flag = 1;
}

#endif
// плюс инициализация таймера перед использованием
Но тут точный расчет и привязка к внутреннему осциллятору(на MSP430 для таймера можно несколько разных осцилляторов выбрать).
На STM8 точно также можно сделать. А отслеживание частоты - это уж слишком универсально получается, сходу даже применение для изменения частоты на лету не придумывается.
Сделать дефайном да и все. Либо передавать уже пересчитанное значение текущей частоты вторым аргументом в _delay_ms/us.

Кстати, а что используете для прошивки, STM8-Dyscovery? И какой компилятор?
Смотрел SWIM протокол(ну, по которому STM8 прошиваются/отлаживаются), вроде не сильно сложно, на досуге хочу попробовать свой программатор на ft232 сделать(когда наконец-то разберуся, почему она у меня как-то сильно тормозит:)).
0
morvym_yorki
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 600
12.12.2010, 09:25 3
для прошивки дискавери-8 буду использовать, пока кроме распаянного на нем камня другие прошивать не пробовал. свим простой как валенок, но критичный ко времени. тоже была идея сделать на фтшке или авр-ке программатор, но подумал и решил, что вся возня не стоит 400 рублей за дискавери. с учетом того что одна только фтшка 150-200 стоит
0
morvym_yorki
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 600
12.12.2010, 09:32 4
Цитата Сообщение от yv_s
interrupt(TIMERA0_VECTOR) TIMERA0_ISR(void) {
_delay_flag = 1;
}
а разве проц сам не выставляет какого-нибудь флага без прерывания? авр, например, выставляет. по переполнению точно, по совпадению вроде тоже. логичнее было бы проверять его. а то вход-выход из прерывания занимает время на сохранение/возврат контекста, не помню точно, но сравнимое с 16 тактами для 1мкс. т.е. микросекундные задержки совсем не той длительности получаются. не гоняли под профайлером/осциллографом?

а, да. компилятор космик, на 32кб, с родной IDE, плюс попозже попробую IAR
0
morvym_yorki
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 600
12.12.2010, 09:36 5
а по поводу переключения частоты правы вы наверно. нет смысла городить огород. потребление тока у них и так мизерное, да и задача совершенно не критична к энергопотреблению. сделаю на первое время с константной частотой, а та увидим, если понадобится. но вопрос все равно остается открытым на будущее
0
yv_s
0 / 0 / 0
Регистрация: 02.02.2010
Сообщений: 1,142
12.12.2010, 10:02 6
Цитата Сообщение от morvym_yorki
для прошивки дискавери-8 буду использовать, пока кроме распаянного на нем камня другие прошивать не пробовал. свим простой как валенок, но критичный ко времени. тоже была идея сделать на фтшке или авр-ке программатор, но подумал и решил, что вся возня не стоит 400 рублей за дискавери. с учетом того что одна только фтшка 150-200 стоит
Вот то, что он завязан на время, меня и останавливает. Я с ft232 работаю через опенсурсную libftdi, как скорость не пытался выставлять, все равно очень медленно. На прошивку всего 200 байт по SPI AT89S52 уходит ~10секунд!
Это при асинхронном режиме битбанга, в синхронном вобще все виснет. Никак не могу понять в чем проблема.
Думаю плюну на эту libftdi и не выпендриваясь буду использовать libftd2xx от производителя:)
А насчет целесообразности - я маковод, и если не ошибаюсь, Dyscoivery под маком не заведется(хотя TI-Launchpad удалось завести). И к тому же ft232 и ft245 у меня уже есть распаянные:)

Цитата Сообщение от morvym_yorki
Цитата Сообщение от yv_s
interrupt(TIMERA0_VECTOR) TIMERA0_ISR(void) {
_delay_flag = 1;
}
а разве проц сам не выставляет какого-нибудь флага без прерывания? авр, например, выставляет. по переполнению точно, по совпадению вроде тоже. логичнее было бы проверять его. а то вход-выход из прерывания занимает время на сохранение/возврат контекста, не помню точно, но сравнимое с 16 тактами для 1мкс. т.е. микросекундные задержки совсем не той длительности получаются. не гоняли под профайлером/осциллографом?

а, да. компилятор космик, на 32кб, с родной IDE, плюс попозже попробую IAR
Честно говоря, там задержка ±лапоть:) Во-первых по настоящему не очень точно высчитаны такты, во-вторых частота внутреннего осциллятора, от которого тактуюсь, плавает.
Профайлером/осциллографом не смотрел(за неимением:)) но вот софтовый UART с такими задержками вполне сносно работал.
Учитывая, что даже железный UART на AVR без внешнего кварца работает через раз - это достаточно показательный результат:)
0
12.12.2010, 10:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2010, 10:02

STM8 в работе...
По ходу юзания, появляются вопросы, которые вроде уже не вписываются в тему &quot;STM8 Самое начало&quot;,...

stm8 и little-endian
уже около недели в свободное время по вечерам изучаю STM8, знакомые программеры спрашивают, чем они...

stm8 и АЛС318
Всем доброго времени суток. Я на форуме новичок, хотя и давно его читаю. Возник следующий вопрос:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru