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

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

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

Сообщение oleg110592 »

Мне удивительно, что я объясняю такие вещи.

моя твоя не понимай(с), наверное это очень секретная разработка - клещами вытягивать нужно :)
хотелось бы тоже разобраться - непонятно для чего именно используется этот код - если просто "запуститься, досчитать до конца и остановиться", то какова же польза от этого кода - можно просто заменить, например четырьмя NOPами и вопросов бы не было (NOPы у стмов, думаю корректно работают).
А если логически рассуждать для чего может нужен "режим единичного прогона таймера", кроме как для организации задержки, в голову не приходит других вариантов.
А по коду непонятно почему TIM2_CR1_OPM = 1; вначале, логичнее было бы перезапустить таймер а уж потом... указать какой режим и запустить.
Зачем нужен TIM2_CR1_URS = 1;? Вроде для прерываний используется. Где загрузка ARR?
Так может попробовать:

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

TIM2_CR1_URS = 1; // не поднимать флаги при "ручной" перегрузке счетчиков
TIM2_EGR_UG = 1; // сама "ручная" перегрузка
TIM2_CR1_OPM = 1; // режим единичного прогона таймера
TIM2_CR1_CEN = 1; // запуск
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

oleg110592 писал(а):моя твоя не понимай(с), наверное это очень секретная разработка - клещами вытягивать нужно :)

Так оно и не принципиально в контексте обсуждаемого вопроса. Я заостряюсь на самой аппаратной проблеме, а не на прикладном программном алгоритме.

хотелось бы тоже разобраться - непонятно для чего именно используется этот код - если просто "запуститься, досчитать до конца и остановиться", то какова же польза от этого кода - можно просто заменить, например четырьмя NOPами и вопросов бы не было (NOPы у стмов, думаю корректно работают).

Как избежать проблемы с запуском таймера я описывал в самом первом сообщении по этому вопросу.

А если логически рассуждать для чего может нужен "режим единичного прогона таймера", кроме как для организации задержки, в голову не приходит других вариантов.

А мне приходит. :) Представьте, что в линию надо выдать управляющий сигнал в виде установки уровней в точной временной последовательности (единицу держим столько-то, ноль потом столько-то и т.п.). Можно задержками от импульса к импульсу время отсчитывать, а можно повесить это дело на разные каналы таймера, где по событию переполнения счетчика соответствующего канала будет выставляться нужный уровень. Второе решение и точнее и проще в описании. Запуск таймера в "однопроходном" режиме удобен тем, что не надо отвлекаться на остановку таймера и возврат его к исходному состоянию. По окончанию счета он сам себя "восстанавливает". Это позволяет упростить процедуру многократного перезапуска с минимальными временными издержками.

А по коду непонятно почему TIM2_CR1_OPM = 1; вначале, логичнее было бы перезапустить таймер а уж потом... указать какой режим и запустить.

Как-то я не очень догоняю глубинный смысл этой фразы. Перезапустить, а потом запустить?... Не хватает только "подпустить" и "надпустить" в качестве последовательных шагов дальнейшего развития сценария. :)

Зачем нужен TIM2_CR1_URS = 1;? Вроде для прерываний используется.

Эта команда запрещает поднятие флагов TIM2_SR1_*IF, которые при "ручном" сбросе счетчиков никому не интересны.

Где загрузка ARR?

На бороде. :)

Так может попробовать:

Да ни к чему мне пробовать. Мне не понравилось, что железный таймер позволяет себе одним и тем же кодом, то запускаться, то нет. Такого не должно быть в принципе. Оно должно либо работать всегда, либо никогда, чего бы там ни утверждали мифологические чудовища.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

в точной временной последовательности (единицу держим столько-то, ноль потом столько-то и т.п.)

забавно - разве это не временная задержка, все вышеперечисленное напомнило анекдот (извините за офф):
- Как называется ваша диссертация?
- "Как решетом воду носить".
- Ну что вы голубчик! Кто же так диссертацию называет? Назовите ее так: "Анализ проблем транспортировки вещества в жидком агрегатном состоянии в сосудах с перфорированным дном".
- Профессор, а как называлась Ваша диссертация?
- "Влияние русских народных музыкальных кнопочных инструментов на развитие религиозно - философской мысли России конца XVIII начала XX века".
- То есть, "На хрена попу боян"?

HHIMERA ты прав - "На хрена попу боян"?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

oleg110592 писал(а):
в точной временной последовательности (единицу держим столько-то, ноль потом столько-то и т.п.)

забавно - разве это не временная задержка,


Неа. Это ближе к последовательной передаче данных. Мысленно вообразите себе реализацию чего-нибудь высокоскоростного при помощи "задержек" и переосмыслите, насколько данный термин здесь употребим.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Держи... протирай глаза до затылка... покажи где там что не запустилось... :))) :)))
D0 - тестовый пин...
D1 - пин таймера...
Delay_uS - на том же TIM2...
Вложения
STM8S.rar
(5.58 КБ) 239 скачиваний
STM8.PNG
(129.1 КБ) 637 скачиваний
"Я не даю готовых решений, я заставляю думать!"(С)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

oleg110592 писал(а):А если логически рассуждать для чего может нужен "режим единичного прогона таймера", кроме как для организации задержки, в голову не приходит других вариантов.

Еще один вариант мне пришел в голову вчера. Дело было так: задумал прикрутить пульт от телека к одному агрегату. Надо чем-то с пульта данные захватывать. Таймером -- самое то. Датчик ИК на свободную ногу, оттуда внешнее прерывание по обоим фронтам и в обработчике запускаем таймер в однопроходном режиме по первому внешнему прерыванию, по всем остальным делаем капчуру и разбираем код. Время счета таймера подбирается по длине пакета с пульта. Если таймер остановился, а данные у нас не все, то это таймаут и принятые данные отбрасываем. Если пакет принят весь, то без лишних остановов и сбросов таймер готов к запуску, для приема следующего пакета Можно ли то же самое сделать без однопроходного режима? Можно. Только придется эту однопроходность эмулировать в коде. А здесь все само работает. И уж такое использование однопроходного режима задержкой точно не назвать.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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

Сообщение КАШАК »

Разбираюсь с STM8S003. Требуется сделать программный UART. Нашел пример от STM, но там все невероятно запутано (библиотеки для STM32 отдыхают). Вроде как заставил его скомпилироваться в IAR, но работать не хочет. На выводе Tx тишина. Может кто-то делал подобное?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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

Сообщение КАШАК »

Все, USART запустил. Но теперь новая напасть. У меня выводы программного USART находятся на PORTC. Там же находится выход на RST внешней периферии. Перед отсылкой данных выставляю высокий уровень на RST. Начинаю передачу. НО, как только начинается передача, состояние выхода меняется на противоположенное по непонятным причинам. При этом, если из функции передачи убрать изменение состояние вывода то состояние RST не меняется. Выводы настроены так:

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

GPIOC->DDR = 1<<7 | 1<<5 | 1<<4;
  GPIOC->CR1 = 1<<7 | 1<<5 | 1<<4;
  GPIOC->CR2 = 0;


Изменение состояния:

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

#define W_RST_H GPIOC->ODR |= 1<<4

#define W_RST_L GPIOC->ODR &= ~1<<4

void set_tx_pin_low(){
GPIOC->ODR &= ~1<<5;
}

void set_tx_pin_high(){
GPIOC->ODR |= 1<<5; 
}


В чем может быть проблема?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Побитовое НЕ имеет больший приоритет, чем сдвиг. Скобки поставьте.
Ставим плюсы: )
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Помогите прочитать правильно документацию. Программирую модуль SPI для того чтобы выкинуть данные просто в сдвиговый регистр. Вроде, всё делаю по правилам TXE и BUSY не зависают (но и не вижу, чтобы устанавливались), а на выводах как стоит лог.0, так и стоит. Во всяком случае, я лог. пробником ничего не замечаю, да и в регистре ничего не меняется. Может, я что забыл?

кристалл stm8l101k3t6. вывод 18 CLK, 18 - data(MOSI).

инициализация:

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

// Модуль SPI для передачи данных в MAX6920
  SPI_CR1_bit.LSBFIRST = 0;
  SPI_CR1_bit.BR = 7; // Fmaster/256
  SPI_CR1_bit.MSTR = 1; // Master
  SPI_CR1_bit.CPOL = 0;
  SPI_CR1_bit.CPHA = 0;
  SPI_CR2_bit.BDM = 0;
  SPI_CR2_bit.BD0E = 1;
  SPI_CR2_bit.RXOnly = 0;
  SPI_CR2_bit.SSM = 1;
  SPI_CR2_bit.SSI = 1;
  SPI_ICR = 0; // прерывания не используем.
  SPI_CR1_bit.SPE = 1;


Попытка передачи:

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

      SPI_DR = 0xff; // (chartab[videobuff[pos]]) >> 8;
      while (SPI_SR_bit.TXE == 0);
      SPI_DR = 0xff; // (chartab[videobuff[pos]]) & 0xff;
....
      while (SPI_SR_bit.BSY == 1);
      PB_ODR_bit.ODR3 = 1; // Load strobe
      PB_ODR_bit.ODR3 = 0;

На выходах как стоит лог.0 на все выходах так и стоит. Может есть какой бит, который надо установить, для запуска передачи, как у всех других нормальных микроконтроллеров?

Еще, убил некоторое время на выяснение, почему в строчке SPI_CR2_bit.BD0E = 1; была ошибка. Я его расшифровал как BiDirectional mode Output Enable, ну и написал BDOE. А оказалось, там ноль. Точно так же в документации RXONLY, а в хедерах - RXOnly.

p.s. Так, Флаг BUSY не выставляется. Вставил сразу за загрузкой проверку - туда не заходит вообще.

p.p.s. Даже вывод NSS сконфигурировал на вывод и подал лог.1 - что-то ничего не ... плин. забыл. клоки не подключил. Так, теперь бум мучить i2c.
valera_70
Родился
Сообщения: 11
Зарегистрирован: Ср апр 02, 2014 17:51:01
Откуда: Украина, Запорожье

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

Сообщение valera_70 »

Может кто подскажет?
Хотел прошить STM8S105 с помощью встроенного загрузчика через UART через Flash Loader Demonstrator. При первой попытке попутал подключение выводов RX, TX, то есть соединил RX-RX, TX-TX. Естественно ни чего не получилось. Потом понял, подключил как надо. Но Flash Loader Demonstrator пишет, что не может подключиться. Мог я спалить выводы RX или TX в STM8S105 при первой неправильной попытке? Преобразователь USB-UART рабочий, проверил терминалкой.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Сомневаюсь... от этого ничего не сгорит...
Там с этим демонстратором тонкости есть... там нужно успеть всё вовремя... и с первой попытки может и не получиться...
Вторая особенность... после первой заливки флэша загрузчик отключается... для повторной записи через загрузчик нужно править оптионс байт...
"Я не даю готовых решений, я заставляю думать!"(С)
Serj_K
Опытный кот
Сообщения: 718
Зарегистрирован: Сб апр 14, 2012 16:11:35

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

Сообщение Serj_K »

HHIMERA писал(а):Вторая особенность... после первой заливки флэша загрузчик отключается... для повторной записи через загрузчик нужно править оптионс байт...

Так как компилятор генерит хекс без байтов конфигурации, то я сделал себе батник, который вызывается при постобработке и дописывает в конец хекса 55AA:

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

echo S105487E55AA35 >> %1\%2.s19
, где %1 - $EXE_DIR$, а %2 - $PROJ_FNAME$ - передаваемые батнику параметры.
И всё, загрузчик не отключается.
В одном из проектов сделал анализ кнопки при включении устройства, после нажатия которой загрузчик активируется/деактивируется. Полезно для ускорения старта устройства и возможности перепрошиться при необходимости.
Последний раз редактировалось Serj_K Вт ноя 04, 2014 13:33:59, всего редактировалось 1 раз.
valera_70
Родился
Сообщения: 11
Зарегистрирован: Ср апр 02, 2014 17:51:01
Откуда: Украина, Запорожье

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

Сообщение valera_70 »

Делал сброс и старался в течении 1 секунды нажать кнопку на Flash Loader Demonstrator. Попыток 20 было, но так и не получилось. Питание от USB, может запитать от отдельного питания?
valera_70
Родился
Сообщения: 11
Зарегистрирован: Ср апр 02, 2014 17:51:01
Откуда: Украина, Запорожье

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

Сообщение valera_70 »

Serj_K это по твоему проекту "блок индикации". Может подскажешь?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Serj_K писал(а):я сделал себе батник, который вызывается при постобработке и дописывает в конец хекса

Спасибо конечно... но мне не надо...
valera_70 писал(а):Делал сброс и старался в течении 1 секунды нажать кнопку на Flash Loader Demonstrator. Попыток 20 было, но так и не получилось. Питание от USB, может запитать от отдельного питания?

Насколько помню... наоборот... Зажимаете кнопку сброса, кликаете старт, отпускаете сброс... типа так...
Если камень не новый и уже писался... то может не сработать...
"Я не даю готовых решений, я заставляю думать!"(С)
valera_70
Родился
Сообщения: 11
Зарегистрирован: Ср апр 02, 2014 17:51:01
Откуда: Украина, Запорожье

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

Сообщение valera_70 »

Насколько я понял, именно в течении 1 секунды после сброса МК работает встроенный загрузчик.
Serj_K
Опытный кот
Сообщения: 718
Зарегистрирован: Сб апр 14, 2012 16:11:35

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

Сообщение Serj_K »

valera_70 писал(а):Serj_K это по твоему проекту "блок индикации".

Про какой "блок индикации" вопрос?
Насколько помню... наоборот... Зажимаете кнопку сброса, кликаете старт, отпускаете сброс... типа так...

Не так. 1) Жмёте сброс. 2)отпускаете сброс и кликаете старт. Нужно успеть нажать старт в течении 1 с после отпускания сброса
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Читаю reference manual на stm8L101k3 про i2c и не могу въехать. Есть два регистра I2C_FREQR и I2C_CCR. Про второй написано, что он влияет на частоту мастерклока. А на что влияет первый??? Что означают эти цифры в конфигурации: 1Мгц, 2МГц...16Мгц? сколько мне ставить, если я использую тактовую частоту 2Мгц (16/8)?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

uldemir писал(а):Читаю reference manual на stm8L101k3 про i2c и не могу въехать. Есть два регистра I2C_FREQR и I2C_CCR. Про второй написано, что он влияет на частоту мастерклока. А на что влияет первый??? Что означают эти цифры в конфигурации: 1Мгц, 2МГц...16Мгц? сколько мне ставить, если я использую тактовую частоту 2Мгц (16/8)?

Как я понимаю, I2C_FREQR тупо информирует подсистему I2C на какой частоте подается тактирование. Если у вас 2мгц, то вам доступен только стандартный режим, соответственно CCR устанавливаете из расчета Period(I2C) = 2 * CCR * tMASTER. Для слейва CCR можно вообще не использовать.
Ответить

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