Программирование STM8
- Crazoff74
- Нашел транзистор. Понюхал.
- Сообщения: 165
- Зарегистрирован: Пн мар 07, 2016 15:32:57
- Откуда: Ижевск
Re: Программирование STM8
Привет всем! Извините, что не по теме. Подскажите как прошить MSP430G2955? схема программатора, софт.
Спасибо.
Спасибо.
Неисповедимы пути сигнала...
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Программирование STM8
Всем привет. Настроил tim2 на генерацию шим на третьем канале (d4), взяв пример [url=blog.mark-stevens.co.uk/2012/08/generating-pwm-signals-using-the-stm8s]отсюда[/url] Хочу получить еще один шим сигнал на другом канале. Подскажите, где задается на каком канале генерировать сигнал?
Re: Программирование STM8
На D4 выведен первый канал. У Марка в примере тоже первый. Каким образом у вас возникла мысль, что вы запустили третий канал?
Канал в его примере конфигурируется регистрами TIM2_CCRx и TIM2_CCMRx, где x -- это номер канала. Еще есть регистры TIM2_CCERх, где x не означает номер, но там тоже задаются для них (каналов) параметры. По аналогии с уже имеющимися в процедуре инициализации действиями, можно сконфигурировать и остальные каналы, подставляя нужные значения в вышеупомянутые регистры.
Канал в его примере конфигурируется регистрами TIM2_CCRx и TIM2_CCMRx, где x -- это номер канала. Еще есть регистры TIM2_CCERх, где x не означает номер, но там тоже задаются для них (каналов) параметры. По аналогии с уже имеющимися в процедуре инициализации действиями, можно сконфигурировать и остальные каналы, подставляя нужные значения в вышеупомянутые регистры.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Программирование STM8
Прошу прощения за наглость
. Пытаюсь запустить 3й канал (A3), не вникая особо в ДШ (таймеры по ДШ это то еще веселье
):
Первый канал (D4)работает, третий - нет
Проверьте:
Пытаюсь управлять каналами. С первыми всё ок. Третий не меняется.
Спойлер
Код: Выделить всё
void SetupServo1()
{
TIM2_PSCR = 0x03; // Prescaler = 4.
TIM2_ARRH = 0xc3; // High byte of 50,000.
TIM2_ARRL = 0x50; // Low byte of 50,000.
TIM2_CCR1H = 0x0A; // High byte of 12,500
TIM2_CCR1L = 0xCE; // Low byte of 12,500
TIM2_CCER1_CC1P = 0; // Active high.
TIM2_CCER1_CC1E = 1; // Enable compare mode for channel 1
TIM2_CCMR1_OC1M = 6; // PWM Mode 1 - active if counter < CCR1, inactive otherwise.
TIM2_CR1_CEN = 1; // Finally enable the timer.
}
void SetupServo2()
{
TIM2_PSCR = 0x03; // Prescaler = 4.
TIM2_ARRH = 0xc3; // High byte of 50,000.
TIM2_ARRL = 0x50; // Low byte of 50,000.
TIM2_CCR3H = 0x0A; // High byte of 12,500
TIM2_CCR3L = 0xCE; // Low byte of 12,500
TIM2_CCER1_CC2P = 0; // Active high.
TIM2_CCER1_CC2E = 1; // Enable compare mode for channel 3?
TIM2_CCMR2_OC2M = 6; // PWM Mode 1 - active if counter < CCR1, inactive otherwise.
TIM2_CR1_CEN = 1; // Finally enable the timer.
}
Первый канал (D4)работает, третий - нет
Проверьте:
Спойлер
Код: Выделить всё
TIM2_CCR3H = 0x0A; // High byte of 12,500
TIM2_CCR3L = 0xCE; // Low byte of 12,500
TIM2_CCER2_CC3P = 0; // Active high.
TIM2_CCER2_CC3E = 1; // Enable compare mode for channel 3
TIM2_CCMR3_OC3M = 6; // PWM Mode 1 - active if counter < CCR1, inactive otherwise.
TIM2_CR1_CEN = 1; // Finally enable the timer.Пытаюсь управлять каналами. С первыми всё ок. Третий не меняется.
Спойлер
Код: Выделить всё
void servo1Write(unsigned char angle)
{
if(angle > 180) angle = 180;
unsigned short temp = (SERVO_RIGHT - SERVO_LEFT) / 180;
temp *= angle;
temp += SERVO_LEFT;
TIM2_CCR1H = temp >> 8; // High byte of 12,500
TIM2_CCR1L = temp && 0xFF; // Low byte of 12,500
}
void servo2Write(unsigned char angle)
{
if(angle > 180) angle = 180;
unsigned short temp = (SERVO_RIGHT - SERVO_LEFT) / 180;
temp *= angle;
temp += SERVO_LEFT;
TIM2_CCR3H = temp >> 8; // High byte of 12,500
TIM2_CCR3L = temp && 0xFF; // Low byte of 12,500
}Re: Программирование STM8
FireProoF писал(а):Первый канал (D4)работает, третий - нет
По вашему коду и не должен.
Здесь вы задаете значение регистра сравнения для третьего канала,
TIM2_CCR3H = 0x0A; // High byte of 12,500
TIM2_CCR3L = 0xCE; // Low byte of 12,500
но остальные установки указываете для второго канала.
TIM2_CCER1_CC2P = 0; // Active high.
TIM2_CCER1_CC2E = 1; // Enable compare mode for channel 3?
TIM2_CCMR2_OC2M = 6; // PWM Mode 1 - active if counter < CCR1, inactive otherwise.
Не смотреть в даташит можно, но тогда нужно хотя бы уметь строить предположения, что вряд ли конфигурация для третьего канала помечается цифрой 2.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Добрый день. Решил "поиграться" с STM8S103F3, это первое мое знакомство с таким МК. Среду разработки выбрал IAR (никогда с такой раньше не работал).
Написал нижеследующий код. Данный код "мигает" портом, выполняя код то из флеш, то из ОЗУ. Цель проекта: первое ознакомление с данным МК и заодно проверка скорости выполнения кода из флеш и из ОЗУ.
Вот код.
Код работает. Вопросов к самому коду нет. Вопрос к линковщику. Оказалось, что в IAR нет директивы .ORG или подобного. Немного поковырялся и поломал голову. Как писать линковщик нормально я не понял. Хотя смотрел разные источники, но моя голова как то понимать не захотела. Пробовал читать в том числе IAR Assembler™ Reference Guide for STMicroelectronics’ STM8 Microcontroller Family.
Взял пример готовый линковщика из IAR. Добавил туда регионы Vectors, RAM и изменил NearFuncCode на 0x8080.
**************************************************************************
Пока писал вопрос, понял в чем дело. Вопрос стер. Вопрос был по линковщику. Оказывается путь к файлу линковщика надо указывать для обеих конфигураций. Debug и Release. А я то думал, чего у меня ругается на релиз.
Задам тогда другой. Чем отличаются эти конфигурации?
**************************************************************************
Ну и расскажу тогда, как мне кажется, интересный момент. Есть в МК такая команда INT. Код ее $82XXXXXX, где X трехбайтный адрес (из PM0044). Там же указано что данная инструкция может использоваться только в таблице прерываний в роли вектора. Не IAR не STVD команду int понимать не хочет. В iar таблицу векторов заполнял вот такими директивами dc32 (0x82000000+Tim2OV). Попробовал эту же директиву засунуть внутрь кода, чего вроде как делать нельзя. Если запускать код в режиме симуляции iar, то код виснет на ней. А вот если в режиме реальной отладки в железе, то эта инструкция работает как безусловный переход, содержимое указателя стека не меняется. Конечно я не говорю что эту инструкцию можно и нужно применять как безусловный переход, так, интересный факт.
Написал нижеследующий код. Данный код "мигает" портом, выполняя код то из флеш, то из ОЗУ. Цель проекта: первое ознакомление с данным МК и заодно проверка скорости выполнения кода из флеш и из ОЗУ.
Вот код.
Спойлер
Код: Выделить всё
MODULE asmmain
#include "iostm8s103f3.h"
PUBLIC __iar_program_start
PUBLIC main
EXTERN CSTACK$$Limit
SECTION `.near_func.text`:CODE:NOROOT(0)
__iar_program_start:
//***************************************************************************8
main:
Reset:
LDW X, #CSTACK$$Limit-1 ; Set stackpointer
LDW SP, X
;************************************************************************88
; настройка тактирования
mov CLK_CKDIVR,#0 ;выключить все делители тактовой частоты
;Копирование кода в озу
//dc32 (0x82000000+Tim2OV)
LDw X,#( loop)
LDW Y,#0
CopyCodeRam:
ld a,(x)
ld (y),a
incw X
incw Y
cpw X,#loopEnd
jrne CopyCodeRam
;настройка порта
mov PD_DDR,#MASK_PD_DDR_DDR4 //Pd4 выход
mov PD_CR1,#MASK_PD_CR1_C14 ; пушпул
mov PD_CR2,#MASK_PD_CR2_C24 ; 10MHz
//----------
//настраиваем таймер
//mov CLK_PCKENR1,1<<5 //включение тактирования таймера 2
//mov TIM2_CNTRH,#0xFF
//mov TIM2_CNTRL,#0xF0
mov TIM2_PSCR,#0x0a //максимальный предделитель
mov TIM2_CR1,#MASK_TIM2_CR1_CEN //запускаем таймер
mov TIM2_IER,#MASK_TIM2_IER_UIE //разрешение прерывания по переполнению
RIM //разрешаем прерывания
//********************************************************************
//мигание портом
loop:
ld A,PD_ODR
xor A,#MASK_PD_ODR_ODR4
ld PD_ODR,A
jra loop
loopEnd:
//*****************************************************************************
//прерывание по переполнению таймера
Tim2OV:
mov TIM2_SR1,#0x00 //сброс флагов таймера2
ld a, Flag
//если флаг 0 уйдем в ОЗУ
jrne TR1
//ld a,#0
ld (0x09,SP),a //запишем адрес возврата на ОЗУ
ld (0x08,SP),a
mov Flag,#1
iret //выход и прерывания
TR1: //если флаг 1 уйдем в флеш
ld A,#(low loop)
ld (0x09,SP),a
ld A,#(high loop)
ld (0x08,SP),a
mov Flag,#0
iret
//*****************************************************************************
SECTION `.RAM_sect`:CODE:ROOT(0) //****************************************
//*****************************************************************************
//мигание портом из ОЗУ
loopRAM:
ld A,PD_ODR
xor A,#MASK_PD_ODR_ODR4
ld PD_ODR,A
JRT loopRAM
//----------
nop
Flag: db 0
//*****************************************************************************
//вектора прерываний
SECTION `.Vectors_sect`:CODE:ROOT(0)
DC32 0x82000000+Reset ;; reset
dc32 0x82000000+Reset ; trap
dc32 0x82000000+Reset ; irq0
dc32 0x82000000+Reset ; irq1
dc32 0x82000000+Reset ; irq2
dc32 0x82000000+Reset ; irq3
dc32 0x82000000+Reset ; irq4
dc32 0x82000000+Reset ; irq5
dc32 0x82000000+Reset ; irq6
dc32 0x82000000+Reset ; irq7
dc32 0x82000000+Reset ; irq8
dc32 0x82000000+Reset ; irq9
dc32 0x82000000+Reset ; irq10
dc32 0x82000000+Reset ; irq11
dc32 0x82000000+Reset ; irq12
dc32 (0x82000000+Tim2OV) ; irq13 Переполнение обновление таймера 2
dc32 0x82000000+Reset ; irq14
dc32 0x82000000+Reset ; irq15
dc32 0x82000000+Reset ; irq16
dc32 0x82000000+Reset ; irq17
dc32 0x82000000+Reset ; irq18
dc32 0x82000000+Reset ; irq19
dc32 0x82000000+Reset ; irq20
dc32 0x82000000+Reset ; irq21
dc32 0x82000000+Reset ; irq22
dc32 0x82000000+Reset ; irq23
dc32 0x82000000+Reset ; irq24
dc32 0x82000000+Reset ; irq25
dc32 0x82000000+Reset ; irq26
dc32 0x82000000+Reset ; irq27
dc32 0x82000000+Reset ; irq28
dc32 0x82000000+Reset ; irq29
//----------
END
Код работает. Вопросов к самому коду нет. Вопрос к линковщику. Оказалось, что в IAR нет директивы .ORG или подобного. Немного поковырялся и поломал голову. Как писать линковщик нормально я не понял. Хотя смотрел разные источники, но моя голова как то понимать не захотела. Пробовал читать в том числе IAR Assembler™ Reference Guide for STMicroelectronics’ STM8 Microcontroller Family.
Взял пример готовый линковщика из IAR. Добавил туда регионы Vectors, RAM и изменил NearFuncCode на 0x8080.
Спойлер
Код: Выделить всё
/////////////////////////////////////////////////////////////////
// Example ILINK command file for
// STM8 IAR C/C++ Compiler and Assembler.
//
// Copyright 2015 IAR Systems AB.
//
/////////////////////////////////////////////////////////////////
define memory with size = 16M;
define region Vectors = [from 0x8000 to 0x807f];
place at start of Vectors { ro section .Vectors_sect };
define region RAM = [from 0x0000 to 0x03FF];
place at start of RAM { ro section .RAM_sect };
define region TinyData = [from 0x00 to 0xFF];
define region NearData = [from 0x0000 to 0x03FF];
define region Eeprom = [from 0x4000 to 0x427F];
define region NearFuncCode = [from 0x8080 to 0x9FFF];
define region FarFuncCode = [from 0x8000 to 0x9FFF];
define region HugeFuncCode = [from 0x8000 to 0x9FFF];
/////////////////////////////////////////////////////////////////
define block CSTACK with size = _CSTACK_SIZE {};
define block HEAP with size = _HEAP_SIZE {};
define block INTVEC with size = 0x80 { ro section .intvec };
// Initialization
initialize by copy { rw section .far.bss,
rw section .far.data,
rw section .far_func.textrw,
rw section .huge.bss,
rw section .huge.data,
rw section .huge_func.textrw,
rw section .iar.dynexit,
rw section .near.bss,
rw section .near.data,
rw section .near_func.textrw,
rw section .tiny.bss,
rw section .tiny.data,
ro section .tiny.rodata
};
initialize by copy with packing = none {section __DLIB_PERTHREAD };
do not initialize { rw section .eeprom.noinit,
rw section .far.noinit,
rw section .huge.noinit,
rw section .near.noinit,
rw section .tiny.noinit,
rw section .vregs };
// Placement
place at start of TinyData { rw section .vregs };
place in TinyData { rw section .tiny.bss,
rw section .tiny.data,
rw section .tiny.noinit,
rw section .tiny.rodata };
place at end of NearData { block CSTACK };
place in NearData { block HEAP,
rw section __DLIB_PERTHREAD,
rw section .far.bss,
rw section .far.data,
rw section .far.noinit,
rw section .far_func.textrw,
rw section .huge.bss,
rw section .huge.data,
rw section .huge.noinit,
rw section .huge_func.textrw,
rw section .iar.dynexit,
rw section .near.bss,
rw section .near.data,
rw section .near.noinit,
rw section .near_func.textrw };
place at start of NearFuncCode { block INTVEC };
place in NearFuncCode { ro section __DLIB_PERTHREAD_init,
ro section .far.data_init,
ro section .far_func.textrw_init,
ro section .huge.data_init,
ro section .huge_func.textrw_init,
ro section .iar.init_table,
ro section .init_array,
ro section .near.data_init,
ro section .near.rodata,
ro section .near_func.text,
ro section .near_func.textrw_init,
ro section .tiny.data_init,
ro section .tiny.rodata_init };
place in FarFuncCode { ro section .far.rodata,
ro section .far_func.text };
place in HugeFuncCode { ro section .huge.rodata,
ro section .huge_func.text };
place in Eeprom { section .eeprom.noinit };
place in Eeprom { section .eeprom.data };
place in Eeprom { section .eeprom.rodata };
/////////////////////////////////////////////////////////////////
**************************************************************************
Пока писал вопрос, понял в чем дело. Вопрос стер. Вопрос был по линковщику. Оказывается путь к файлу линковщика надо указывать для обеих конфигураций. Debug и Release. А я то думал, чего у меня ругается на релиз.
Задам тогда другой. Чем отличаются эти конфигурации?
**************************************************************************
Ну и расскажу тогда, как мне кажется, интересный момент. Есть в МК такая команда INT. Код ее $82XXXXXX, где X трехбайтный адрес (из PM0044). Там же указано что данная инструкция может использоваться только в таблице прерываний в роли вектора. Не IAR не STVD команду int понимать не хочет. В iar таблицу векторов заполнял вот такими директивами dc32 (0x82000000+Tim2OV). Попробовал эту же директиву засунуть внутрь кода, чего вроде как делать нельзя. Если запускать код в режиме симуляции iar, то код виснет на ней. А вот если в режиме реальной отладки в железе, то эта инструкция работает как безусловный переход, содержимое указателя стека не меняется. Конечно я не говорю что эту инструкцию можно и нужно применять как безусловный переход, так, интересный факт.
-
Chettuser
Re: Программирование STM8
Что за изделие - winIDEA-STM8 от iSYSTEM, кто пользовался? Сколько не крутил сайт, так и не понял у них IDE имеется? И бесплатно?
-
Chettuser
Re: Программирование STM8
Как в IAR включить отображение размера кода?
У меня свежеустановленный ничего не пишет.

У меня свежеустановленный ничего не пишет.

- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Попробовал свои IAR. В файле *.map есть эта инфа.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
-
Chettuser
Re: Программирование STM8
Исчо вопросик.
Пробовал на вкус SPL для STM8S и решил перебраться с него.
Подключил #include "iostm8s003f3.h"
и тут полезли ошибки:

На какой он тут синтаксис ругается, если это его родные файлы и я туда не лез?

Пробовал на вкус SPL для STM8S и решил перебраться с него.
Подключил #include "iostm8s003f3.h"
и тут полезли ошибки:

На какой он тут синтаксис ругается, если это его родные файлы и я туда не лез?

- GARMIN
- Держит паяльник хвостом
- Сообщения: 952
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: Программирование STM8
Смотри всегда на источник первой ошибки. Потом может просто лесенкой посыпаться.
-
Chettuser
Re: Программирование STM8
Обе утыкаются в эту строку. 
Ладно, отложу пока STM8 в сторону. Есть другие дела.
Ладно, отложу пока STM8 в сторону. Есть другие дела.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Гляньте вот тут.
-
Chettuser
Re: Программирование STM8
Спасибо.
И ведь последняя версия стоит, неужели поправить не удосужились за это время? Ещё и файлы залочили от изменения. Пипец!
И ведь последняя версия стоит, неужели поправить не удосужились за это время? Ещё и файлы залочили от изменения. Пипец!
Re: Программирование STM8
Подскажите, как очистить stm8 в ST Visual Programmer
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
При скромном опыте программирования данного камня поделюсь опытом. Иногда камень переставал отвечать. Помогало в нужный момент нажатия резет. В stvd трудно было попасть в этот момент, в iar легко
Re: Программирование STM8
Еще легче попадать в резет, если завести его от программатора отдельным проводом на соответствующую ногу МК и в настройках среды прописать under reset. Тогда среда сама будет попадать в этот резет, причем, каждый раз удивительно точно. 
Re: Программирование STM8
знает ли кто способ как отлаживать с одного компьютера паралельно два STM8?
IAR у меня хватает пераый программатор и второй игнорирует
IAR у меня хватает пераый программатор и второй игнорирует
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Программирование STM8
Всем привет. Управляю 4мя ДПТ через PWM с помощью таймеров 1 и 2. Параллельно опрашиваю АЦП. Бывает запуск АЦП совпадает с фронтом одного из PWM'ов. Как их сихнронизировать?
Были идеи использовать режим счёта up+down, как бы добавляя еще одну метку в сигнал ШИМа где-нибудь посередине, чтобы запустить АЦП, но с этого таймера выведено только 3 канала у меня.
Добавлено after 1 minute 15 seconds:
Попробуй virtualbox.
Были идеи использовать режим счёта up+down, как бы добавляя еще одну метку в сигнал ШИМа где-нибудь посередине, чтобы запустить АЦП, но с этого таймера выведено только 3 канала у меня.
Добавлено after 1 minute 15 seconds:
axillent писал(а):знает ли кто способ как отлаживать с одного компьютера паралельно два STM8?
IAR у меня хватает пераый программатор и второй игнорирует
Попробуй virtualbox.
