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

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

Сб ноя 13, 2010 11:04:10

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 итп. Но не наблюдаю хелпов, где почитать. Наверное, предполагается, что надо изучать сырцы.
Извините, что пишу глупости, но это моя первая попытка программить на С микроконтроллеры. До этого всегда пользовался только макроассемблером. Можно было и здесь это продолжить, но не хотелось тратить силы на изучение новой мнемоники команд, а взамен изучить иную технику программирования.

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

Сб ноя 13, 2010 12:26:47

Да, если первый раз то сложнова-то будет или очень интересно :)
Я предполагал что вы глянете заголовочники и по ним поймете методологию работы.
С другой стороны ни кто не мешает вам создать свои заголовочники, у них будет одна проблема актуальность (обновление).
Хотя используя заголовочники из либы конструкция получается вроед не такой уж и страшной:
CLK->ECKCR = CLK_HSE_ON;
или так
CLK->ECKCR = CLK_HSE_ON | CLK_LSE_OFF;
при этом сами функции из либ ни кто не обязывает использовать пишите свои.

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

Сб ноя 13, 2010 14:04:50

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

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

Сб ноя 13, 2010 14:27:56

Если писать на си, то не пойму я вас в чём проявиться разница?
Если вы вязли заголовочник из либы, то у вас будет один стил во всех компиляторах:
CLK->ECKCR = CLK_HSE_ON;
возьмите заголовочники у иара
будет у вас везде вот такая запись:
CLK_ECKR_bit.HSEEN=1;

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

Сб ноя 13, 2010 19:32:41

Плюнул я на неблагодарное занятие - привинчивание чужих хедеров. Не барское это занятие. Сделал по-тупому - свои дефайны написал. Может когда освоюсь - разберусь. Зато лампочка замигала. Сначала не хотела мигать, если собирал Release. Потом отрубил оптимизацию по размеру - завелось. Хотя теперь по размеру от Debug не отличается.

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

Сб ноя 13, 2010 19:37:19

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 здесь тоже сыграл свою роль.

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

Сб ноя 13, 2010 20:08:01

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?

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

Сб ноя 13, 2010 20:30:48

Возможно под ОУ или например часы или ещё чего :)
--
Сегодня повозися с космиком и симулятором, довольно интересная штука. Эх если бы не два курсача что нибудь бы слабал :)

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

Сб ноя 13, 2010 20:56:59

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

корректнее будет записать
Код:
GPIOD->ODR &= ~(1<<LED_OUT); //Включим светодиод

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

Сб дек 04, 2010 12:11:18

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

Может и ошибаюсь ( хорошо бы) .
При эксперементах выяснилось , что битовые операции у STM8S (конкретно пока только с Дискавери проверялось) имеют 2 такта а не 1.
См. мои посты и kisonhttp://kazus.ru/forums/showthread.php?t=20861&page=64
Посмотри у себя плиз...

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

Сб дек 04, 2010 20:50:58

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

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

Сб дек 04, 2010 20:56:56

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

То есть можно считать в даташите - описка ?
BRES, BSET,BCPL -2 такта

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

Сб дек 04, 2010 21:15:28

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

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

Сб дек 04, 2010 22:24:19

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

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

Сб дек 04, 2010 22:36:04

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

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

Сб дек 04, 2010 22:52:36

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

Вот эти и займусь в понедельник .
Есть задумка - как привязать эпюры к тактам .
Сразу будет видно все .
Я собственно не грешу на STM, поэтому и писал :
dosikus писал(а):Может и ошибаюсь ( хорошо бы) .

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

Сб дек 04, 2010 23:20:19

Щас в отладчике посмотрел, точно, выходит на битовые операции с памятью по 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: Все оказалось гораздо сложнее, чем казалось на первый взгляд...

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

Вс дек 05, 2010 06:29:51

Ещё больше смущает строчка в одном из праздничных буклетов "Harvard Architecture - CISC 0,29 DMips/Mhz", что при 16МГц даст около 5МИПС.
Последний раз редактировалось HHIMERA Вс дек 05, 2010 07:52:33, всего редактировалось 1 раз.

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

Вс дек 05, 2010 07:33:20

странно у меня такие результат с платой дисковери
dec a - 1 такт (как по даташиту)
decw x - 2 такта (как по даташиту)
на счет остальных команд
похоже все одно тактные команды которые имеют длинну больше 4, в отладчике отрабатываются за два такта.
на работе проверю детально, дома нет приборов...

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

Вс дек 05, 2010 12:18:41

Как я вчера выяснил, команды чтение-модификация-запись ОЗУ с длиной кода команды меньше 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-ами вставляемыми перед телом цикла).
Ответить