Программирование STM8
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Программирование STM8
Китайцы теперь вместо STM8S003 используют N76E003, по ногам совместимы, $0.22
https://ru.aliexpress.com/item/N76E003A ... 40439.html
https://ru.aliexpress.com/item/N76E003A ... 40439.html
Re: Программирование STM8
"The N76E003 is an embedded flash type, 8-bit high performance 1T 8051-based microcontroller. The instruction set is fully compatible with the standard 80C51 and performance enhanced."
Как-то мне так сразу и расхотелось.
Как-то мне так сразу и расхотелось.
Re: Программирование STM8
Есть еще дешевле, по 15р http://s.aliexpress.com/rmEVvMr2
Для массового производства наверно альтернатива. Но для мелочей скорее боком выйдет
Лучше уж stm32f030f4 по 30р или stm8s105c6 по 35
Для массового производства наверно альтернатива. Но для мелочей скорее боком выйдет
Лучше уж stm32f030f4 по 30р или stm8s105c6 по 35
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Программирование STM8
Не могу запустить шим на stm8s003. Таймер 1, канал 4(PC4), шим 100Гц.
Перечитал даташит вдоль и поперек, но все ровно не хватает ума додумать. 2 день мучаюсь.
Вот код
Перечитал даташит вдоль и поперек, но все ровно не хватает ума додумать. 2 день мучаюсь.
Вот код
Спойлер
Код: Выделить всё
void TIM1_Init(void)
{
GPIOC->DDR |= GPIO_PIN_4;
GPIOC->CR1 |= GPIO_PIN_4;
GPIOC->CR2 |= GPIO_PIN_4;
CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
TIM1->CR1 &= ~TIM1_CR1_CEN; //OFF
TIM1->CR1 |= TIM1_CR1_ARPE;
TIM1->PSCRH = 0x00;
TIM1->PSCRL = 0x08; // 16MHz/8 = 2MHz
TIM1->ARRH = 0x4e; //2MHz/20000 = 100Hz частота шима
TIM1->ARRL = 0x20;
//D = 100% = 20000
//D = 50% = 10000
TIM1->CCMR4 |= 0x68; //PWM MODE, Output compare 4 preload enable
TIM1->CCER2 &= ~TIM1_CCER2_CC4P; //PC4
TIM1->CCER2 |= TIM1_CCER2_CC4E;
TIM1->BKR |= TIM1_BKR_MOE;
TIM1->CCR4H = 0x00; //D=0%
TIM1->CCR4L = 0x00;
TIM1->IER &= ~TIM1_IER_UIE;
TIM1->CR1 |= TIM1_CR1_CEN; //ON;
TIM1->CCR4H = 0x3a; //15000, D = 75%
TIM1->CCR4L = 0x98;
}
Re: Программирование STM8
Сходу ошибок не вижу, но приметил, что вы исходите из предположения, что МК у вас затактирован частотой 16мгц. Это может быть так и не так. После включения у МК частота клока 2мгц. Если вы в остальной части программы этого не меняете, то 2 мгц и будет. Дальше вы ее делите прескалером на 9. Цифра 8 в регистре прескалера означает деление на 9, а не на 8. 2мгц / 9 = 222,222кгц. Дальше вы это дело "делите" на 20 тыс, что в итоге дает частоту следования импульсов на выходе PC4 в 11,(1) герц.
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Программирование STM8
Тактирование от внешнего кварца.
Добавил перед настройкой таймера функцию настройки юарта - 16МГц 19200 бод, и вывод сообщений в терминал. Сообщения приходят без ошибок. Значит частота настроена верно.
Добавил перед настройкой таймера функцию настройки юарта - 16МГц 19200 бод, и вывод сообщений в терминал. Сообщения приходят без ошибок. Значит частота настроена верно.
Re: Программирование STM8
О чем-то не о том вы говорите. Сейчас залил ваш код в МК, шим-сигнал частотой около 90 герц на выходе PC4 присуствует.
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Программирование STM8
Странно..У меня что лог. анализатор ни чего не показывает на PC4, что светодиод подключенный к этому выводу.
Все перепроверил кучу раз.
Компилятор sdcc:
Все перепроверил кучу раз.
Компилятор sdcc:
Код: Выделить всё
SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.4.0 #8981 (Jan 10 2015) (Linux)
published under GNU General Public License (GPL)
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Программирование STM8
вот на всякий - в реальной поделке работает, правда 1 канал TIM1. Недостаток - надо option bit alternate function [AFR0] включать:
Код: Выделить всё
void TIM1_init(void) // Настройка таймера 1
{
//PWM output signal frequency = TIM1 counter clock/(TIM1_ARR + 1)
//Channel x duty cycle = [TIM1_CCRxx/(TIM1_ARR + 1)] * 100
TIM1->PSCRH = 0x00;
TIM1->PSCRL = 0x00;
TIM1->ARRH = 0x0F;
TIM1->ARRL = 0x9F;
TIM1->CCMR1 |= (uint8_t)0x60; //110: PWM mode 1 - In up-counting, channel 1 is active as long as TIM1_CNT < TIM1_CCR1,
TIM1->CCER1 |= TIM1_CCER1_CC1E; //CH1 compare Enable
TIM1->CCR1H = 0x07;
TIM1->CCR1L = 0xD0;
TIM1->CR1 |= TIM1_CR1_CEN;
TIM1->BKR |= TIM1_BKR_MOE; // OC and OCN outputs are enabled if their respective enable bits are set (CC/E in Tim1_CCERi)
}Re: Программирование STM8
[uquote="alex38779",url="/forum/viewtopic.php?p=3435262#p3435262"]Странно..У меня что лог. анализатор ни чего не показывает на PC4, что светодиод подключенный к этому выводу.
Все перепроверил кучу раз.[/uquote]
Компилировал ИАР-ом, смотрел осциллографом. Частота и коэффициент заполнения соответствуют значениям регистров. Кварца у меня нет, тактировалось от внутреннего генератора. Полный текст под спойлером:
Все перепроверил кучу раз.[/uquote]
Компилировал ИАР-ом, смотрел осциллографом. Частота и коэффициент заполнения соответствуют значениям регистров. Кварца у меня нет, тактировалось от внутреннего генератора. Полный текст под спойлером:
Спойлер
Код: Выделить всё
#include "stm8s.h"
void TIM1_Init(void)
{
GPIOC->DDR |= GPIO_PIN_4;
GPIOC->CR1 |= GPIO_PIN_4;
GPIOC->CR2 |= GPIO_PIN_4;
CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
TIM1->CR1 &= ~TIM1_CR1_CEN; //OFF
TIM1->CR1 |= TIM1_CR1_ARPE;
TIM1->PSCRH = 0x00;
TIM1->PSCRL = 0x08; // 16MHz/8 = 2MHz
TIM1->ARRH = 0x4e; //2MHz/20000 = 100Hz частота шима
TIM1->ARRL = 0x20;
//D = 100% = 20000
//D = 50% = 10000
TIM1->CCMR4 |= 0x68; //PWM MODE, Output compare 4 preload enable
TIM1->CCER2 &= ~TIM1_CCER2_CC4P; //PC4
TIM1->CCER2 |= TIM1_CCER2_CC4E;
TIM1->BKR |= TIM1_BKR_MOE;
TIM1->CCR4H = 0x00; //D=0%
TIM1->CCR4L = 0x00;
TIM1->IER &= ~TIM1_IER_UIE;
TIM1->CR1 |= TIM1_CR1_CEN; //ON;
TIM1->CCR4H = 0x3a; //15000, D = 75%
TIM1->CCR4L = 0x98;
}
int main( void )
{
CLK->CKDIVR = 0;
TIM1_Init();
while (1);
}- GARMIN
- Держит паяльник хвостом
- Сообщения: 953
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: Программирование STM8
Попробуй в конце так:
TIM1->CR1 |= TIM1_CR1_CEN; // разрешить таймер
TIM1->EGR |= TIM1_EGR_UG; // обновить установки
И проверь в отладчике результаты записи в регистры таймера
TIM1->CR1 |= TIM1_CR1_CEN; // разрешить таймер
TIM1->EGR |= TIM1_EGR_UG; // обновить установки
И проверь в отладчике результаты записи в регистры таймера
Re: Программирование STM8
У SDCC такой отладчик, что поневоле засомневаешься, пользоваться им или нет.
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Программирование STM8
А под линукс то и выбора нет, только sdcc для stm8. Из отладчиков есть gui для gdb, зовется ddd https://www.gnu.org/software/ddd/
На отладчике программа залипает на следующей строке - CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
Убираю ее и все идет дальше. Но толку нет.
Вижу такой вариант - у меня кривой stm8s.h, я его взял с сайта st.
Вообщем я чет намучился и установил в виртуалку 7 винду + iar, в нем скомпилировал этот код. Прошил - все работает.
Спасибо за помощь всем!
На отладчике программа залипает на следующей строке - CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
Убираю ее и все идет дальше. Но толку нет.
Вижу такой вариант - у меня кривой stm8s.h, я его взял с сайта st.
Вообщем я чет намучился и установил в виртуалку 7 винду + iar, в нем скомпилировал этот код. Прошил - все работает.
Спасибо за помощь всем!
Re: Программирование STM8
[uquote="alex38779",url="/forum/viewtopic.php?p=3435704#p3435704"]установил в виртуалку 7 винду + iar[/uquote]
Лучше STVD.
А еще лучше SES и stm32, если так уж охота красноглазить...
Лучше STVD.
А еще лучше SES и stm32, если так уж охота красноглазить...
Re: Программирование STM8
[uquote="alex38779",url="/forum/viewtopic.php?p=3435704#p3435704"]А под линукс то и выбора нет[/uquote]
cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.
cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Программирование STM8
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3435717#p3435717"]cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.[/uquote]
Я имел ввиду нативные компиляторы. Без вайнов и т.д.
Я имел ввиду нативные компиляторы. Без вайнов и т.д.
Re: Программирование STM8
Хотя интереснее бы разобраться, почему собранный SDCC не работает. Проблема какая-то ненормальная.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Доброго времени суток. МК STM8S.
Ковыряюсь с внешними прерываниями. У такого конттроллера они очень упрощены. И нет флага внешнего прерывания. Ну он конечно же есть, но для софта недоступный.
Для теста специально брекпоинтился в обработчике и генерил внешнее событие.
Попытался сбросить этот внутренний флаг запретом/разрешением внеш. прерывания на пине. Это ничего не дало. Ну наверное логично, так как прерывание для всего порта идет.
Забубенил вот такой макрос, т.е просто переключил режимы возникновения событий. Ну вроде как сбросился этот флаг. Опять же в RM написано, что их можно переключать только находясь в приоритете Level3. Специально попробовал находясь в Level2, действительно перестал работать такой сброс. Т.е. если что еще прерывания надо запрещать для такой операции.
В общем ничего лучшего я не придумал, если нужен будет такой сброс.
Добавлено after 1 hour 46 minutes 51 second:
Вот что обнаружил, сразу то и не догадаешься такое прочитать. Видимо баг включенный в RM. Я про регистр D_CR1.
Хотя на этой ноге SWIM висит. Видимо не баг.
Ковыряюсь с внешними прерываниями. У такого конттроллера они очень упрощены. И нет флага внешнего прерывания. Ну он конечно же есть, но для софта недоступный.
Для теста специально брекпоинтился в обработчике и генерил внешнее событие.
Попытался сбросить этот внутренний флаг запретом/разрешением внеш. прерывания на пине. Это ничего не дало. Ну наверное логично, так как прерывание для всего порта идет.
Забубенил вот такой макрос
Код: Выделить всё
Clear_Fl_Ext_D EXTI_CR1_PDIS=0;EXTI_CR1_PDIS=0x3;В общем ничего лучшего я не придумал, если нужен будет такой сброс.
Добавлено after 1 hour 46 minutes 51 second:
Вот что обнаружил, сразу то и не догадаешься такое прочитать. Видимо баг включенный в RM. Я про регистр D_CR1.
Добавлено after 1 minute 59 seconds:11.9.4 Port x control register 1 (Px_CR1)
Address offset: 0x03
Reset value: 0x00 except for PD_CR1 which reset value is 0x02.
Хотя на этой ноге SWIM висит. Видимо не баг.
Re: Программирование STM8
Всем привет! Столкнулся с проблемой при разыменовывании указателя. Пользую cosmic. Передаю в функцию адрес на массива void spisendbuf(&massiv, byte) в функции spisendbuf(*massiv,byte) пытаюсь копировать значение в переменную bufer = *massiv но вместо значения получаю в буфере значение старшего адреса указателя *massiv. Как правильно копировать переменную на которую указывает указатель
Всех убить! Всё отобрать!
Re: Программирование STM8
Klepko, имя массива и есть адрес его первого элемента.
Или с индексами :
И еще вариант передачи :
Код: Выделить всё
void copy_array(uint8_t * buf)
{ uint8_t test,i;
for(i=0;i<8;i++)
{
test= *buf++;
}
}
uint8_t my_array[20]={1,45,68,34,78,23,98,56,3,0,165};
copy_array(my_array);Или с индексами :
Код: Выделить всё
void copy_array(uint8_t * buf)
{ uint8_t test,i;
for(i=0;i<8;i++)
{
test= buf[i];
}
}
И еще вариант передачи :
Код: Выделить всё
copy_array(&my_array[0]);