15.09.2011, 11:05
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от nagano
|
вот эт не работает
PHP код:
|
FLASH_DUKR = 0xAE; //разрешаем запись в EEPROM FLASH_DUKR = 0x56;
|
|
вроде должно быть так
Код:
|
FLASH-›DUKR = FLASH_RASS_KEY2;
FLASH-›DUKR = FLASH_RASS_KEY1; |
у меня было вот так (могу ошибаться)
Код:
|
void mcu_eeprom_unlock(void)
{
if ((FLASH-›IAPSR & FLASH_FLAG_DUL) != FLASH_FLAG_DUL)
{
FLASH-›DUKR = FLASH_RASS_KEY2;
FLASH-›DUKR = FLASH_RASS_KEY1;
while ((FLASH-›IAPSR & FLASH_FLAG_DUL) != FLASH_FLAG_DUL)
{
}
}
}
// снимаем защиту от записи EEPROM
mcu_eeprom_unlock();
e1=j; //пишем в EEPROM |
плюс ещё нужно было определить адреса регистров
+def _FLASH_IAPSR=0x5054
+def _FLASH_CR2=0x5052
но вот уже не помню для какого случая
почитайте доку на comis там все есть
__________________
ziblog.ru
Последний раз редактировалось zheleznjakov; 15.09.2011 в 11:13.
|
|
|
Сказали "Спасибо" zheleznjakov
|
|
|
15.09.2011, 12:48
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Вот тут шаблон
http://ziblog.ru/2011/04/24/stm8l-di...m8s-discovery/
исправить запись в 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
если файл линкера пишите сами то прописать либу в него
простой пример для stm8l
Код:
|
#include "main.h"
@eeprom uint8_t test;
volatile char FLASH_IAPSR @0x5054;
volatile char FLASH_CR2 @0x5051;
//------------------------------------------------------------------------------
void mcu_eeprom_unlock(void)
{
if ((FLASH-›IAPSR & FLASH_FLAG_DUL) != FLASH_FLAG_DUL)
{
FLASH-›DUKR = FLASH_RASS_KEY2;
FLASH-›DUKR = FLASH_RASS_KEY1;
while ((FLASH-›IAPSR & FLASH_FLAG_DUL) != FLASH_FLAG_DUL)
{
}
}
}
//------------------------------------------------------------------------------
int main(void)
{
PIN_CONFIGURATION(LED_GREEN);
mcu_eeprom_unlock();
test = 1;
if(test == 1)
{
PIN_ON(LED_GREEN);
}
else
{
PIN_OFF(LED_GREEN);
}
while (1)
{
}
return 0;
} |
__________________
ziblog.ru
Последний раз редактировалось zheleznjakov; 15.09.2011 в 12:58.
|
|
|
Сказали "Спасибо" zheleznjakov
|
|
|
18.09.2011, 21:37
|
|
Частый гость
Регистрация: 23.05.2009
Сообщений: 46
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Попробовал написать чего-нибудь в STVD - дерьмо редкостное, такое ощущение что ST взяло всех в халявные бэта-тестеры ..... эти уроды даже ассемблер сделать не могут нормально
|
|
|
|
27.09.2011, 13:33
|
|
Прописка
Регистрация: 15.01.2008
Сообщений: 120
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM8(S/L), первые впечатления
Как описать функцию прерывания в Cosmic без
библиотеки от ST? Кто-то пробовал? Поделитесь.
|
|
|
|
27.09.2011, 22:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Подключается в проект файл stm8_interrupt_vector.c со всеми векторами.
Пишется в любом си файле включенном в проект обычная функция. Она должна не возвращать значений и не принимать параметров. К примеру void TIM3_UPD(void), добавляя вначале @far @interrupt . То есть функция выглядит так:
Код:
|
@far @interrupt void TIM3_UPD(void)
{
.......
} |
Дальше в файл с векторами перед описанием векторов добавляется ее прототип:
Код:
|
extern @far @interrupt void TIM3_UPD(void); |
На место нужного вектора вписывается имя функции:
Код:
|
....
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, (interrupt_handler_t)TIM3_UPD}, /* irq15 */
{0x82, NonHandledInterrupt}, /* irq16 */
.... |
все.
Последний раз редактировалось kison; 27.09.2011 в 22:51.
|
|
|
Эти 4 пользователя(ей) сказали Спасибо kison за это сообщение:
|
|
|
28.09.2011, 09:22
|
|
Прописка
Регистрация: 15.01.2008
Сообщений: 120
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM8(S/L), первые впечатления
Спасибо, заработало. Прием по USART в прерывании сделал.
|
|
|
|
30.09.2011, 12:11
|
|
Прохожий
Регистрация: 15.10.2010
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Коллеги, подскажите где косяк.
Использую ST visual develop + raisonance
Обнаружил странную вещь с использованием sprintf
Простой код:
Код:
|
#include ‹stdio.h›
void main(){
char str[20];
sprintf (str,"test %d",123);
while (1);
} |
Когда делаю компиляцию (compile)- все ок
Когда делаю сборку (build) - ошибка:
Код:
|
***ERROR 100 : UNRESOLVED EXTERNAL
SYMBOL : ?putchar(WRITECHAR)
LINK/LOCATE RUN COMPLETE, 1 ERROR FOUND.
The command: "rlstm8 -P "Debug\main.o" TO(Debug\counter.aof) LIBPATH("C:\Program Files\Raisonance\Ride\Lib\ST7") DEBUGLINES DEBUGPUBLICS DEBUGSYMBOLS PR(Debug\counter.map) DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x201) EEPROMSTART(0x1000) EEPROMSIZE(0x400) " has failed, the returned value is: 1
exit code=1.
counter.elf - 2 error(s), 0 warning(s) |
Причем в самом ride7 все нормально.
Что не так?
|
|
|
|
30.09.2011, 14:09
|
|
Прохожий
Регистрация: 05.11.2006
Сообщений: 6
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM8(S/L), первые впечатления
Сообщение от picmail
|
Коллеги, подскажите где косяк.
Использую ST visual develop + raisonance
Обнаружил странную вещь с использованием sprintf
Простой код:
Код:
|
#include ‹stdio.h›
void main(){
char str[20];
sprintf (str,"test %d",123);
while (1);
} |
Когда делаю компиляцию (compile)- все ок
Когда делаю сборку (build) - ошибка:
Код:
|
***ERROR 100 : UNRESOLVED EXTERNAL
SYMBOL : ?putchar(WRITECHAR)
LINK/LOCATE RUN COMPLETE, 1 ERROR FOUND.
The command: "rlstm8 -P "Debug\main.o" TO(Debug\counter.aof) LIBPATH("C:\Program Files\Raisonance\Ride\Lib\ST7") DEBUGLINES DEBUGPUBLICS DEBUGSYMBOLS PR(Debug\counter.map) DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x201) EEPROMSTART(0x1000) EEPROMSIZE(0x400) " has failed, the returned value is: 1
exit code=1.
counter.elf - 2 error(s), 0 warning(s) |
Причем в самом ride7 все нормально.
Что не так?
|
Попробуй прописать в коде ф-цию:
void putchar ( uint8_t ch )
{
//здесь вывод в какой либо из UART..
}
|
|
|
|
30.09.2011, 14:45
|
|
Прохожий
Регистрация: 15.10.2010
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Это к чему?
Мне надо сформировать строку и записать ее в переменную str.
В этом и есть идея sprinf.
Причем тут УАРТ?
|
|
|
|
04.10.2011, 18:45
|
|
Прохожий
Регистрация: 04.10.2011
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Здравствуйте!
Прошу помощи гуру, имеющих или имевшим дело с контроллерами STM8. Решил попробовать освоить их как предварительную "ступень" перед переходом на STM32. Заказал себе плату STM8 Discovery, жду, пока приедет. Пока решил почитать даташит и попробовать что-нибудь написать+отладить в симуляторе.
Среда разработки - STVD, язык - ассемблер, компилятор встроенный в среду, другого не скачивал.
Почитал ту скудную информацию, которую удалось добыть в сети по началу работы с STM8 на ассемблере. Прочитал даташит. Решил попробовать по аналогии с найденным в интернете включением диода на ножке сделать переключение источника тактирования на внешний кварц.
Вот такой код. Вместо бесконечного цикла, сгенерированного программой, вставил кусочек кода, составленный прямо по даташиту.
Код:
|
stm8/
#include "mapping.inc"
#include "STM8S105C6.inc"
segment 'rom'
main.l
; initialize SP
ldw X,#stack_end
ldw SP,X
#ifdef RAM0
; clear RAM0
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
ldw X,#ram0_start
clear_ram0.l
clr (X)
incw X
cpw X,#ram0_end
jrule clear_ram0
#endif
#ifdef RAM1
; clear RAM1
ram1_start.w EQU $ram1_segment_start
ram1_end.w EQU $ram1_segment_end
ldw X,#ram1_start
clear_ram1.l
clr (X)
incw X
cpw X,#ram1_end
jrule clear_ram1
#endif
; clear stack
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
ldw X,#stack_start
clear_stack.l
clr (X)
incw X
cpw X,#stack_end
jrule clear_stack
; Здесь начинается мой код.
start.l
BSET CLK_SWCR,#1
BRES CLK_SWCR,#2 ;выкл. прерывание
LD A,#$B4 ;значение для внешнего кварца
LD CLK_SWR,A ;загружаем
loop.l ;бесконечный цикл
jra loop
interrupt NonHandledInterrupt
NonHandledInterrupt.l
iret
segment 'vectit'
dc.l {$82000000+main} ; reset
dc.l {$82000000+NonHandledInterrupt}; trap
dc.l {$82000000+NonHandledInterrupt}; irq0
dc.l {$82000000+NonHandledInterrupt}; irq1
dc.l {$82000000+NonHandledInterrupt}; irq2
dc.l {$82000000+NonHandledInterrupt}; irq3
dc.l {$82000000+NonHandledInterrupt}; irq4
dc.l {$82000000+NonHandledInterrupt}; irq5
dc.l {$82000000+NonHandledInterrupt}; irq6
dc.l {$82000000+NonHandledInterrupt}; irq7
dc.l {$82000000+NonHandledInterrupt}; irq8
dc.l {$82000000+NonHandledInterrupt}; irq9
dc.l {$82000000+NonHandledInterrupt}; irq10
dc.l {$82000000+NonHandledInterrupt}; irq11
dc.l {$82000000+NonHandledInterrupt}; irq12
dc.l {$82000000+NonHandledInterrupt}; irq13
dc.l {$82000000+NonHandledInterrupt}; irq14
dc.l {$82000000+NonHandledInterrupt}; irq15
dc.l {$82000000+NonHandledInterrupt}; irq16
dc.l {$82000000+NonHandledInterrupt}; irq17
dc.l {$82000000+NonHandledInterrupt}; irq18
dc.l {$82000000+NonHandledInterrupt}; irq19
dc.l {$82000000+NonHandledInterrupt}; irq20
dc.l {$82000000+NonHandledInterrupt}; irq21
dc.l {$82000000+NonHandledInterrupt}; irq22
dc.l {$82000000+NonHandledInterrupt}; irq23
dc.l {$82000000+NonHandledInterrupt}; irq24
dc.l {$82000000+NonHandledInterrupt}; irq25
dc.l {$82000000+NonHandledInterrupt}; irq26
dc.l {$82000000+NonHandledInterrupt}; irq27
dc.l {$82000000+NonHandledInterrupt}; irq28
dc.l {$82000000+NonHandledInterrupt}; irq29
end |
Собственно, решил просмотреть всё это дело во встроенном симуляторе. Всё компилится, всё замечательно.
Первый вопрос: где можно посмотреть значения контроллерных спецрегистров? Наблюдать их в окне Memory, которое сплошняком показывает всю память контроллера, как-то не очень наглядно.
Второй вопрос: у многих регистров есть так называемое Reset Value. Почему в окне Memory все регистры, кроме очищенных в начале кода, равны 0xFF?
Третий вопрос: почему приведённый выше код, хоть и изменяет значения регистров (от 0xFF) согласно данным командам, ни к чему не приводит? Как вообще правильно инициализировать контроллер? В примерах из сети якобы всё прекрасно работает, хотя там всего одна строчка (выдача 1цы на ножку) добавляется вместо бесконечного цикла, который с самого начала в программе стоит.
И, наконец, четвёртый вопрос - есть ли что-то ... ну, поприличнее, что ли, этой среды разработки, где можно нормально писать на ассемблере под STM8? После MPLAB этот STVD поначалу кажется неудобным, да ещё и симулятор как-то странно работает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:59.
|
|