Программирование STM8
Re: Программирование STM8
Так RM0016 же. Кой-какие нюансы по регистрам еще в даташите на сам камень могут быть.
-
Chettuser
Re: Программирование STM8
Там что то совсем не густо, думал что где то есть подробнее, с примерами.
Re: Программирование STM8
После кодинга СТМ32 это, как минимум, звучит странно. При полном непонимании можно брать сниппетсы от СТМ32Ф0, для понимания логики работы периферии, с учётом различия регистров конечно.
Re: Программирование STM8
Некий набор примеров можно найти в "STM8S optimized examples package". Они, правда, уже довольно древние и могут иметь проблемы с компиляцией IAR-ом, но в целом по ним можно посмотреть, как управляться с периферией без SPL.
- ptr128
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Чт окт 06, 2016 21:12:07
- Откуда: Южное Бутово
Re: Программирование STM8
Chettuser писал(а):Ткните носом в документ с описанием регистров STM8?
Если без примеров, то только в Reference Manual (RM0016). Но без примеров очень тяжело, почему я и использую SPL в качестве документации, о чем и писал выше.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Программирование STM8
ptr128 писал(а):Есть еще кто, столь же уверенный, что это не бага в SPL?
на всякий проверил на большом брате (TDM-GCC-32):
Спойлер
Код: Выделить всё
#include <stdio.h>
#include <iostream>
#include <conio.h>
uint8_t tim2sr2;
/** TIM2 Flags */
typedef enum
{
TIM2_FLAG_UPDATE = ((uint16_t)0x0001),
TIM2_FLAG_CC1 = ((uint16_t)0x0002),
TIM2_FLAG_CC2 = ((uint16_t)0x0004),
TIM2_FLAG_CC3 = ((uint16_t)0x0008),
TIM2_FLAG_CC1OF = ((uint16_t)0x0200),
TIM2_FLAG_CC2OF = ((uint16_t)0x0400),
TIM2_FLAG_CC3OF = ((uint16_t)0x0800)
} TIM2_FLAG_TypeDef;
void TIM2_ClearFlag(TIM2_FLAG_TypeDef TIM2_FLAG)
{
tim2sr2 = (uint8_t)(~((uint8_t)((uint8_t)TIM2_FLAG >> 8)));
printf("TIM2->SR2 = 0x%X \n", tim2sr2);
tim2sr2 = (uint8_t)(~((uint8_t)(TIM2_FLAG >> 8)));
printf("TIM2->SR2 = 0x%X", tim2sr2);
}
int main(void)
{
TIM2_ClearFlag(TIM2_FLAG_CC2OF);
getch();
return 0;
}результат:
TIM2->SR2 = 0xFF
TIM2->SR2 = 0xFB
Re: Программирование STM8
Сравнение компиляторов для STM8: A comparison of C compilers targeting the STM8.
Скорость выполнения (больше лучше):

Размер кода (меньше лучше):

Скорость выполнения (больше лучше):

Размер кода (меньше лучше):

- ptr128
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Чт окт 06, 2016 21:12:07
- Откуда: Южное Бутово
Re: Программирование STM8
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Re: Программирование STM8
То что ИАР один из лучших для СТМ8 почему-то и не удивляет. Об этом уже писано переписано. Тем более что у иаровцев еще есть над чем работать в плане оптимизации.
Re: Программирование STM8
scorpi_0n писал(а):Тем более что у иаровцев еще есть над чем работать в плане оптимизации.
А так же любителям асма будет интересно знать ,что инлайн асм у IAR никакой...
Re: Программирование STM8
Вчера решил попробовать программный USB на stm8s103f3p примеры нашел самодвигающейся мыши. сколько не пытался девайс прошитый даже не опознается сниффером. pc6 D-/pc7 D+. Кто-нибудь пробовал эти примеры какие выложены в сети товарища Железнякова?
-
aerokostia
- Родился
- Сообщения: 1
- Зарегистрирован: Пн июл 20, 2015 10:40:55
Re: Программирование STM8
Всем доброго времени суток. Вот начал постигать тайны микроконтроллеров. Приобрел себе STM8S-DISCOVERY. По интернет урокам, статейкам, гайдам сумел засветить светодиод и заставить его мигать. Дальше захотел сделать, что бы он светился при нажатии кнопки. И тут я застрял. Она сенсорная и никак не могу понять, как она общается с МК. Уже 4й день роюсь в инетах в поисках решения. Пролистал ПДФки с оф. сайта, форумы, но без примера не пойму. Работаю в IAR, язык С. Прошу помочь в этом деле. Было бы хорошо увидеть пример кода с комментариями 
Re: Программирование STM8
Привет.
Написал свой нехилый криптозагрузчик, потратил кучу времени, и в конце с ужасом обнаружил, что таблица прерываний не передвигается..... я то думал что с помощью служебных регистров она как то привязывается, т.е. работает загрузчик - работает основная таблица, загрузилась прошивка - активировал работу с другой таблицей... Оказалось нет, она всегда расположена в начале FLASH...
Даже не знаю теперь что делать...
1 - если бы в моем буте прерываний не использовалось, можно было бы сразу там указать адреса нового места... Но у меня загрузчик использует несколько прерываний, т.е просто так туда не впишешь перенаправления на таблицу прерываний пользовательской прошивки...
2 - переносить загрузчик вверх тоже не хочу, т.к. хочу использовать защиту от записи загрузочной области...
3 - Как думаете, как быть???
Написал свой нехилый криптозагрузчик, потратил кучу времени, и в конце с ужасом обнаружил, что таблица прерываний не передвигается..... я то думал что с помощью служебных регистров она как то привязывается, т.е. работает загрузчик - работает основная таблица, загрузилась прошивка - активировал работу с другой таблицей... Оказалось нет, она всегда расположена в начале FLASH...
Даже не знаю теперь что делать...
1 - если бы в моем буте прерываний не использовалось, можно было бы сразу там указать адреса нового места... Но у меня загрузчик использует несколько прерываний, т.е просто так туда не впишешь перенаправления на таблицу прерываний пользовательской прошивки...
2 - переносить загрузчик вверх тоже не хочу, т.к. хочу использовать защиту от записи загрузочной области...
3 - Как думаете, как быть???
Re: Программирование STM8
Она работает так же, как и любая другая кнопка. Меняет логический уровень на пине - высокий (лог.1) или низкий (лог.0). Нужно просто считать уровень на пине микроконтроллера.aerokostia писал(а):И тут я застрял. Она сенсорная и никак не могу понять, как она общается с МК.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
МК ST8S103F3.
Пробую запустить какой-нибудь PWM на таймере 1, канал 4. Или хотя бы вообще что-нибудь запустить на Т1.
Вот один из вариантов кода. Среда IAR для STM8. То что строки закомментированы, не обращайте внимание. Просто пробовал разные варианты и с копипастил из кода текущую.
ШИМ не работает. Больше всего смущает что не только ШИМ не работает, а что не меняется коэффициенты деления и счетчик считает всегда до "верха" (хотя в регистры PSCR и ARR все пишется) . Специально включил прерывание по переполнению чтобы там дергать ногой, чтобы отследить изменения частоты. Все время частота одна, не важно какой предделитель и какой ARR.
С таймером 2 ШИМ не пробовал, но предделитель работает и ARR тоже. Что-то у меня похоже лыжи не едут с TIM1.
Пробую запустить какой-нибудь PWM на таймере 1, канал 4. Или хотя бы вообще что-нибудь запустить на Т1.
Вот один из вариантов кода. Среда IAR для STM8. То что строки закомментированы, не обращайте внимание. Просто пробовал разные варианты и с копипастил из кода текущую.
Спойлер
Код: Выделить всё
//Настройка таймера 1
//настройка порта
PC_DDR=MASK_PC_DDR_DDR4; //Pc4 выход
PC_CR1=MASK_PC_CR1_C14; //пушпул
PC_CR2=MASK_PC_CR2_C24; //10MHz
//PC_ODR^=MASK_PC_ODR_ODR4;
CLK_PCKENR1|=1<<7; //включение тактирования таймера 1
//TIM1_PSCRL=(160-1)&0x00FF; //предделитель так что таймер досчитает до 1000 за 10мс
//TIM1_PSCRH=(160-1)>>8;
//TIM1_ARRL=(255)&0x00FF; //считать будем максимум до тысячи
//TIM1_ARRH=(255)>>8;
//TIM1_CCR4L=(128)&0x00FF; //Регистр сравнения
//TIM1_CCR4H=(128)>>8;
TIM1_CCER2=MASK_TIM1_CCER2_CC4E | MASK_TIM1_CCER2_CC4P;// CH4 таймера 1 как выход и полярность
TIM1_CCMR4=( 0x6<<4) | MASK_TIM1_CCMR4_OC4PE;//PWM моде и буферное обновление регистра сравнения.
//TIM1_CR1=//MASK_TIM1_CR1_ARPE;// | MASK_TIM1_CR1_DIR;// | MASK_TIM1_CR1_OPM; //буферное обновление максимума счета и однократный счет
TIM1_CR2=1;//Bit 0CCPC: Capture/compare preloaded control
//TIM1_BKR =0x80; // OC and OCN outputs are enabled if their respective enable bits are set (CC/E in Tim1_CCERi)
//TIM1_RCR=0xFF;
TIM1_IER=1;
TIM1_CR1|=MASK_TIM1_CR1_CEN; //запускаем таймерС таймером 2 ШИМ не пробовал, но предделитель работает и ARR тоже. Что-то у меня похоже лыжи не едут с TIM1.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Программирование STM8
Регистры вроде 8-мибитные?//TIM1_ARRL=(255)&0x00FF; //считать будем максимум до тысячи
//TIM1_ARRH=(255)>>8;
....
Может пригодится настройка шим для 1 канала для S003, там еще альтернативную функцию надо было включить для PC3 в OPTION BYTE
Код: Выделить всё
void TIM1_init(void) // Настройка таймера 1
{
//PWM output signal frequency = TIM1 counter clock/(TIM1_ARR + 1)
//Channel x duty cycle = [TIM1_CCRxx/(TIM1_ARR + 1)] * 100
TIM1->PSCRH = 0x00;
TIM1->PSCRL = 0x00;
TIM1->ARRH = 0x0F;
TIM1->ARRL = 0x9F;
TIM1->CCMR1 |= (uint8_t)0x60; //110: PWM mode 1 - In up-counting, channel 1 is active as long as TIM1_CNT < TIM1_CCR1,
TIM1->CCER1 |= TIM1_CCER1_CC1E; //CH1 compare Enable
TIM1->CCR1H = 0x07;
TIM1->CCR1L = 0xD0;
TIM1->CR1 |= TIM1_CR1_CEN;
TIM1->BKR |= TIM1_BKR_MOE; // OC and OCN outputs are enabled if their respective enable bits are set (CC/E in Tim1_CCERi)
}- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Да там раньше другие числа стояли, значительно больше 255, расчетные. Это сейчас всякие пробыне варианты, не думал что застряну в лыжах на асфальте на таком вопросе.oleg110592 писал(а):Регистры вроде 8-мибитные?
В оптион байтах вроде только ремапятся альтернативные функции. Да бог с ними, сам таймер то как то криво работает, частота не делится не растет кокос и не ограничивается верх счета. И другого МК нет затестить.
Добавлено after 1 hour 25 minutes 18 seconds:
Завел я и таймер 1 и PWM. Глючил и я и IAR. Ошибка была в том, что я записывал "16 битные" регистры ногами младшим вперед. А IAR скотина такая, почему то в железной отладке отображал значения регистров верно . Кроме того, поменяв местами старший со младшим байты при записи эффекта никакого не давало. Ладно поглядел дизассемблер, компилятор насрал на то что я поменял местами регистры, и записывал в том же неправильном порядке, пока я проект не очистил. Видать такая оптимизация.
В общем как всегда, затык из-за какой-то "мелочи".
-
kedr63
Re: Программирование STM8
При использовании таймеров в режиме PWM в STM8 порты не нужно настраивать. В примерах STDPL есть.
в регистры можно хоть 32 битные значения указывать, просто младшие разряды возьмутся.
Спойлер
так попробуйте- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Программирование STM8
в примерах паранойя приведения типов, может не зря:
Код: Выделить всё
...
/* Set the Prescaler value */
TIM2->PSCR = (uint8_t)(0);
/* Set the Autoreload value */
TIM2->ARRH = (uint8_t)(0);
TIM2->ARRL = (uint8_t)(0xFF);
/* Reset the Output Compare Bits & Set the Ouput Compare Mode */
TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~TIM2_CCMR_OCM)) |
(uint8_t)TIM2_OCMODE_PWM1);
...Re: Программирование STM8
Немогу найти примеров перевода МК в режим сна(halt mode). МК - stm8s103. Может кто подскажет?

