Zheleznjakov писал(а):Вам не хватает фришной версии с ограничением в 32кБ? по моему более чем достаточно :)
мне не хватает адекватности французов, которые высылают ключ, привязанный ко всему, к чему можно (даже венду не переставить), и делают это своими медлееенными лягушачьими лапками) а райсонанс, вроде, код похуже генерит.
тащем-та, если правила форума запрещают, то есть же личка.
don't believe what u see,
don't believe what u read
qwerky писал(а):Получилось записать, непонятно в чем была проблема. Плюс отладчик задолбал - при перепрограммировании полностью стирает EEPROM, приходится каждый раз редактировать настройки.
Теперь непонятки с watchdog. Настроил на 1 сек:
исправить запись в main.h
#define LED_GREEN E, 7, LOW, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
на
#define LED_GREEN E, 7, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
в опциях проекта на вкладке linker
в ячейку Objects
прописать либу libl0.sm8
если файл линкера пишите сами то прописать либу в него
исправить запись в main.h
#define LED_GREEN E, 7, LOW, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
на
#define LED_GREEN E, 7, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
в опциях проекта на вкладке linker
в ячейку Objects
прописать либу libl0.sm8
О, спасибо, оказывется ключевым моментом является прописать библиотеу libl0.sm8. Я смотрю, она там есть, оказывается еще там надо прописать.
Спасибо, заработало. Еще, что бы запретить запись, надо сбросить флаг DUL в регистре FLASH_IAPSR.
Я извеняюсь, что лезу с тупыми вопросами - прошу сильно не пинать.
Написал свою первую программу для ST8S207K6 в среде ST Visual Develop с компиляцией из STM8Cosmic.
Использовал только одну библиотеку STM8S207K.h
Итог программы:
#include "STM8S207K.h";
//#include "stm8_interrupt_vector.c";
void CLK_Init (void) //Функция инициализации тактового генератора
{
CLK_ECKR|=(1<<0); //Разрешаем работу от внешнего кварца
CLK_SWR = 0xB4; //Выбираем основное тактирование от внешенго кварца
CLK_SWCR |= (1<<1); //Разрешаем переключение на основное тактирование
CLK_CKDIVR = 0; //Делители частоты =1
CLK_PCKENR1 |= (1<<3); //Подключаем тактовый генератор к таймеру 4
}
void GPIO_Init (void) //Функция настройки портов ввода вывода
{
PD_DDR |= (1<<0); //PD0 на выход
PD_CR1 |= (1<<0); //PD0 Push pull
PC_DDR = 0x0E;
}
void TIM1_Init (void)
{
TIM1_CR1=0x90;//предзагрузка, счет вниз, без остановки без прерываний 0X90
TIM1_CR2=0x00;
TIM1_PSCRH=0X00;
TIM1_PSCRL=0X00;
TIM1_CCMR1=0x70;
TIM1_CCMR2=0x70;
TIM1_CCMR3=0x70;
TIM1_CCER1=0x11;
TIM1_CCER2=0x01;
TIM1_ARRH=0X3E;
TIM1_ARRL=0X80;
TIM1_CCR1H=0X00;
TIM1_CCR1L=0X0A;
TIM1_CCR2H=0X00;
TIM1_CCR2L=0X0A;
TIM1_CCR3H=0X00;
TIM1_CCR3L=0X0A;
TIM1_CR1=0x91; //Разрешаем счет
}
main()
{
CLK_Init();
GPIO_Init();
TIM1_Init();
while(1) ;
}
Проблемма в том, что запускаю програмую симуляцию - все без ошибок компелируется, программа начинает работать, но таймер просто тупа стоит - даже не знаю - может это глюк симулятора в программе.
Пробывал простейшую программу:
#include "STM8S207K.h";
//#include "stm8_interrupt_vector.c";
void CLK_Init (void) //Функция инициализации тактового генератора
{
CLK_ECKR|=(1<<0); //Разрешаем работу от внешнего кварца
CLK_SWR = 0xB4; //Выбираем основное тактирование от внешенго кварца
CLK_SWCR |= (1<<1); //Разрешаем переключение на основное тактирование
CLK_CKDIVR = 0; //Делители частоты =1
CLK_PCKENR1 |= (1<<3); //Подключаем тактовый генератор к таймеру 4
}
void TIM4_Init (void)
{
TIM4_PSCR = 0x00; //Максимальный коэффициент деления 128 частота 125кГц
TIM4_ARR = 0xD0; //Значение перезагрузки 125000/208 = 601 Гц
TIM4_CR1 |= (1<<0); //Запускаем счет
}
//Прописываем обработчик прерываний для таймера 4
main()
{
CLK_Init();
TIM4_Init();
while(1) ;
}
Таймер 4 стоит и все тут!. Подскажите в чем косяк?
enableInterrupts(); спасёт отца русской демократии)
может, ещё и в регистры таймеров что-то не то кладёте, но нет сил рассматривать ваши магические числа. надо юзать константы.
и не "Я извеняюсь", а "Извините")
don't believe what u see,
don't believe what u read
enableInterrupts(); спасёт отца русской демократии)
может, ещё и в регистры таймеров что-то не то кладёте, но нет сил рассматривать ваши магические числа. надо юзать константы.
Может тогда подсткажите как просто запустить таймер - любой. Можно даже не в програмном коде а по порядку что зачем делать.
если раскоментировать #include "stm8_interrupt_vector.c, то ругается "#error clnk Debug\l-bio.lkf:67 Debug\stm8_interrupt_vector.o: symbol __vectab multiply defined (Debug\main.o)" - это второй вопрос.
первый - запустить для меня таймер.
Возможно в программной симуляции нет внешнего кварца, либо просто не настроена.
Попробуй убрать CLK_Init().
И процедура переключения тактирования какая-то странная (см. даташит RM0016).
А вот это:
CLK_PCKENR1 |= (1<<3); //Подключаем тактовый генератор к таймеру 4
вообще подает тактирование на UART
Да и излишне это, так как в STM8S после сброса все биты в регистрах CLK_PCKENRx установлены в 1.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Возможно в программной симуляции нет внешнего кварца, либо просто не настроена
как тогда программа выполняется? она же проходит все настройки - или от внутреннего RC таймер просто не работает?
Попробуй убрать CLK_Init()
я ее ввел, чтоб заведомо быть уверенным, что регистры сброшены на значения по умолчанию - с ней или без нее таймер не работает
CLK_PCKENR1 |= (1<<3); //Подключаем тактовый генератор к таймеру 4
убрал - результат тот же
Взял программу в начале форума запустил ее - откомпелировалась.
догнал эмулятором до таймера - инициализации, а потом ео запуска - таймер стоит. Походу программа.
А Вообще инициализация в правельном порядке? И от внутреннего RC таймер работает?
А вообще есть программы типа протэуса (В протэусе таких микроконтроллеров нет), где можно НЕХ файлик зашить и проэмулировать
В программном эмуляторе может быть все что угодно.
В железе и ядро и периферия тактируются все вместе от любого из источников (HSE, HSI, LSI), только предделители раздельные на ядро и периферию.
Вообще в пошаговом режиме таймер тоже работает пошагово. поэтому для проверки нужно проследить, чтобы предделитель был равен единице (0 в регистре TIM4_PSCR), в НЕпошаговом режиме отображение регистров в отладчике не обновляется.
Вышесказанное справедливо для "железного" отладчика, программным эмулятором мне пользоваться не приходилось.
У меня переключение на кварц реализовано так (т.н. "ручное" переключение):
jtlex писал(а):
Может тогда подсткажите как просто запустить таймер - любой. Можно даже не в програмном коде а по порядку что зачем делать.
если раскоментировать #include "stm8_interrupt_vector.c, то ругается "#error clnk Debug\l-bio.lkf:67 Debug\stm8_interrupt_vector.o: symbol __vectab multiply defined (Debug\main.o)" - это второй вопрос.
первый - запустить для меня таймер.
return(0) космику не нужен, насколько я знаю - это чисто райзонансовская придурь)
clk_init и port_init вы сами напишете.
TIM1 работает в полностью автоматическом режиме с автозагрузкой без прерываний - дрыгает ногой TIM1_CH1,
TIM2 - в полностью ручном одноимпульсном режиме с прерыванием (запустили, прервался и тут же заглох).
чтобы разрешить TIM1 дрыгать ногами:
TIM1_BKR|=TIM1_BKR_MOE; //enable pwmoutputs
чтобы запретить:
TIM1_BKR&=(uint8_t)(~TIM1_BKR_MOE); //disable pwmoutputs
чтобы переключить:
TIM1_BKR^=TIM1_BKR_MOE; //toggle pwmoutputs
по второму вопросу могу, во-первых, выразить своё невыразимое удивление по поводу того, что вы директивы с комментариями путаете, во-вторых, посоветовать почитать, наконец, книжку по C. для вот самых-самых начинающих, разделы про синтаксис.
конкретно по данному случаю - символ "sharp" (#) используется в C не для комментариев, а для таких хитрых слов как define, include и пр. т.е., если вы хотите сделать дефайн или подключить файл, то вы обязаны поставить этот символ перед соответствующим словом.
однострочные комментарии (до конца строки) в C оформляются двойным бэкслешем (//), многострочные так: /*текст комментария*/.
но только не надо считать меня красноглазым насильником - я вообще-то с пасквиля начинал, и больше всего его люблю)
вдогонку вам инициализация TIM4 на 1 миллисекунду (@16MHz) с прерываниями и авторелоадом:
Спасибо Всем откликнувшимся - буду пока игнорировать "сон" таймера - буду писать дальше и ждать когда придет USB отладчик
berrymorr по поводу я имел в виду:
команда #include "stm8_interrupt_vector.c" закоментирована, то есть не выполняется - компилятор не ругается
, а если убрать // - разрешаем выполнение этой строки -подключение модуля "stm8_interrupt_vector.c" :
#include "STM8S207K.h";
#include "stm8_interrupt_vector.c";
void CLK_Init (void) //Функция инициализации тактового генератора
Компилятор ругается:
"#error clnk Debug\l-bio.lkf:67 Debug\stm8_interrupt_vector.o: symbol __vectab multiply defined (Debug\main.o)"
Может кто подскажет чего ему нехватает - непойму почему он ругается вообще на main.o? Там и ругаться то не на что.
Вообще я, честно говоря первый раз работаю с STM - до этого я сидел на Пиках и Атмелах - там иначе все реализовывал.
листинг stm8_interrupt_vector.c, где смущает, что 0x82 везде:
/* BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
* Copyright (c) 2007 STMicroelectronics
*/
@far @interrupt void NonHandledInterrupt (void)
{
/* in order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction
*/
return;
}
чтобы разрешить TIM1 дрыгать ногами:
TIM1_BKR|=TIM1_BKR_MOE; //enable pwmoutputs
чтобы запретить:
TIM1_BKR&=(uint8_t)(~TIM1_BKR_MOE); //disable pwmoutputs
чтобы переключить:
TIM1_BKR^=TIM1_BKR_MOE; //toggle pwmoutputs
Вопрос такой: если я хочу использовать выходы порта PC1...PC3 как выход ШИМ каналов таймера 1 для одновременного использования
настройки такие?: TIM1_BKR|=TIM1_BKR_MOE | TIM1_BKR_AOE; //enable pwmoutputs
TIM1_CCER1|=TIM1_CCER1_CC2E | TIM1_CCER1_CC1E;
TIM1_CCER2|=TIM1_CCER2_CC3E;
TIM1_CCMR1=0x60;
TIM1_CCMR2=0x60;
TIM1_CCMR3=0x60;
Имею платку stm8s-discovery, поставил IAR 1.3. Столкнулся со странной проблемой. Пункт меню "Project-Downoad and Debug" работает, а просто залить прошивку без дебага не получается, т.к. Project-Downoad-Download Active Application не активен
Об ассемблере STM8 написано в руководстве пользователя UM0144 с сайта www.st.com
Описанные там директивы ассемблера справедливы для STVD. У Космика и Резонанса они немного отличаются. Транслятор Ассемблера у st несколько убогий. У космика удобнее и понятнее (лично для меня).
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης