Программирование STM8
- RusikOk
- Нашел транзистор. Понюхал.
- Сообщения: 197
- Зарегистрирован: Пн янв 24, 2011 01:51:48
- Откуда: Украина, Киев
- Контактная информация:
Re: Программирование STM8
подскажите какой ток потребления у входа АЦП STM8S? нужно рассчитать впритык по току делитель
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
В ДШ разве не написано? Ну и реально попробовать. Если мне память не изменяет нужно отключить триггер Шмидта для уменьшения потребления.
Re: Программирование STM8
Разбирался на днях с отладочной платой STM8S-Discovery, да потер всю память на чипе, не запомнив дефолтные значения option bytes.
Часть демок теперь не работает как надо. Пол дня прокопался, но так и не разобрался, что там изначально было.
Если у кого есть данная плата, напишите пожалуйста, что у вас в ней прошито в option bytes?
Часть демок теперь не работает как надо. Пол дня прокопался, но так и не разобрался, что там изначально было.
Если у кого есть данная плата, напишите пожалуйста, что у вас в ней прошито в option bytes?
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Программирование STM8
PombI4, а если прошить значениями по умолчанию (factory default) из даташит?
Добавлено after 2 hours 17 minutes 36 seconds:
Как то я это пропустил.
15 апреля вышел SDCC 3.9
SDCC 3.9.0 Feature List:
Support for struct / union assignment.
Optimizations in the stm8 backend relevant to soft float increase Whetstone score by two thirds.
Improvements in rematerialization in the stm8 backend improve code generation for struct, union and arrays.
New stack allocator reduces stack space usage for the stm8, z80, z180, gbz80, r2k, r3ka, tlcs90 backends.
New ez80_z80 backend for eZ80 in Z80 mode.
Removed deprecated sdcclib utility.
New pdk14 backend for Padauk µC with 14-bit wide program memory.
New in-development pdk15 backend for Padauk µC with 15-bit wide program memory.
Особенно радует ускорение теста Whetstone в два раза и рематериализация для STM8 при операциях со структурами, объединениями и массивами. Код, который SDCC генерил до этого, особенно со структурами, меня сильно раздражал.
Присваивание структур и объединений вещь приятная, но мне не в лом было и memcpy() писать.
Что там улучшили в аллоцировании стека я пока не понял.
Развитие поддержки сверхдешевых, но однократно программируемых, Padauk радует, но это уже к STM8 отношения не имеет.
Добавлено after 2 hours 17 minutes 36 seconds:
Как то я это пропустил.
15 апреля вышел SDCC 3.9
SDCC 3.9.0 Feature List:
Support for struct / union assignment.
Optimizations in the stm8 backend relevant to soft float increase Whetstone score by two thirds.
Improvements in rematerialization in the stm8 backend improve code generation for struct, union and arrays.
New stack allocator reduces stack space usage for the stm8, z80, z180, gbz80, r2k, r3ka, tlcs90 backends.
New ez80_z80 backend for eZ80 in Z80 mode.
Removed deprecated sdcclib utility.
New pdk14 backend for Padauk µC with 14-bit wide program memory.
New in-development pdk15 backend for Padauk µC with 15-bit wide program memory.
Особенно радует ускорение теста Whetstone в два раза и рематериализация для STM8 при операциях со структурами, объединениями и массивами. Код, который SDCC генерил до этого, особенно со структурами, меня сильно раздражал.
Присваивание структур и объединений вещь приятная, но мне не в лом было и memcpy() писать.
Что там улучшили в аллоцировании стека я пока не понял.
Развитие поддержки сверхдешевых, но однократно программируемых, Padauk радует, но это уже к STM8 отношения не имеет.
Re: Программирование STM8
Странно - перепрошился через ST VD и все заработало...
А вот через IAR... Сначала работало, а потом после стирания перестало.
При этом, после прошивки через ST VD, options bytes как были нулевыми, так и остались.
А вот через IAR... Сначала работало, а потом после стирания перестало.
При этом, после прошивки через ST VD, options bytes как были нулевыми, так и остались.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Программирование STM8
PombI4, Они не могли быть нулевыми. Большинство option bytes у STM8 парные - прямое и инверсное значение. Например, по-умолчанию, OPT1=0х00, а следующий за ним NOPT1=0хFF
Поэтому просто нулями их так просто не перепишешь.
Подозреваю, что ST VD увидев несоответствие между прямыми и инверсными значениями сам прописал значения по-умолчанию.
Поэтому просто нулями их так просто не перепишешь.
Подозреваю, что ST VD увидев несоответствие между прямыми и инверсными значениями сам прописал значения по-умолчанию.
Re: Программирование STM8
Ну, как реально в памяти они лежали, я не смотрел... А вот в интерфейсе прошивальщика они занулены. Там они не как OPT NOPT отображаются.

- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Программирование STM8
PombI4, про прошивальщик я не в курсе, к сожалению. Прошивки не блокирую, а остальное удобней устанавливать в коде, так как это может зависеть от параметров сборки.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Доброго времени суток. В RM016 указано, что 16 битный регистр TIM1_CNTR имеет теневой регистр для чтения и не имеет для записи. ARR имеет теневой для записи, про чтение вроде как ничего не сказано. И ничего больше я не нашел.
Теперь сам вопрос. Режим захвата, считываю захваченные данные вот так Компиллится в команду LDW. Данные ваще неадекват.
Делаю так. Захваченные данные верные.
На всякий случай еще вот так. Захваченные данные похожи на расчетные, но тоже неверные.
Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?
Или я не ту смазку для лыж выбрал?
Теперь сам вопрос. Режим захвата, считываю захваченные данные вот так
Код: Выделить всё
uint16_t capch;
capch=*((uint16_t*)&TIM2_CCR3H);Делаю так.
Код: Выделить всё
uint16_t capch;
((uint8_t *)&capch)[0]=TIM2_CCR3H;
((uint8_t *)&capch)[1]=TIM2_CCR3L;На всякий случай еще вот так.
Код: Выделить всё
uint16_t capch;
((uint8_t *)&capch)[1]=TIM2_CCR3L;
((uint8_t *)&capch)[0]=TIM2_CCR3H;Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?
Или я не ту смазку для лыж выбрал?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Программирование STM8
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3672468#p3672468"]Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?[/uquote]На странице 167. Там же и последовательность чтения нарисована. Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.Ну или так, если не веришь компилятору
Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать 
Код: Выделить всё
uint16_t capch=(TIM2_CCR3H<<8)|TIM2_CCR3L;Код: Выделить всё
uint16_t capch = TIM2_CCR3H<<8;
capch |= TIM2_CCR3L;- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Спасибо.VladislavS писал(а):На странице 167.
Попробовал предложенных оба варианта. Компиллится в кучу команд в том числе логики и сдвига. IAR, оптимизация максимум в режиме speed.VladislavS писал(а): Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.
В моем варианте переменная capch загружается в 4 команды через аккумулятор.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Программирование STM8
Ну значит IAR ещё не готов к STM8.
Вот смотри как он с AVR-ками расправляется.
Вариант 1.
Вариант 2.
Вот смотри как он с AVR-ками расправляется.
Вариант 1.
Код: Выделить всё
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch = (PORTB<<8) | PORTC;
foo(capch);
for(;;);
}
//------------- Листинг ------------
//int main()
main:
//{
// uint16_t capch = (PORTB<<8) | PORTC;
// foo(capch);
IN R19, 0x18
IN R16, 0x15
OR R16, R19
BREQ ??main_0
SEI
RJMP ??main_1
??main_0:
CLI
//for(;;);
??main_1:
RJMP ??main_1
//}
Код: Выделить всё
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch;
((uint8_t *)&capch)[0]= PORTB;
((uint8_t *)&capch)[1]= PORTC;
foo(capch);
for(;;);
}
//------------- Листинг ------------
//int main()
main:
//{
SBIW R29:R28, 2
// uint16_t capch;
// ((uint8_t *)&capch)[0]= PORTB;
IN R16, 0x18
ST Y, R16
//((uint8_t *)&capch)[1]= PORTC;
IN R16, 0x15
STD Y+1, R16
// foo(capch);
LD R16, Y
LDD R17, Y+1
OR R16, R17
BREQ ??main_0
SEI
RJMP ??main_1
??main_0:
CLI
//for(;;);
??main_1:
RJMP ??main_1
//}
Re: Программирование STM8
Для STM8 не так много компиляторов, тем более бесплатных.VladislavS писал(а):Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Программирование STM8
IAR самый бесплатный из них? 
Не, ну правда, собрать на восьмибиткн uint16_t из двух uint8_t без сдвигов это даже не детский сад.
Не, ну правда, собрать на восьмибиткн uint16_t из двух uint8_t без сдвигов это даже не детский сад.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Решил проверить компильнуть код почти в один в один. А именно вот такой.
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.
Интересный момент, вот это с компиллилось в это
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.
Код: Выделить всё
void foo(uint16_t data)
{
if(data) asm("rim"); else asm("sim");
}
int main()
{
uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
//TIM2_CCR3L++;
foo(capch);
for(;;);
}Интересный момент, вот это
Код: Выделить всё
TIM2_CCR3L++;Код: Выделить всё
TIM2_CCR3L++;
0085A5 C65316 LD A, TIM2_CCR3L
0085A8 4C INC A
0085A9 C75316 LD TIM2_CCR3L, A
Код: Выделить всё
asm("inc TIM2_CCR3L");
0085B0 725C5316 INC TIM2_CCR3LRe: Программирование STM8
[uquote="VladislavS",url="/forum/viewtopic.php?p=3677556#p3677556"]IAR самый бесплатный из них?
[/uquote]
Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен.
Добавлено after 3 minutes 49 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]
Подозреваю, что Вы используете какую-то древнюю версию IAR. По-крайней мере когда я 2 года назад писал для STM8, как раз вышла версия IAR 3.10 взамен старой 2.20 и качество компилируемого кода резко улучшилось. На версии 2.20 был полный шлак.
Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен.
Добавлено after 3 minutes 49 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]
Подозреваю, что Вы используете какую-то древнюю версию IAR. По-крайней мере когда я 2 года назад писал для STM8, как раз вышла версия IAR 3.10 взамен старой 2.20 и качество компилируемого кода резко улучшилось. На версии 2.20 был полный шлак.
Re: Программирование STM8
Бесплатный SDCC http://sdcc.sourceforge.net/VladislavS писал(а):IAR самый бесплатный из них?
Re: Программирование STM8
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Интересный момент, вот это с компиллилось в это
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.[/uquote]
Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
Код: Выделить всё
TIM2_CCR3L++;Код: Выделить всё
TIM2_CCR3L++;
0085A5 C65316 LD A, TIM2_CCR3L
0085A8 4C INC A
0085A9 C75316 LD TIM2_CCR3L, A
Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Нельзя. IAR коммерческий продукт и рассчитывая получить прибыль с продаж, надо все же было постараться сделать компиллятор по умнее. Тем более система команд STM8 заточена под Си, да и ИАРовцы умеют же, видимо не приоритет просто. А то что демо версия подошла под радиолюбительские хотелки, это частный счастливый случайjcxz писал(а):можно считать что он просто бесплатен.
Хрен с ним, придется сильнее напрягать межушный оптимизатор
Добавлено after 1 minute 23 seconds:
И что? Что это меняет? Проверять пока не хочу, но стоит.jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
Добавлено after 21 minute 20 seconds:
3.10.4 У меня.jcxz писал(а):Вы используете какую-то древнюю версию IAR.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Программирование STM8
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]Добавлено after 1 minute 23 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]3.10.4 У меня.[/uquote]Крайняя 3.11.1
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]Да ладно, инлайнит только в путь даже если не просить об этом.
Вариант 1.Вариант 2.
Вариант 3. С глобальной переменной.
На самом деле разница по тактам не так чтобы катастрофична. В случае с локальной переменной надо же и работу со стеком учитывать. Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
И что? Что это меняет? Проверять пока не хочу, но стоит.[/uquote]Это меняет то, что X++ это чтение/модификация/запись и компилятор не имеет права это изменять.jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]3.10.4 У меня.[/uquote]Крайняя 3.11.1
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]Да ладно, инлайнит только в путь даже если не просить об этом.
Вариант 1.
Спойлер
Код: Выделить всё
#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
foo(capch);
for(;;);
}
// --- Листинг ----
//int main()
//{
// uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
/ foo(capch);
main:
LD A, L:0x5315
CLRW X
LD XL, A
CLR A
RLWA X, A
LD A, L:0x5316
LD S:?b1, A
RRWA X, A
OR A, S:?b1
RRWA X, A
RRWA X, A
JREQ L:??main_0
RIM
JRA L:??main_1
??main_0:
SIM
// for(;;);
??main_1:
JRA L:??main_1
//}
Спойлер
Код: Выделить всё
#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch;
((uint8_t *)&capch)[0]= TIM2_CCR3H;
((uint8_t *)&capch)[1]= TIM2_CCR3L;
foo(capch);
for(;;);
}
// --- Листинг ----
/int main()
//{
main:
SUB SP, #0x2
// uint16_t capch;
// ((uint8_t *)&capch)[0]= TIM2_CCR3H;
LD A, L:0x5315
LD (0x1,SP), A
// ((uint8_t *)&capch)[1]= TIM2_CCR3L;
LD A, L:0x5316
LD (0x2,SP), A
//
// foo(capch);
LDW X, (0x1,SP)
JREQ L:??main_0
RIM
JRA L:??main_1
??main_0:
SIM
// for(;;);
??main_1:
JRA L:??main_1
//}
Спойлер
Код: Выделить всё
#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
uint16_t capch;
int main()
{
capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
foo(capch);
for(;;);
}
// --- Листинг ----
//int main()
//{
// ((uint8_t *)&capch)[0]= TIM2_CCR3H;
main:
MOV L:capch, L:0x5315
// ((uint8_t *)&capch)[1]= TIM2_CCR3L;
MOV L:capch + 1, L:0x5316
//
// foo(capch);
LDW X, L:capch
JREQ L:??main_0
RIM
JRA L:??main_1
??main_0:
SIM
//
//for(;;);
??main_1:
JRA L:??main_1
//}
