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

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

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

Сообщение oleg110592 »

OKF писал(а):потому как корпус датчика неразборной.
OKF писал(а):После разборки, внутри обнаружился msp430
кто мешает применить msp430? Цены на msp430G2 вполне гуманны http://ru.aliexpress.com/item/NEW-MSP43 ... 38134.html
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Никто. Это один из примеров компактности, низкопотребляемости и уличного исполнения.
"Неразборной" - это для них, а не для нас!
Реклама
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

А кто-то катается на велике в -40 да хотябы даже в -20... Оно-то конечно...
Применить MSP430 могут помешать обстоятельства. Не будешь же изучать совершенно новую архитектуру, ещё один язык, еще одну среду только лишь для одного проекта.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

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

Сообщение scorpi_0n »

OKF писал(а):Это один из примеров компактности, низкопотребляемости и уличного исполнения.
Вот именно что один из примеров. Микрочип уже давно включился в борьбу за низкое энергопотребление со своей XLP. И для простых применений типа подрыгать ногой или передать что-то по UART ещё не факт что MSP будет более удачным в этом смысле.
Alexeyslav писал(а): Применить MSP430 могут помешать обстоятельства. Не будешь же изучать совершенно новую архитектуру, ещё один язык, еще одну среду только лишь для одного проекта.
Это да. Хотя там страшного ничего и нет тот же Си тот же ИАР но одноразовость действительно оптимизма не вселяет.
STM8/STM32 с лёгкостью покрывают большинство повседневных задач. Поэтому заморачиваться на что-то другое без особой на то причины и смысла никакого нет.
Реклама
Эиком - электронные компоненты и радиодетали
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Alexeyslav писал(а):А кто-то катается на велике в -40 да хотябы даже в -20...
Не катается. Но проверить работоспособность могу. Нужно только дождаться -20. В Крыму.
Реклама
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

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

Сообщение scorpi_0n »

И уж если пошёл разговор о потреблении. Может кому будет интересно.

Старый вброс от Микрочип от 2009г.
http://ww1.microchip.com/downloads/en/A ... 01267a.pdf

Ответная истерика от TI от 2009г.
http://www.ti.com/lit/wp/slay015/slay015.pdf

А это уже более свежее состояние XLP от Микрочип от 2013г.
http://ww1.microchip.com/downloads/en/D ... 09941F.pdf
Прямо уже TI не указан но "Competitor" как бы намекает. Как можно заметить уже не всё так однозначно. Микрочип явно старается как может и даже у него неплохо получается.
Реклама
Alex2016
Родился
Сообщения: 2
Зарегистрирован: Вс дек 27, 2015 22:06:18

Чтение регистра TIM3_CNTR на STM8

Сообщение Alex2016 »

Всем привет, котаны. Помогите пожалуйста начинающему нубасу. :)

Надо сделать декодер для RC5 протокола, в руках оказался камень stm8s105c6...Столкнулся вот с такой проблемой, по алгоритму выполнения надо считывать временные интервалы между внешними прерываниями на выводе PB7, решил использовать таймер TIM3, судя по документации на камень, у таймера есть регистры TIM3_CNTRH и TIM3_CNTRL они помечены как R/W и служат для хранения текущего значения счетчика.

Для получения значения использую вот такую строчку

unsigned short Timer_value |= ((TIM3_CNTRH << 8)|TIM3_CNTRL);
Но получаю только нулевое значение :cry:
в доке на на камень, никаких "особенностей" по регистру нет, errata тоже молчит :(

Подскажите пожалуйста, в чем может быть причина такого поведения. Код ниже.
(пилил на IAR 1.40.1 под 7 виндой)


#include "iostm8s105c6.h"

void InitialiseInternalSystemClock()
{
CLK_ECKR = 0; // очистка регистра внешнего тактирования
CLK_ICKR = 0; // очистка регистра внетреннего тактирования(сбрасывание делителя частоты)
CLK_ICKR_HSIEN = 1; // подключаем внутренний высокоскоростной генератор

while (CLK_ICKR_HSIRDY == 0) {} // ожидание устойчивой работы внетреннего высокоскоростного генератора

CLK_CKDIVR = 0; // максимальная частота работы генератора
CLK_PCKENR1 = 0xff; // TIM3 => врубаем все
CLK_PCKENR2 = 0xff; //
CLK_CCOR = 0; // отключения подачи на ножку тактового сигнала
CLK_HSITRIMR = 0; // выключить калибровку генератора
CLK_SWR = 0xe1; // HSI выбран как источник тактирования
CLK_SWCR = 0; // сброс флага переключения
CLK_SWCR_SWEN = 1; // переключиться на HSI
while (CLK_SWCR_SWBSY != 0) {} // ожидание переключения
}


unsigned char MIN_THRESHOLD_SHORT_PULSE = 889;
unsigned char MAX_THRESHOLD_SHORT_PULSE = 1333;
unsigned char MIN_THRESHOLD_LONG_PULSE =1334;
unsigned char MAX_THRESHOLD_LONG_PULSE = 2220;


unsigned short RC5_buffer = 0;
unsigned char bit_counter = 0;
unsigned char not_korr = 0;
unsigned char centre = 0;

unsigned short Timer_value = 0;

#pragma vector=0x06
__interrupt void EXTI_PB7(void) //Обработчик прерывания
{
//TIM3_CR1_CEN = 1;
not_korr = 1;
Timer_value = ((TIM3_CNTRH << 8) | TIM3_CNTRL); // ВОТ ЗДЕСЬ НИЧЕГО НЕ ПРОИСХОДИТ.
TIM3_CNTRL = 0;
TIM3_CNTRH = 0;

if(bit_counter == 0)
{
TIM3_CR1_CEN = 1;
RC5_buffer |= (PB_IDR_bit.IDR7 << bit_counter);
bit_counter++;
centre = 1;
}
else
{
// ОБРАБОТКА КОРОТКОГО ИМПУЛЬСА
if((Timer_value > MIN_THRESHOLD_SHORT_PULSE) && (Timer_value < MAX_THRESHOLD_SHORT_PULSE))
{
if(centre == 1)
{
centre = 0;
not_korr = 0;
}
else
{
centre = 1;
RC5_buffer |= (~PB_IDR_bit.IDR7 << bit_counter);
bit_counter++;
not_korr = 0;
}
}
// ОБРАБОТКА ДЛИННОГО ИМПУЛЬСА
if((Timer_value > MIN_THRESHOLD_LONG_PULSE) && (Timer_value < MAX_THRESHOLD_LONG_PULSE))
{
RC5_buffer |= (~PB_IDR_bit.IDR7 << bit_counter);
bit_counter++;
not_korr = 0;
}
if( not_korr == 1)
{
TIM4_CR1_CEN = 0; RC5_buffer = 0; bit_counter = 0; // Ошибка чтения
}
if(bit_counter == 14)
{
TIM4_CR1_CEN = 0;
RC5_buffer = 0;
}
TIM4_CR1_CEN = 1;
}
}



void PB7_Interrupt_init()
{
PB_DDR_bit.DDR7=0; //0-вход
PB_CR1_bit.C17=1; //1-подтяжка
PB_CR2_bit.C27=1; //1-прерывания разрешены

EXTI_CR1_bit.PBIS = 3; // 11: Rising and falling edge
}

void TIM3_init()
{
TIM3_PSCR = 4; // Делитель 2^4 = 16 => 1 МГц
TIM3_ARRH = 0;
TIM3_ARRL = 0;
//TIM3_IER_UIE = 1; // Включаем флаг обновления таймера (разрешить прерывания)
TIM3_CR1_CEN = 1; // включаем таймер

}



int main( void )
{
asm("sim");
InitialiseInternalSystemClock();
PB7_Interrupt_init();
TIM3_init();
asm("rim");
while (1)
{

}

return 0;
}
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Чтение регистра TIM3_CNTR на STM8

Сообщение Pnjom-Penb »

Alex2016 писал(а):// ВОТ ЗДЕСЬ НИЧЕГО НЕ ПРОИСХОДИТ.
Хотите сказать, что в остальных местах что-то происходит? Что за компилятор, который молчит на такое:

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

unsigned char MIN_THRESHOLD_SHORT_PULSE = 889;
unsigned char MAX_THRESHOLD_SHORT_PULSE = 1333; 
unsigned char MIN_THRESHOLD_LONG_PULSE =1334; 
unsigned char MAX_THRESHOLD_LONG_PULSE = 2220;
, и чего Вы ждете от переменных, инициализированных таким вот боком? Точно ли при этом MAX больше MIN? :)))

Кроме того, Вы уверены, что процедура "EXTI_PB7" вообще вызывается?

P.S. Если Timer_value меняется в прерывании, то она волатильная и скрывать этот факт от компилятора означает ставить себе грабли на будущее. ;)
Alex2016
Родился
Сообщения: 2
Зарегистрирован: Вс дек 27, 2015 22:06:18

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

Сообщение Alex2016 »

Что за компилятор, который молчит на такое:
unsigned char MIN_THRESHOLD_SHORT_PULSE = 889;
unsigned char MAX_THRESHOLD_SHORT_PULSE = 1333;
unsigned char MIN_THRESHOLD_LONG_PULSE =1334;
unsigned char MAX_THRESHOLD_LONG_PULSE = 2220;
:facepalm: действительно, такие значения в char не влезут, заменил на unsigned short :oops:
Но IARовский компилятор не агрился на такую писанину :dont_know:
Кроме того, Вы уверены, что процедура "EXTI_PB7" вообще вызывается?
Да, выполнение кода заходит в обработчик прерывания, когда нажимаешь на кнопку пульта,я тестировал в дебаге.
Если Timer_value меняется в прерывании, то она волатильная и скрывать этот факт от компилятора означает ставить себе грабли на будущее.
Вот за этот совет, вялики дзякуй :beer:

P.s оказывается, что чтение из счетного регистра буферизирован :))
вместо:

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

volatile unsigned short Timer_value |= ((TIM3_CNTRH << 8)|TIM3_CNTRL);
Корректнее писать:

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

Timer_value = TIM3_CNTRH << 8;
Timer_value |= TIM3_CNTRL;
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

Alex2016 писал(а):Но IARовский компилятор не агрился на такую писанину :dont_know:
Вы из тех, кто считает, что warnings придумали трусы? А Pe069 и вовсе действует на Вас, как красная тряпка на быка? :)))
Alex2016 писал(а):Корректнее писать:

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

...
Timer_value |= TIM3_CNTRL;
Это присвоение упомянуто уже трижды - один раз как "равно" и дважды, как "или равно" - а зачем побитово ИЛИть с предыдущим значением? А теперь вот еще и только с младшей его частью...? :shock:
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Ну так первой строчкой мы установили старшую часть (TIM3_CNTRH сдвинутый на 8 бит) младшая при этом равна нулю. Второй строчкой OR-им младшую часть в ту же переменную, а по нулям значение очень хорошо ложится 1 в 1.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

Alexeyslav писал(а):Ну так первой строчкой мы установили старшую часть (TIM3_CNTRH сдвинутый на 8 бит) младшая при этом равна нулю. Второй строчкой OR-им младшую часть в ту же переменную, а по нулям значение очень хорошо ложится 1 в 1.
Вы тоже не поняли моего вопроса. О том, что младший разряд, при сдвиге к старшим, заполняется нулями, даше хреновые-химеры знают, не надо никого равнять с ними - вопрос конечно же был о другом:
Alex2016 писал(а):Изображение
Как я уже говорил, это присвоение было упомянуто трижды и все три раза по-разному... так вот было интересно - нафига было в процитированном варианте ИЛИть-то с битами предыдущего результата?
Вложения
codingSTM8_f1.png
(2.57 КБ) 1673 скачивания
Последний раз редактировалось Pnjom-Penb Пт янв 01, 2016 23:53:34, всего редактировалось 1 раз.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Ещё раз... к чему твои дурные вопросы??? ТС не дочитал референс... пробовал выпутаться из ситуации по разному... там что угодно можно было увидеть... Когда ему указали на порядок чтения-записи...он указал решение в послесловии...
И вообще... тебе не кажется странным... что тебя вообще никто не понимает... похоже что и даже ты сам???
"Я не даю готовых решений, я заставляю думать!"(С)
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

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

Сообщение Pnjom-Penb »

HHIMERA писал(а):вообще никто не понимает
Меньшинство - это не никто. И по-мне - лучше быть с ними, чем с тем большинством, что типа тебя.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Как сделать такое же от STM32, но для STM8 в IAR:
Спойлер

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



#define F_APB1 20000000UL
void delay_ms(uint16_t delay)
{
    TIM14->PSC = F_APB1 / 1000 + 1; //устанавливаем предделитель
    TIM14->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
    TIM14->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
    TIM14->CR1 |= (TIM_CR1_CEN | TIM_CR1_OPM); //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
    while ((TIM14->CR1 & TIM_CR1_CEN) != 0);
}
void delay_mc(uint16_t delay)
{
    TIM14->PSC = F_APB1 / 1000000 + 1; //устанавливаем предделитель
    TIM14->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
    TIM14->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
    TIM14->CR1 |= (TIM_CR1_CEN | TIM_CR1_OPM); //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
    while ((TIM14->CR1 & TIM_CR1_CEN) != 0);
}



    GPIO_ResetBits(GPIOA, GPIO_Pin_14);
    GPIO_SetBits(GPIOF, GPIO_Pin_0);
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

service47 писал(а):Как сделать такое же...
можно как нибудь так:

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

void delay_1ms()
{
    TIM2->SR1 &= ~TIM2_SR1_UIF;
    TIM2->PSCR = 0x06; // //Предделитель на 2^6=64 16000000/64 = 250000 Hz
    TIM2->ARRH = 0; ///Значение перезагрузки 250000/250 = 1000 Гц
    TIM2->ARRL = 250;
    TIM2->CR1 |= TIM2_CR1_CEN; // Разрешаем счет.
    while((TIM2->SR1 & TIM2_SR1_UIF)==0);
}

uint16_t c = 500; //delay 500ms
    while(--c)
    {
        delay_1ms();
    }
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Спасибо, а как это сделать для STM8:
Спойлер

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

void Configure_PA0(void) 
{
    /* Set variables used */
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  
    // Enable clock for GPIOA 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // Enable clock for SYSCFG 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
    // Set pin as input 
    PA_DDR_bit.DDR0 = 0; // Set PA0 as input
    PA_ODR_bit.ODR0 = 0; // Latch "1" in output register
    PA_CR1_bit.C10  = 1; // Input with pull-up
    PA_CR2_bit.C20  = 0; // External interrupt disabled
    //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // Tell system that you will use PA0 for EXTI_Line0 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
    EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4
                          | EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8
                          | EXTI_Line9 | EXTI_Line10 | EXTI_Line11 | EXTI_Line12
                          | EXTI_Line13 | EXTI_Line14 | EXTI_Line15 | EXTI_Line16
                          | EXTI_Line17 | EXTI_Line18 | EXTI_Line19 | EXTI_Line20
                          | EXTI_Line21 | EXTI_Line22 | EXTI_Line23 | EXTI_Line25
                          | EXTI_Line26 | EXTI_Line27 | EXTI_Line31);/**/
    // PA13 is connected to EXTI_Line0 
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    // Enable interrupt 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    // Interrupt mode 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    // Triggers on rising and falling edge 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    // Add to EXTI 
    EXTI_Init(&EXTI_InitStructure);
 
    // Разрешаем прерывания в периферии для выводов 0
    EXTI->IMR |=(EXTI_IMR_MR0);
   /* 
    // Configure external interrupts
    CPU_CFG_GCR_bit.AL = 1; // Interrupt-only activation level (IRET causes the CPU to go back to Halt mode)
    EXTI_CR1_bit.P0IS = 0x02; // EXTI0 on falling edge only
    //ITC_SPR3_bit.VECT8SPR  = 0x03; // EXTI0 IRQ level 3 (high priority) (EXTI0 IRQ = Vector 8)
    asm("RIM"); // Enable global interrupts (enable priorities)
    */
    // Add IRQ vector to NVIC 
    // PA0 is connected to EXTI_Line0, which has EXTI0_IRQn vector 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
    // Set priority 
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
    // Set sub priority 
    //NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    // Enable interrupt 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    // Add to NVIC 
    NVIC_Init(&NVIC_InitStructure);
    NVIC_EnableIRQ(EXTI0_1_IRQn);
    NVIC_SetPriority(EXTI0_1_IRQn,0);
}

 GPIO_ResetBits(GPIOA, GPIO_Pin_14);
 GPIO_SetBits(GPIOF, GPIO_Pin_0);
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

см. STM8S/A Standard peripheral library http://www.st.com/web/catalog/tools/FM1 ... 4/PF258009
пример в папке FWLib\examples\EXTI
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

service47 писал(а):Как сделать такое же от STM32, но для STM8 в IAR:
Да строчку в строчку... Для TIM1 уж точно... Для других таймеров... с учётом особенностей прескалера... Таймера то похожи...
А вообще... смысла в этом никакого нет... только минус таймер... Этот идиотизм только для Мега-Пых ногодрыга и годится...
"Я не даю готовых решений, я заставляю думать!"(С)
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

В проекте добавлены:
Спойлер

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

#include "stm8l15x_conf.h"
#include "stm8l15x_it.h"

#include "stm8l15x.h"

#include "stm8l15x_adc.h"
#include "stm8l15x_aes.h"
#include "stm8l15x_beep.h"
#include "stm8l15x_clk.h"
#include "stm8l15x_comp.h"
#include "stm8l15x_dac.h"
#include "stm8l15x_dma.h"
#include "stm8l15x_exti.h"
#include "stm8l15x_flash.h"
#include "stm8l15x_gpio.h"
#include "stm8l15x_i2c.h"
#include "stm8l15x_irtim.h"
#include "stm8l15x_itc.h"
#include "stm8l15x_iwdg.h"
#include "stm8l15x_lcd.h"
#include "stm8l15x_pwr.h"
#include "stm8l15x_rst.h"
#include "stm8l15x_rtc.h"
#include "stm8l15x_spi.h"
#include "stm8l15x_syscfg.h"
#include "stm8l15x_tim1.h"
#include "stm8l15x_tim2.h"
#include "stm8l15x_tim3.h"
#include "stm8l15x_tim4.h"
#include "stm8l15x_tim5.h"
#include "stm8l15x_usart.h"
#include "stm8l15x_wfe.h"
#include "stm8l15x_wwdg.h"
Файлы .с тоже добавлены. Но:
Error[Pe020]: identifier "TIM1_SR1_bit" is undefined
Error[Pe020]: identifier "TIM1_CR1" is undefined и т.д.

Если же добавить из самого IAR'а:
#include "iostm8.h"
#include <iostm8l051f3.h>
и закомментировать:
//#include "stm8l15x.h"
то:
Error[Pe256]: invalid redeclaration of type name "__BITS_PA_ODR" (declared at line 45 of "D:\...\iostm8l051f3.h 45

Какие файлы должны быть добавлены для STM8L051F3?
Ответить

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