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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

Китайцы теперь вместо STM8S003 используют N76E003, по ногам совместимы, $0.22
https://ru.aliexpress.com/item/N76E003A ... 40439.html
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

"The N76E003 is an embedded flash type, 8-bit high performance 1T 8051-based microcontroller. The instruction set is fully compatible with the standard 80C51 and performance enhanced."
Как-то мне так сразу и расхотелось. :)
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

Есть еще дешевле, по 15р http://s.aliexpress.com/rmEVvMr2

Для массового производства наверно альтернатива. Но для мелочей скорее боком выйдет
Лучше уж stm32f030f4 по 30р или stm8s105c6 по 35
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Не могу запустить шим на stm8s003. Таймер 1, канал 4(PC4), шим 100Гц.

Перечитал даташит вдоль и поперек, но все ровно не хватает ума додумать. 2 день мучаюсь.

Вот код
Спойлер

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


void TIM1_Init(void)
{
	GPIOC->DDR |= GPIO_PIN_4;
	GPIOC->CR1 |= GPIO_PIN_4;
	GPIOC->CR2 |= GPIO_PIN_4;

	CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
	TIM1->CR1 &= ~TIM1_CR1_CEN; //OFF
	TIM1->CR1 |= TIM1_CR1_ARPE; 

	TIM1->PSCRH = 0x00; 
	TIM1->PSCRL = 0x08; // 16MHz/8 = 2MHz

	TIM1->ARRH = 0x4e; //2MHz/20000 = 100Hz частота шима
        TIM1->ARRL = 0x20; 
	//D = 100% = 20000
	//D = 50% = 10000	

	TIM1->CCMR4 |= 0x68; //PWM MODE, Output compare 4 preload enable
	TIM1->CCER2 &= ~TIM1_CCER2_CC4P; //PC4
	TIM1->CCER2 |= TIM1_CCER2_CC4E;
	TIM1->BKR |= TIM1_BKR_MOE;

	TIM1->CCR4H = 0x00; //D=0%
	TIM1->CCR4L = 0x00;

	TIM1->IER &= ~TIM1_IER_UIE; 	
	TIM1->CR1 |= TIM1_CR1_CEN; //ON;

	TIM1->CCR4H = 0x3a; //15000, D = 75%
	TIM1->CCR4L = 0x98;	
}


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

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

Сообщение a5021 »

Сходу ошибок не вижу, но приметил, что вы исходите из предположения, что МК у вас затактирован частотой 16мгц. Это может быть так и не так. После включения у МК частота клока 2мгц. Если вы в остальной части программы этого не меняете, то 2 мгц и будет. Дальше вы ее делите прескалером на 9. Цифра 8 в регистре прескалера означает деление на 9, а не на 8. 2мгц / 9 = 222,222кгц. Дальше вы это дело "делите" на 20 тыс, что в итоге дает частоту следования импульсов на выходе PC4 в 11,(1) герц.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Тактирование от внешнего кварца.

Добавил перед настройкой таймера функцию настройки юарта - 16МГц 19200 бод, и вывод сообщений в терминал. Сообщения приходят без ошибок. Значит частота настроена верно.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

О чем-то не о том вы говорите. Сейчас залил ваш код в МК, шим-сигнал частотой около 90 герц на выходе PC4 присуствует.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Странно..У меня что лог. анализатор ни чего не показывает на PC4, что светодиод подключенный к этому выводу.
Все перепроверил кучу раз.

Компилятор sdcc:

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

SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.4.0 #8981 (Jan 10 2015) (Linux)
published under GNU General Public License (GPL)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

вот на всякий - в реальной поделке работает, правда 1 канал TIM1. Недостаток - надо option bit alternate function [AFR0] включать:

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

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)    
}
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="alex38779",url="/forum/viewtopic.php?p=3435262#p3435262"]Странно..У меня что лог. анализатор ни чего не показывает на PC4, что светодиод подключенный к этому выводу.
Все перепроверил кучу раз.[/uquote]
Компилировал ИАР-ом, смотрел осциллографом. Частота и коэффициент заполнения соответствуют значениям регистров. Кварца у меня нет, тактировалось от внутреннего генератора. Полный текст под спойлером:
Спойлер

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

#include "stm8s.h"

void TIM1_Init(void)
{
   GPIOC->DDR |= GPIO_PIN_4;
   GPIOC->CR1 |= GPIO_PIN_4;
   GPIOC->CR2 |= GPIO_PIN_4;

   CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
   TIM1->CR1 &= ~TIM1_CR1_CEN; //OFF
   TIM1->CR1 |= TIM1_CR1_ARPE;

   TIM1->PSCRH = 0x00;
   TIM1->PSCRL = 0x08; // 16MHz/8 = 2MHz

   TIM1->ARRH = 0x4e; //2MHz/20000 = 100Hz частота шима
        TIM1->ARRL = 0x20;
   //D = 100% = 20000
   //D = 50% = 10000   

   TIM1->CCMR4 |= 0x68; //PWM MODE, Output compare 4 preload enable
   TIM1->CCER2 &= ~TIM1_CCER2_CC4P; //PC4
   TIM1->CCER2 |= TIM1_CCER2_CC4E;
   TIM1->BKR |= TIM1_BKR_MOE;

   TIM1->CCR4H = 0x00; //D=0%
   TIM1->CCR4L = 0x00;

   TIM1->IER &= ~TIM1_IER_UIE;    
   TIM1->CR1 |= TIM1_CR1_CEN; //ON;

   TIM1->CCR4H = 0x3a; //15000, D = 75%
   TIM1->CCR4L = 0x98;   
}

int main( void )
{
  CLK->CKDIVR = 0;

  TIM1_Init();
  while (1);
}
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 953
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

Попробуй в конце так:
TIM1->CR1 |= TIM1_CR1_CEN; // разрешить таймер
TIM1->EGR |= TIM1_EGR_UG; // обновить установки
И проверь в отладчике результаты записи в регистры таймера
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

У SDCC такой отладчик, что поневоле засомневаешься, пользоваться им или нет.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

А под линукс то и выбора нет, только sdcc для stm8. Из отладчиков есть gui для gdb, зовется ddd https://www.gnu.org/software/ddd/

На отладчике программа залипает на следующей строке - CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
Убираю ее и все идет дальше. Но толку нет.

Вижу такой вариант - у меня кривой stm8s.h, я его взял с сайта st.

Вообщем я чет намучился и установил в виртуалку 7 винду + iar, в нем скомпилировал этот код. Прошил - все работает.

Спасибо за помощь всем!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

[uquote="alex38779",url="/forum/viewtopic.php?p=3435704#p3435704"]установил в виртуалку 7 винду + iar[/uquote]

Лучше STVD.
А еще лучше SES и stm32, если так уж охота красноглазить...
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="alex38779",url="/forum/viewtopic.php?p=3435704#p3435704"]А под линукс то и выбора нет[/uquote]
cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3435717#p3435717"]cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.[/uquote]

Я имел ввиду нативные компиляторы. Без вайнов и т.д.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Хотя интереснее бы разобраться, почему собранный SDCC не работает. Проблема какая-то ненормальная.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Доброго времени суток. МК STM8S.
Ковыряюсь с внешними прерываниями. У такого конттроллера они очень упрощены. И нет флага внешнего прерывания. Ну он конечно же есть, но для софта недоступный.
Для теста специально брекпоинтился в обработчике и генерил внешнее событие.
Попытался сбросить этот внутренний флаг запретом/разрешением внеш. прерывания на пине. Это ничего не дало. Ну наверное логично, так как прерывание для всего порта идет.
Забубенил вот такой макрос

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

Clear_Fl_Ext_D    EXTI_CR1_PDIS=0;EXTI_CR1_PDIS=0x3;
, т.е просто переключил режимы возникновения событий. Ну вроде как сбросился этот флаг. Опять же в RM написано, что их можно переключать только находясь в приоритете Level3. Специально попробовал находясь в Level2, действительно перестал работать такой сброс. Т.е. если что еще прерывания надо запрещать для такой операции.

В общем ничего лучшего я не придумал, если нужен будет такой сброс.

Добавлено after 1 hour 46 minutes 51 second:
Вот что обнаружил, сразу то и не догадаешься такое прочитать. Видимо баг включенный в RM. Я про регистр D_CR1.
11.9.4 Port x control register 1 (Px_CR1)
Address offset: 0x03
Reset value: 0x00 except for PD_CR1 which reset value is 0x02.
Добавлено after 1 minute 59 seconds:
Хотя на этой ноге SWIM висит. Видимо не баг.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Klepko
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт апр 25, 2008 03:44:41
Откуда: Воронеж

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

Сообщение Klepko »

Всем привет! Столкнулся с проблемой при разыменовывании указателя. Пользую cosmic. Передаю в функцию адрес на массива void spisendbuf(&massiv, byte) в функции spisendbuf(*massiv,byte) пытаюсь копировать значение в переменную bufer = *massiv но вместо значения получаю в буфере значение старшего адреса указателя *massiv. Как правильно копировать переменную на которую указывает указатель
Всех убить! Всё отобрать!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Klepko, имя массива и есть адрес его первого элемента.

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

void copy_array(uint8_t * buf)
 {  uint8_t test,i;
	
	 for(i=0;i<8;i++)
	 {
		 test= *buf++;
		 
	 }
 }	 


uint8_t my_array[20]={1,45,68,34,78,23,98,56,3,0,165};
	
	
	copy_array(my_array);


Или с индексами :

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

void copy_array(uint8_t * buf)
 {  uint8_t test,i;
	
	 
	 for(i=0;i<8;i++)
	 {
		 test= buf[i];
		 
	 }
 }	 



И еще вариант передачи :

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

copy_array(&my_array[0]);
Ответить

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