Программирование STM8
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Программирование STM8
res_v = ADC_DB4RH<< 8;
res_v |= ADC_DB3RL;
res_t = ADC_DB3RH << 8;
res_t |= ADC_DB4RL;
res_v |= ADC_DB3RL;
res_t = ADC_DB3RH << 8;
res_t |= ADC_DB4RL;
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: Программирование STM8
Упс. Это результат правки кода после цельного дня игр с переписыванием этой части.
Но и написанная верно она не работает как требуется. Т.е. в принципе не происходит ежесекундного обновления результатов АЦП. Как только происходит один круг преобразования, всё падает. Данные в регистрах не обновляются, хотя таймеры продолжают работать. И другие прерывания продолжают работать. Всё в общем работает, но результаты АЦП не меняются, какими были в момент первого пуска, такими и остаются до снятия питания.
Хотя EOC я снимаю, ADON после измерения увожу в 0, а при старте измерения дважды шлю туда единицу. Если убрать SCAN и читать из DRL то всё работает... а вот через DBxR не хочет. Пробовал играться с битом DBUF -- который разрешает буфферизацию. Вроде бы в режиме SCAN он сам выставляется... но в любом случае его запись ничего не изменила.
Но и написанная верно она не работает как требуется. Т.е. в принципе не происходит ежесекундного обновления результатов АЦП. Как только происходит один круг преобразования, всё падает. Данные в регистрах не обновляются, хотя таймеры продолжают работать. И другие прерывания продолжают работать. Всё в общем работает, но результаты АЦП не меняются, какими были в момент первого пуска, такими и остаются до снятия питания.
Хотя EOC я снимаю, ADON после измерения увожу в 0, а при старте измерения дважды шлю туда единицу. Если убрать SCAN и читать из DRL то всё работает... а вот через DBxR не хочет. Пробовал играться с битом DBUF -- который разрешает буфферизацию. Вроде бы в режиме SCAN он сам выставляется... но в любом случае его запись ничего не изменила.
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Программирование STM8
1. на время обработки каких-то прерываний запрещать другие прерывания
2. минимизировать код внутри прерываний, перенеся его в main
а вообще непонятно, зачем сканирование, если запуск по таймеру...
2. минимизировать код внутри прерываний, перенеся его в main
а вообще непонятно, зачем сканирование, если запуск по таймеру...
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: Программирование STM8
1. Если я в обрабочике таймера запрещу прерывания... то как я уйду в прерывание АЦП?
2. Код и так минимальный, вроде бы. Запуск измерения, или его обработка в пару ифов. Единственно что регулярно вертится в прерываниях -- динамическая индикация на TIM4... но её по другому особенно и не написать.
3. Ну вроде как чтобы максимально быстро отсканировать и уйти обратно в сон (сон ещё не прописан, но полагается).
2. Код и так минимальный, вроде бы. Запуск измерения, или его обработка в пару ифов. Единственно что регулярно вертится в прерываниях -- динамическая индикация на TIM4... но её по другому особенно и не написать.
3. Ну вроде как чтобы максимально быстро отсканировать и уйти обратно в сон (сон ещё не прописан, но полагается).
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Программирование STM8
а если другое прерывание выдернет из этого прерывания, а потом из этого прерывание выдернет третье, а потом опять первое, что вообще тогда будет с мозгами?
Нужно запрещать и разрешать. Динамическую индикацию делать в майне, что он там пустой крутится-то...
https://prog-cpp.ru/micro-interrupts/
это совершенно не нужно. нужно что-то типа так:
Нужно запрещать и разрешать. Динамическую индикацию делать в майне, что он там пустой крутится-то...
https://prog-cpp.ru/micro-interrupts/
Код: Выделить всё
switch(led_num){
case 0:
PC_ODR_bit.ODR4 = 1;
PC_ODR_bit.ODR5 = 0;
PC_ODR_bit.ODR6 = 0;
PC_ODR_bit.ODR7 = 0;
led_num = (bat_level > 1) ? 1 : 0;
break;
case 1:
PC_ODR_bit.ODR4 = 0;
PC_ODR_bit.ODR5 = 1;
PC_ODR_bit.ODR6 = 0;
PC_ODR_bit.ODR7 = 0;
led_num = (bat_level > 2) ? 2 : 0;
break;
case 2:
PC_ODR_bit.ODR4 = 0;
PC_ODR_bit.ODR5 = 0;
PC_ODR_bit.ODR6 = 1;
PC_ODR_bit.ODR7 = 0;
led_num = (bat_level > 3) ? 3 : 0;
break;
case 3:
PC_ODR_bit.ODR4 = 0;
PC_ODR_bit.ODR5 = 0;
PC_ODR_bit.ODR6 = 0;
PC_ODR_bit.ODR7 = 1;
led_num = 0;
break;
}это совершенно не нужно. нужно что-то типа так:
Код: Выделить всё
PC_ODR &= ((0x10 << led_num++) | 0x0F); // Это неправильно, верный вариант VladislavS написал в следующем сообщении
if (led_num > 3) led_num = 0;
Последний раз редактировалось BlackKilkennyCat Чт ноя 05, 2020 08:16:44, всего редактировалось 4 раза.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Программирование STM8
это совершенно не нужно. нужно что-то типа так:
Это неправильно. Правильно Код: Выделить всё
PC_ODR &= ((0x10 << led_num++) | 0x0F);Код: Выделить всё
PC_ODR=(PC_ODR&0x0F)|(0x10<<led_num++);- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: Программирование STM8
Продолжаем эксперименты. пытался отказаться от SCAN. Ну вот не работает и всё... если убрать этот прикол с if(seconds%2) то какой-то один канал замечательно работает, всё чётко.
TIM4 убрал, индикацию в главный цикл перенёс.
TIM4 убрал, индикацию в главный цикл перенёс.Код: Выделить всё
#pragma vector = TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF_handler(void)
{
if (seconds%2) ADC_CSR_bit.CH = 3;
else ADC_CSR_bit.CH = 4;
PD_CR2_bit.C23 = 0;
ADC_CR1_bit.ADON = 1;
ADC_CR1_bit.ADON = 1;
TIM2_SR1_bit.UIF = 0;
}
#pragma vector = ADC1_EOC_vector
__interrupt void ADC1_EOC_handler(void)
{
if(seconds%2){
res_v = ADC_DRH << 8;
res_v |= ADC_DRL;}
else{
res_t = ADC_DRH << 8;
res_t |= ADC_DRL;
}
ADC_CR1_bit.ADON = 0;
PD_CR2_bit.C23 = 1;
if (res_t > 903 && (mode == 2 || mode == 3)) PD_ODR_bit.ODR1 = 1; //Heater on
else PD_ODR_bit.ODR1 = 0; //Heater off
bat_level = 0;
if (res_v > 513) bat_level = 1;
else if (res_v > 490) bat_level = 2;
else if (res_v > 478) bat_level = 3;
else if (res_v > 466) bat_level = 4;
seconds++;
ADC_CSR_bit.EOC = 0;
}Re: Программирование STM8
а если другое прерывание выдернет из этого прерывания, а потом из этого прерывание выдернет третье, а потом опять первое
Такое невозможно в принципе. Почему - читайте описание работы контроллера прерываний.Кратко: Если 1-е было прервано 2-м, значит у 2-го приоритет выше. А у 3-го значит - ещё выше. Менее приоритетное прерывание (или с таким же приоритетом) не может прерывать более приоритетное. Если конечно специально не стараться, перенастраивая регистры приоритетов прерываний внутри ISR.
Так что - "запрещать и разрешать" прерывания в ISR необходимо только если на каком-то участке ISR нужно запретить более приоритетные прерывания.
Re: Программирование STM8
Не могу принять строку по уарт.
UART1_DeInit();
// Конфигурация UART на отправку 8 бит данных без контроля PARITY, модуль будет работать на прием и отправку.
UART1_Init( 9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig( UART1_IT_RXNE_OR, ENABLE); // Включаем прерывание от приема данных.
enableInterrupts(); // Включаем все прерывания.
UART1_Cmd( ENABLE); // Включаем UART.
uint8_t priem[5]; // Массив куда будем принимать данные.
uint8_t count=0; // Счетчик принимаемых данных.
//Обработчик для приема данных.
INTERRUPT_HANDLER( UART1_RX_IRQHandler, 18){
if(UART1_GetFlagStatus( UART1_FLAG_RXNE)){// если прерывание по флагу готовности данных в приёмном буфере
// и флаг готовности данных сброшен - ПРИНИМАЕМ ДАННЫЕ В БУФЕР
priem[count]= UART1_ReceiveData8(); // Копируем данные в массив.
count++; // Прибавляем счетчик принятых данных.
if( count==5){count=0; // Если счетчик равен 5, то приняли все данные, сбрасываем его.
}
}
}
Строка с другого мк приходит-проверяю терминалом, но массив заполняется, только если 5 раз отправлю строку. Что тут не так?
UART1_DeInit();
// Конфигурация UART на отправку 8 бит данных без контроля PARITY, модуль будет работать на прием и отправку.
UART1_Init( 9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig( UART1_IT_RXNE_OR, ENABLE); // Включаем прерывание от приема данных.
enableInterrupts(); // Включаем все прерывания.
UART1_Cmd( ENABLE); // Включаем UART.
uint8_t priem[5]; // Массив куда будем принимать данные.
uint8_t count=0; // Счетчик принимаемых данных.
//Обработчик для приема данных.
INTERRUPT_HANDLER( UART1_RX_IRQHandler, 18){
if(UART1_GetFlagStatus( UART1_FLAG_RXNE)){// если прерывание по флагу готовности данных в приёмном буфере
// и флаг готовности данных сброшен - ПРИНИМАЕМ ДАННЫЕ В БУФЕР
priem[count]= UART1_ReceiveData8(); // Копируем данные в массив.
count++; // Прибавляем счетчик принятых данных.
if( count==5){count=0; // Если счетчик равен 5, то приняли все данные, сбрасываем его.
}
}
}
Строка с другого мк приходит-проверяю терминалом, но массив заполняется, только если 5 раз отправлю строку. Что тут не так?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Программирование STM8
Для начала объявите priem и count как volatile. А дальше видно будет.
Скорость порта правильно выставлена?
Скорость порта правильно выставлена?
Re: Программирование STM8
volatile не помогло, скорость 9600 у обоих, отправляю с ESP8266 на stm8, в ардуинской проге для ESP скорость 9600 прописан и для stm8 тоже, если по первому символу в массиве делать действие-то работает же, значит принимает нормально, а чтобы по всем символам -то надо 5 раз отправлять.
Re: Программирование STM8
Всё, отбой, дело было не в бобине...принимает строку он норм, сортировка принятого...есп вначале свою инфу кидает по уарт, после этого обнулять на начало нужно массив.
Re: Программирование STM8
Доброго времени суток, коллеги. Взялся осваивать микроконтроллеры серии STM8. Установил среду IAR, пытаюсь зашить простейшей прогой, с помощью программатора STLink контроллер STM8S105C на самодельной макетке, не выходит. Есть здесь спецы по среде IAR?
Спасибо.
Спасибо.
- RusikOk
- Нашел транзистор. Понюхал.
- Сообщения: 197
- Зарегистрирован: Пн янв 24, 2011 01:51:48
- Откуда: Украина, Киев
- Контактная информация:
Re: Программирование STM8
на ноге VCAP установлен конденсатор с правильным номиналом?
вы выбрали st-Link в качестве отладчика в свойствах проэкта ИАР?
вы выбрали st-Link в качестве отладчика в свойствах проэкта ИАР?
Re: Программирование STM8
С выв. 6 VCAP, конденсатор 1 мкф идет на землю.
Все так, выбираю - Options => Debugger => Driver => ST-LINC.
В качестве руководства использую одну статейку в нете, сейчас еще раз попробую все проделать, если не выйдет, опишу все по шагово, может сможете поправить меня, где я туплю.))
Спасибо.
Добавлено after 37 minutes 11 seconds:
Попутно вопрос:
В приведенном примере программы используется камень STM8S103F3P6, и в дефайне
пишется #include "iostm8s103f3.h"
На моей макетке стоит камень STM8S105C6T6, мне данную строку изменить так
#include "iostm8s105c6.h" ?
И еще, в одном источнике синтаксис с кавычками #include "_________", а в другом месте так
#include <_________> , как правильно ?
Добавлено after 1 hour 16 minutes 4 seconds:
В общем, результат такой.
----------
Вначале, на диске C => Program Fails (x86) => IAR Systems => Embedded Workbench 8.3 =>
=> stm8 создаю пустую папку projekts.
Далее, запускаю IAR как и рекомендуют, от имени администратора, и далее все так, как здесь
https://www.drive2.ru/b/1318037/
Набираю в редакторе прогу, вот от сюда
http://www.count-zero.ru/2016/iar_stm8/
только дефайн чуть подправил, так как камень чуток другой.
Сохраняю все написанное File => Save.
Подключаю к компу через STLink, макетную плату.
В конце жму Download and Debug, просит указать имя, указываю такое же.
Зачем ??!! я ведь только что сохранил, да ладно.
Что то там думает, и выдает ошибку, скрин прилагаю.

Error while running C/C++ Compiler, это переводится как - ошибка при запуске компилятора.
Захожу в настройки компилятора, просто что бы проверить, там выбран С, вот скрин

Что я делаю не так ?
Спасибо.
---------
Попробовал с подключенным программатором нажать просто компилировать, ( Compile ),
то в добавок к прежней, выдает еще и ошибку
searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\stm8\inc\c\"
типа, что то там искало и не нашло ?
--------
Упс...., сейчас нашел ошибку, исправил "iostm8s105c5.h" на "iostm8s105c6.h", моя невнимательность,
сообщение об ошибках изменились, теперь так

и STLINK пару раз моргнул зеленым светодиодом вместо красного.
Что в переводе гласит -
Не удалось запустить сеанс отладки.
Либо инициализация отладчика завершилась неудачно, либо файл «C \ ... \ blink_1.out» отсутствует, поврежден или имеет неподдерживаемый формат.
В окне журнала отладки может быть дополнительная информация.
---
Кто что думает по данному сообщению ?
Все так, выбираю - Options => Debugger => Driver => ST-LINC.
В качестве руководства использую одну статейку в нете, сейчас еще раз попробую все проделать, если не выйдет, опишу все по шагово, может сможете поправить меня, где я туплю.))
Спасибо.
Добавлено after 37 minutes 11 seconds:
Попутно вопрос:
В приведенном примере программы используется камень STM8S103F3P6, и в дефайне
пишется #include "iostm8s103f3.h"
На моей макетке стоит камень STM8S105C6T6, мне данную строку изменить так
#include "iostm8s105c6.h" ?
И еще, в одном источнике синтаксис с кавычками #include "_________", а в другом месте так
#include <_________> , как правильно ?
Добавлено after 1 hour 16 minutes 4 seconds:
В общем, результат такой.
----------
Вначале, на диске C => Program Fails (x86) => IAR Systems => Embedded Workbench 8.3 =>
=> stm8 создаю пустую папку projekts.
Далее, запускаю IAR как и рекомендуют, от имени администратора, и далее все так, как здесь
https://www.drive2.ru/b/1318037/
Набираю в редакторе прогу, вот от сюда
http://www.count-zero.ru/2016/iar_stm8/
только дефайн чуть подправил, так как камень чуток другой.
Сохраняю все написанное File => Save.
Подключаю к компу через STLink, макетную плату.
В конце жму Download and Debug, просит указать имя, указываю такое же.
Зачем ??!! я ведь только что сохранил, да ладно.
Что то там думает, и выдает ошибку, скрин прилагаю.
Error while running C/C++ Compiler, это переводится как - ошибка при запуске компилятора.
Захожу в настройки компилятора, просто что бы проверить, там выбран С, вот скрин
Что я делаю не так ?
Спасибо.
---------
Попробовал с подключенным программатором нажать просто компилировать, ( Compile ),
то в добавок к прежней, выдает еще и ошибку
searched: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\stm8\inc\c\"
типа, что то там искало и не нашло ?
--------
Упс...., сейчас нашел ошибку, исправил "iostm8s105c5.h" на "iostm8s105c6.h", моя невнимательность,
сообщение об ошибках изменились, теперь так
и STLINK пару раз моргнул зеленым светодиодом вместо красного.
Что в переводе гласит -
Не удалось запустить сеанс отладки.
Либо инициализация отладчика завершилась неудачно, либо файл «C \ ... \ blink_1.out» отсутствует, поврежден или имеет неподдерживаемый формат.
В окне журнала отладки может быть дополнительная информация.
---
Кто что думает по данному сообщению ?
Последний раз редактировалось sergey.UA Ср дек 23, 2020 12:50:48, всего редактировалось 1 раз.
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Программирование STM8
sergey.UA писал(а):Что я делаю не так ?
Практически всё. Начиная с того, что изучаете программирование мк на непрофильном drive2
http://vital.lib.tsu.ru/vital/access/ma ... :000522729 там справа вверху "загрузить" синенькая
https://www.compel.ru/wordpress/wp-cont ... -STM8S.pdf
https://knigifb2.org/tekhnicheskaya-lit ... -djvu.html
https://portal.tpu.ru/SHARED/t/TORGAEV/ ... sobie2.pdf
Re: Программирование STM8
BlackKilkennyCat кое что исправил в заголовочном файле, ушло в предыдущее сообщение, взгляните.
Почему на непрофильном, да потому что только там смог найти более менее
подробное описание что к чему. А эту тему на радио коте только вчера нашел, уже несколько дней не получается, вот и решил здесь поспрашивать.
Еще в одном лишь месте увидел тонкости, это вот здесь
http://easyelectronics.ru/arm-uchebnyj- ... oekta.html
По поводу компиляции в hex, может из-за этого и не получается, буду пробовать.
----------
За книги и статьи спасибо. Первую ранее скачал, вторая не рассматривает среду IAR, третью читаю уже, где то 20% прочел, четвертую то же ранее скачал, лежит, буду так же осваивать.
---------
В Options => Output Converter, поставил галочку на Generate additional output, и выбрал Binary.
Основное сообщение об ошибке такое же, а вот что в логе

По ходу не видит мой камень через SWIM интерфейс ?
Чуть позже еще раз все прозвоню и проверю на макетке.
А вы что скажете по этому логу, что может быть?
Спасибо.
Почему на непрофильном, да потому что только там смог найти более менее
подробное описание что к чему. А эту тему на радио коте только вчера нашел, уже несколько дней не получается, вот и решил здесь поспрашивать.
Еще в одном лишь месте увидел тонкости, это вот здесь
http://easyelectronics.ru/arm-uchebnyj- ... oekta.html
По поводу компиляции в hex, может из-за этого и не получается, буду пробовать.
----------
За книги и статьи спасибо. Первую ранее скачал, вторая не рассматривает среду IAR, третью читаю уже, где то 20% прочел, четвертую то же ранее скачал, лежит, буду так же осваивать.
---------
В Options => Output Converter, поставил галочку на Generate additional output, и выбрал Binary.
Основное сообщение об ошибке такое же, а вот что в логе
По ходу не видит мой камень через SWIM интерфейс ?
Чуть позже еще раз все прозвоню и проверю на макетке.
А вы что скажете по этому логу, что может быть?
Спасибо.
Re: Программирование STM8
GARMIN вы имеете ввиду, выбор чипа ?

Так я его изначально выбрал.
----------
Пробую подключить программатор STLINK-V2 с помощью утилиты напрямую к макетке. Что то какие то
проблемы, не видит камень хоть ты тресни. Я просто перед этим тусовал папку с этой прогой по диску С, возможно из -за этого глюк начался. А ранее, год назад примерно прошивал программатором пару STM32, все было гуд. Что сейчас делать, ума не приложу.(((
Добавлено after 5 hours 4 minutes 29 seconds:
В общем так, переустановил заново дрова и утилиту на STLink программатор.
Еще раз просмотрел и прозвонил макетную плату, там вроде все норм.
Подключал микроконтроллер к программатору вот по этой схеме.

Вот сам разъем программатора.

Нумерация пинов на программаторе и на макетке. совпадает.

Вот в реале.

----------
Так вот, при попытке подключится (прочитать хоть что либо из камня) прогой ST-LINK Utility, выдает
вот такие ошибки.

Перевел ошибку -
Не могу подключиться к цели!
Пожалуйста, выберите режим «Connect Under Reset» в Target -> Setting menu и попробуйте еще раз.
Если вы пытаетесь подключиться к низкочастотному приложению, выберите более низкий режим SWD Frecuency в меню Target -> Settings.
Пробовал как написано, в меню ставить галочку на против Connect Under Reset, пофиг,
такие же ошибки.
---------
Кто может помочь, подключайтесь.
Так я его изначально выбрал.
----------
Пробую подключить программатор STLINK-V2 с помощью утилиты напрямую к макетке. Что то какие то
проблемы, не видит камень хоть ты тресни. Я просто перед этим тусовал папку с этой прогой по диску С, возможно из -за этого глюк начался. А ранее, год назад примерно прошивал программатором пару STM32, все было гуд. Что сейчас делать, ума не приложу.(((
Добавлено after 5 hours 4 minutes 29 seconds:
В общем так, переустановил заново дрова и утилиту на STLink программатор.
Еще раз просмотрел и прозвонил макетную плату, там вроде все норм.
Подключал микроконтроллер к программатору вот по этой схеме.
Вот сам разъем программатора.
Нумерация пинов на программаторе и на макетке. совпадает.
Вот в реале.
----------
Так вот, при попытке подключится (прочитать хоть что либо из камня) прогой ST-LINK Utility, выдает
вот такие ошибки.
Перевел ошибку -
Не могу подключиться к цели!
Пожалуйста, выберите режим «Connect Under Reset» в Target -> Setting menu и попробуйте еще раз.
Если вы пытаетесь подключиться к низкочастотному приложению, выберите более низкий режим SWD Frecuency в меню Target -> Settings.
Пробовал как написано, в меню ставить галочку на против Connect Under Reset, пофиг,
такие же ошибки.
---------
Кто может помочь, подключайтесь.

