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

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

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

Сообщение uldemir »

EugenyAM писал(а):пишем:

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

CLK_ECKR |= (1<<0);

либо просто:

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

CLK_ECKR |= 0x01;

Ой, так не годится. Я то думал, что Ц-шные исходники более читаемые и эти определения уже поставляются производителем кристаллов. Вот пользую микрочиповский MPASM или GNUшный GPUTILS - там подключаешь инклюд и всё там есть - и регистры и биты. И мне не надо ничего помнить (ну за исключением в какой странице памяти оно находится), просто пишу bsf intcon, 1<<GIE.
Тут Zheleznjakov посоветовал порыть библиотеки... пока откопал stm8swlib. Пытаюсь изучить, но похоже, она пытается от меня всё спрятать за функциями типа void GPIO_Write (GPIO_TypeDef * GPIOx, u8 PortVal ).
Еще откопал stm8s-discovery_dev.zip - там есть каталог Project_template, который вроде как можно куда-то скопировать и от-туда плясать. Там вроде есть stm8s_clk.h итп. Но не наблюдаю хелпов, где почитать. Наверное, предполагается, что надо изучать сырцы.
Извините, что пишу глупости, но это моя первая попытка программить на С микроконтроллеры. До этого всегда пользовался только макроассемблером. Можно было и здесь это продолжить, но не хотелось тратить силы на изучение новой мнемоники команд, а взамен изучить иную технику программирования.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

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

Сообщение Zheleznjakov »

Да, если первый раз то сложнова-то будет или очень интересно :)
Я предполагал что вы глянете заголовочники и по ним поймете методологию работы.
С другой стороны ни кто не мешает вам создать свои заголовочники, у них будет одна проблема актуальность (обновление).
Хотя используя заголовочники из либы конструкция получается вроед не такой уж и страшной:
CLK->ECKCR = CLK_HSE_ON;
или так
CLK->ECKCR = CLK_HSE_ON | CLK_LSE_OFF;
при этом сами функции из либ ни кто не обязывает использовать пишите свои.
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

придумал на работе поставить Cosmic (16k без ограничения срока годности). Оказалось, у него гораздо лучше userguide. Но сегодня зарегистрировать не удалось - выходные.
Zheleznjakov писал(а):С другой стороны ни кто не мешает вам создать свои заголовочники, у них будет одна проблема актуальность (обновление).
Уже обосновывал своё нежелание этим заниматься.
Zheleznjakov писал(а):Хотя используя заголовочники из либы конструкция получается вроед не такой уж и страшной:
Такая мысль была промелькнувши, но не хотелось делать кашу. А то будет так, что напишу своё, а точно то же оказывается написано рядом. Хотя, я несколько уже разочаровался. Каждый компилятор организует интерфейс по-своему. И не могу придумать к чему приткнуться. Но это первые шаги - всегда трудные.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

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

Сообщение Zheleznjakov »

Если писать на си, то не пойму я вас в чём проявиться разница?
Если вы вязли заголовочник из либы, то у вас будет один стил во всех компиляторах:
CLK->ECKCR = CLK_HSE_ON;
возьмите заголовочники у иара
будет у вас везде вот такая запись:
CLK_ECKR_bit.HSEEN=1;
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Плюнул я на неблагодарное занятие - привинчивание чужих хедеров. Не барское это занятие. Сделал по-тупому - свои дефайны написал. Может когда освоюсь - разберусь. Зато лампочка замигала. Сначала не хотела мигать, если собирал Release. Потом отрубил оптимизацию по размеру - завелось. Хотя теперь по размеру от Debug не отличается.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
EugenyAM
Родился
Сообщения: 13
Зарегистрирован: Вт окт 14, 2008 06:48:04
Откуда: Omsk
Контактная информация:

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

Сообщение EugenyAM »

Zheleznjakov писал(а):Если вы вязли заголовочник из либы, то у вас будет один стил во всех компиляторах:
CLK->ECKCR = CLK_HSE_ON;

Наверное есть смысл портировать демо-проекты курса на заголовочники из либы, поскольку не IARом единым...
Мне было проще начать с него, потому что есть многолетний опыт на нем с AVR и ARM.
А цель данного курса - познакомить народ, которому тяжко без русской документации с тем, как на STM8 решать практические задачи по работе с периферией. т.е. подразумевается, что человек знает основы си, имеет понятие о микроконтроллерах вообще (51, AVR, PIC, ARM - не важно), не боится брать паяльник в руки и хочет понять, чего можно ожидать от STM8, стоит ли использовать его в новых проектах или нет.
Я пишу эти уроки на основе собственного опыта изучения STM8 и все, о чем пишу, проверяю на практике самостоятельно.
В дальнейших планах - сенсорная кнопка, простая кнопка, матрица кнопок, энкодер, клавиатура PS/2, Beeper, UART, АЦП, HD16440, DS18B20, DS1307, USB, DMX512, SPI, 74HC595, IR RC-5. Все это когда-то делалось на AVR, собралась даже в некотором смысле своя библиотека, построеная на макросах, и вот теперь эти наработки буду переводить на STM8, а затем и на STM32 и LPC.
И взлет цен на AVR здесь тоже сыграл свою роль.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Cделал с использованием хедеров из stm8s-discovery_dev.zip

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

#include "stm8s.h"
/* #define HSEEN 0 // бит регистра CLK_ECKR
#define SWEN 1  // бит регистра CLK_SWCR
*/
#define LED_OUT 0

int main()
{
   long i;

   CLK->ECKR |= CLK_ECKR_HSEEN; // Разрешаем работу генератора с внешним кварцем (HSEEN).
  CLK->SWCR |= CLK_SWCR_SWEN; // Автопереключение источника Clock при неисправности HSE (SWEN).
  CLK->SWR=0xB4; // Включаем clock от кварцевого генератора (HSE).
  CLK->CKDIVR=0; // Делители частоты внутреннего и внешнего генератора на 1 (частота максимальная).

//Инициализируем GPIO. На Discovery светодиод подключен на PD0, активный уровень - 0
  GPIOD->DDR |= (1<<LED_OUT); //PD0 - на вывод.
  GPIOD->CR1 |= (0<<LED_OUT); //PD0 - открытый сток.
  GPIOD->CR2 |= (0<<LED_OUT); //PD0 - ограничение скорости отключено.
 


   while (1) {
      GPIOD->ODR &= (0<<LED_OUT); //Включим светодиод
    for(i=0;i<50000;i++); //Подождем...
      GPIOD->ODR |= (1<<LED_OUT); //Выключим светодиод
    for(i=0;i<50000;i++); //Подождем...
      GPIOD->ODR &= (0<<LED_OUT); //Включим светодиод
    for(i=0;i<50000;i++); //Подождем...
      GPIOD->ODR |= (1<<LED_OUT); //Выключим светодиод
    for(i=0;i<200000;i++); //Подождем...
   };
return 0;

Критика принимается. Например светодиод зажигается некорректно...
А вот интересно, под какую микросхему предусмотрено место на STM8S-DISCOVERY SO-16?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

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

Сообщение Zheleznjakov »

Возможно под ОУ или например часы или ещё чего :)
--
Сегодня повозися с космиком и симулятором, довольно интересная штука. Эх если бы не два курсача что нибудь бы слабал :)
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
EugenyAM
Родился
Сообщения: 13
Зарегистрирован: Вт окт 14, 2008 06:48:04
Откуда: Omsk
Контактная информация:

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

Сообщение EugenyAM »

Вместо этого:

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

GPIOD->ODR &= (0<<LED_OUT); //Включим светодиод

корректнее будет записать

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

GPIOD->ODR &= ~(1<<LED_OUT); //Включим светодиод
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

ведущий специалист

Может и ошибаюсь ( хорошо бы) .
При эксперементах выяснилось , что битовые операции у STM8S (конкретно пока только с Дискавери проверялось) имеют 2 такта а не 1.
См. мои посты и kisonhttp://kazus.ru/forums/showthread.php?t=20861&page=64
Посмотри у себя плиз...
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

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

Сообщение DrWatson »

Пошаговая трассировка? да 2 такта, т.к. конвеер походу при пошаговом выполнении сбрасывается.
А, если верить моим экспериментам, число тактов на команду соответствует даташиту (для некоторых методов адресации может быть (и есть) больше).
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

DrWatson писал(а):Пошаговая трассировка? да 2 такта, т.к. конвеер походу при пошаговом выполнении сбрасывается.
А, если верить моим экспериментам, число тактов на команду соответствует даташиту (для некоторых методов адресации может быть (и есть) больше).

То есть можно считать в даташите - описка ?
BRES, BSET,BCPL -2 такта
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

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

Сообщение DrWatson »

Хм, у меня в даташите 1 такт на эти команды. Rev2 от 5-Jun-2008
Один такт они занимают, просто при пошаговом прогоне с отладчиком, конвеер команд сбрасывается, поэтому добавляется 1 такт на чтение очередной команды, а при нормальной работе сколько написано тактов в даташите, столько они и занимают времени на выполнение.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

DrWatson писал(а):Хм, у меня в даташите 1 такт на эти команды. Rev2 от 5-Jun-2008
Один такт они занимают, просто при пошаговом прогоне с отладчиком, конвеер команд сбрасывается, поэтому добавляется 1 такт на чтение очередной команды, а при нормальной работе сколько написано тактов в даташите, столько они и занимают времени на выполнение.

В том то и дело , что проверялось это не в отладчике .
Проверялось при прогоне Release, с контролем на осциллографе и логическом анализаторе .
В цикле

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

main.c:37           LED1=~LED1; 
0x8109 BCPL  _PB_ODR,#1
0x810d JRT   0x8109


ожидаемое число тактов 3 , в реальности 4.
При 16 МГц ожидаем период 375ns или 2,666 МГц . Получаем 2 МГц и период 498ns.

в этом ожидаем 4 такта , получаем 6 .
Имеем 2,6 МГц и 375 ns вместо 4 МГц и 250 ns.

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

main.c:38             LED1=1; 
0x8109 BSET  _PB_ODR,#1
main.c:39             LED1=0;
0x810d BRES  _PB_ODR,#1
0x8111 JRT   0x8109
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

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

Сообщение DrWatson »

При выполнении переходов конвейер сбрасывается, для чистоты эксперимента попробуй увеличить число BCPL, пар BSET/BRES хотя бы до десятка, тогда можно будет с уверенностью говорить об опечатке в даташите.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

DrWatson писал(а):При выполнении переходов конвейер сбрасывается, для чистоты эксперимента попробуй увеличить число BCPL, пар BSET/BRES хотя бы до десятка, тогда можно будет с уверенностью говорить об опечатке в даташите.

Вот эти и займусь в понедельник .
Есть задумка - как привязать эпюры к тактам .
Сразу будет видно все .
Я собственно не грешу на STM, поэтому и писал :
dosikus писал(а):Может и ошибаюсь ( хорошо бы) .
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

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

Сообщение DrWatson »

Щас в отладчике посмотрел, точно, выходит на битовые операции с памятью по 2 такта, по всей видимости читать модифицировать и писАть в память за один такт он не может.
(прогонял цепочку из 20 команд BCPL с четырьмя ячейками памяти и смотрел изменение счетчика TIM1 с предделителем 1)

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

unsigned char A, B, C;

main()
{
   PD_DDR|=1;
   PD_CR1|=1;
   PD_CR2|=1;
   TIM1_PSCRH=0;
   TIM1_PSCRL=0;
   TIM1_ARRH=0xFF;
   TIM1_ARRL=0xFF;
   TIM1_CR1|=1;
   while(1)
   {
#asm   
      bcpl _PD_ODR, #0
      bcpl _A, #2
      bcpl _B, #1
      bcpl _C, #3
      bcpl _PD_ODR, #0
      bcpl _A, #2
      bcpl _B, #1
      bcpl _C, #3
      bcpl _PD_ODR, #0
      bcpl _A, #2
      bcpl _B, #1
      bcpl _C, #3
      bcpl _PD_ODR, #0
      bcpl _A, #2
      bcpl _B, #1
      bcpl _C, #3
      bcpl _PD_ODR, #0
      bcpl _A, #2
      bcpl _B, #1
      bcpl _C, #3
#endasm   
   }
   while (1);
}

Значит надо взять на заметку - проверять такты операций с памятью.
А даташит не исправили, последняя ревизия на сайте от июня 2008.

UPD:
INC DEC также выполняются по 2 такта. Справедливо предположить, что все операции чтение-модификация-запись ячейки ОЗУ выполняются не менее чем за 2 такта.
По всей видимости даташит писАлся "копипастой" :)

UPD:
Выкопал свой частотомер на меге, проверил еще и команду MOV - тоже по 2 такта, и константа->ОЗУ и ОЗУ->ОЗУ (в даташите 1).

UPD: Все оказалось гораздо сложнее, чем казалось на первый взгляд...
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Ещё больше смущает строчка в одном из праздничных буклетов "Harvard Architecture - CISC 0,29 DMips/Mhz", что при 16МГц даст около 5МИПС.
Последний раз редактировалось HHIMERA Вс дек 05, 2010 07:52:33, всего редактировалось 1 раз.
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

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

Сообщение Zheleznjakov »

странно у меня такие результат с платой дисковери
dec a - 1 такт (как по даташиту)
decw x - 2 такта (как по даташиту)
на счет остальных команд
похоже все одно тактные команды которые имеют длинну больше 4, в отладчике отрабатываются за два такта.
на работе проверю детально, дома нет приборов...
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

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

Сообщение DrWatson »

Как я вчера выяснил, команды чтение-модификация-запись ОЗУ с длиной кода команды меньше 4 байт выполняются за 2 такта, но благодаря конвееру(ширина которого 4 байта), если команда, следующая за этой командой не обращается к ОЗУ (регистровые пересылки и арифметика-логика, команда не более 4 байт длиной), то эта команда выполняется "во время" второго такта первой. Т.е. код:

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

    inc var1    ; 2 такта
    ld a,#23   ; 1-1 такт
    inc var2   ; 2 такта
    dec a      ; 1-1 такт
; Всего 4 такта

Потребует для выполнения столько же тактов, что и код:

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

    inc var1   ; 2 такта
    inc var2   ; 2 такта
    dec a      ; 1-1 такт
; Всего 4 такта

Причем в эту особенность попадают и некоторые 4-байтные команды.
Вот только команды манипуляции битами (BRES, BSET, BCPL) с которых все началось требуют 2 такта в любом случае, т.е. как будто они сбрасывают конвеер. Так как первый байт кода этих команд совпадает с первым байтом кода команд проверки бита и перехода BTJF и BTJT, то это и не удивительно.
И еще заметил особенность команды безусловного перехода JRA (она же JRT): если ее код попадает в одну 4-байтную страницу с предыдущей 1-2-байтной командой, то на ее выполнение затрачивается один такт вместо двух. (измерял время цикла, смещая тело цикла в памяти NOP-ами вставляемыми перед телом цикла).
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Ответить

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