Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пн июл 16, 2018 09:00:43

Китайцы теперь вместо STM8S003 используют N76E003, по ногам совместимы, $0.22
https://ru.aliexpress.com/item/N76E003A ... 40439.html

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

Пн июл 16, 2018 23:31:35

"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."
Как-то мне так сразу и расхотелось. :)

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

Вт июл 17, 2018 12:17:05

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

Для массового производства наверно альтернатива. Но для мелочей скорее боком выйдет
Лучше уж stm32f030f4 по 30р или stm8s105c6 по 35

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

Чт авг 09, 2018 18:01:47

Не могу запустить шим на 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;   
}


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

Чт авг 09, 2018 18:35:52

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

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

Чт авг 09, 2018 20:07:22

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

Добавил перед настройкой таймера функцию настройки юарта - 16МГц 19200 бод, и вывод сообщений в терминал. Сообщения приходят без ошибок. Значит частота настроена верно.

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

Чт авг 09, 2018 22:52:46

О чем-то не о том вы говорите. Сейчас залил ваш код в МК, шим-сигнал частотой около 90 герц на выходе PC4 присуствует.

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

Пт авг 10, 2018 15:34:12

Странно..У меня что лог. анализатор ни чего не показывает на 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)

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

Пт авг 10, 2018 16:49:45

вот на всякий - в реальной поделке работает, правда 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)   
}

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

Пт авг 10, 2018 17:34:37

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

Компилировал ИАР-ом, смотрел осциллографом. Частота и коэффициент заполнения соответствуют значениям регистров. Кварца у меня нет, тактировалось от внутреннего генератора. Полный текст под спойлером:
Спойлер
Код:
#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);
}

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

Пт авг 10, 2018 19:14:52

Попробуй в конце так:
TIM1->CR1 |= TIM1_CR1_CEN; // разрешить таймер
TIM1->EGR |= TIM1_EGR_UG; // обновить установки
И проверь в отладчике результаты записи в регистры таймера

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

Пт авг 10, 2018 19:55:02

У SDCC такой отладчик, что поневоле засомневаешься, пользоваться им или нет.

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

Сб авг 11, 2018 13:32:24

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

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

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

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

Спасибо за помощь всем!

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

Сб авг 11, 2018 13:47:48

установил в виртуалку 7 винду + iar


Лучше STVD.
А еще лучше SES и stm32, если так уж охота красноглазить...

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

Сб авг 11, 2018 14:05:02

А под линукс то и выбора нет

cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.

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

Сб авг 11, 2018 14:41:13

cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.


Я имел ввиду нативные компиляторы. Без вайнов и т.д.

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

Сб авг 11, 2018 15:34:39

Хотя интереснее бы разобраться, почему собранный SDCC не работает. Проблема какая-то ненормальная.

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

Вс авг 26, 2018 12:23:28

Доброго времени суток. МК 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 висит. Видимо не баг.

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

Пн сен 03, 2018 07:47:11

Всем привет! Столкнулся с проблемой при разыменовывании указателя. Пользую cosmic. Передаю в функцию адрес на массива void spisendbuf(&massiv, byte) в функции spisendbuf(*massiv,byte) пытаюсь копировать значение в переменную bufer = *massiv но вместо значения получаю в буфере значение старшего адреса указателя *massiv. Как правильно копировать переменную на которую указывает указатель

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

Пн сен 03, 2018 11:29:04

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]);
Ответить