Кто бы по ассемблеру для STM8 подсказал бы?

Пытаюсь мучить STM8L-Discovery. Пока что, разумеется, мучает она меня :)
Скачал STVD с st.com, начал пытаться помигать светодиодами на ассемблере. И при первой же компиляции ругается на то, что ему, по его мнению, никто не рассказал, кто такой PC_DDR: **c:\......\st_toolset\stvd\ledblink\Debug\main.obj(0): lyn: Error 10: Undefined EXTERNAL PC_DDR (from c:\.......\st_toolset\stvd\ledblink\Debug\main.obj) ''. Разумеется, STM8L152C6.INC подключал, и даже любезно скопировал в папку с проектом. Как с этим бороться?
  • 0
  • 17 июня 2011, 17:01
  • Deer

Комментарии (17)

RSS свернуть / развернуть
Разумеется, STM8L152C6.INC подключал, и даже любезно скопировал в папку с проектом. Как с этим бороться?
Очень просто. Нужно лишь прописать определения регистров. Для большего удобства, можно прописать определения в файле «main», который использует настройщик проекта.

	#define PC_ODR $500A;Port C data output latch register
	#define PC_IDR $500B;Port C input pin value register
	#define PC_DDR $500C;Port C data direction register
	#define PC_CR1 $500D;Port C control register 1
	#define PC_CR2 $500E;Port C control register 2
0
Спасибо, вроде заработало!

Осталось только, чтобы не надо было вручную каждый раз прописывать всю эту кучу дефайнов при живых-то .INC-файлах
0
вчера такая же ошибка вылазела с подключением файлов. решил проблему так: в тексте программы прописал #include «STM8L152C6.inc» и через Project/Insert Files To Project добавил файл stm8l152.asm. В ручную не определял регистры
0
О! Вообще круто!
Ещё немного, и будем тоже делать великие дела на STM8! :)
0
Один светодиод мигает! Я безумно рад! :)
Жалко, что сессия мешает вплотную заняться дальнейшим освоением STM-ок…
0
Народ, давайте с АЦП разбираться. У кого-нибудь есть рабочий код запуска АЦП?

Нижеприведенный код почему-то не работает:
        mov $5341,#%00000000;
	bset $50C4,#0;CLK_PCKENR2 ADC clock enable
	mov $5340,#$00
	bset $534F,#3;ADC1_TRIGR2 off trig for ch19
	bset $534A,#7;ADC1_SQR1 DMA disable
	bset $534D,#0;ADC1_SQR4 one ch
	bset $5341,#2;ADC1_CR2 48 cycles
	mov $5340,#%00000000;
	bset $5340,#1

При пошаговой отладке с STVD постоянно появляется баг:
в регистре ADC1_CR2 откуда-то берется число 1F, и запись в него нулей (mov $5341,#%00000000) не получается!
0
АЦП нормально работал у меня, правда я писал на С. Если потерпишь пару дней — выложу код, пока просто некогда.
0
Извини друг, слишком уж руки чешутся запустить этот АЦП :)
После трехчасового бодания с STM8LDiscovery под управлением STVD, было установлено, что запись в регистры АЦП разрешается только после включения тактирования модуля АЦП (регистр CLK_PCKENR2). Во избежание путаницы с содержимым регистров при отладке в STVD, нужно учитывать, что их адреса показаны через один а содержимое объединено попарно. Выкладываю вариант инициализации АЦП STM8L152C6T6:

        bset $50C4,#0 ;CLK_PCKENR2 включить тактирование АЦП
	bset $534F,#3 ;ADC1_TRIGR2 отключить триггер канала 19
	bset $534A,#7 ;ADC1_SQR1 отключить DMA
	bset $534B,#3 ;ADC1_SQR2 разрешить считывание канала 19
	bset $5341,#0 ;ADC1_CR2 установить длительность преобразования 9 циклов
	mov $5342,#%00110011 ;ADC1_CR3 опять 9 циклов и канал 19
	bset $5340,#0 ;ADC1_CR1 включить АЦП
	bset $5340,#1 ;ADC1_CR1 начать преобразование

continue
	btjt $5343,#0,exit_conv ;проверка флага окончания преобразования
jp continue; если флаг ЕОС не установлен, повторить проверку
exit_conv

;загружаем результат преобразования в ячейку $05 RAM
	ld A,$5345 ;загрузить ADC1_DRL в A
	ld $05,A
0
кстати, за сколько тактов выполняется инструкция «BTJT»?
0
Если бит установлен, тогда 3 цикла, если нет, тогда 2 цикла.
0
Вот так можно запустить 8-битный Timer4:

	bset $50C3,#2 ;CLK_PCKENR1 включить тактирование Timer4 
	mov $52E8,#%00000000 ;TIM4_PSCR коэффициент деления 0
	mov $52E9,#$ff ;TIM4_ARR порог перезагрузки 255
	bres $52E5,#0 ;TIM4_SR1 сбросить update flag
	bset $52E0,#0 ;ПОЕХАЛИ! ☺

Для проверки работы таймера4, сразу после инициализации поставил 50 команд nop. При пошаговой отладке в STVD натикало 63 тика(!), при безостановочном выполнении программы до брекпоинта, стоящего после 50-го nopа, натикало правильно, то есть 50 тиков.
0
Небольшое но очень существенное дополнение: для выбора коэффициента деления отличного от нуля (то есть от дефолтного значения), нужно перед этим установить бит UG в регистре TIM4_EGR:
bset $52E6,#0 ;TIM4_EGR Update generation
0
Вдогонку, таблица выбора коэффициента деления Timer4 (регистр TIM4_PSCR):
0001-2
0010-4
0011-8
0100-16
0101-32
0110-64
0111-128
1000-256
1001-512
1010-1024
1011-2048
1100-4096
1101-8192
1110-16384
1111-32768
0
Раз уж пошла такая пьянка, давайте заодно с тактированием поиграемся из-под ассемблера!
0
Ходят слухи, что управлять частотой встроенного генератора можно через регистр CLK_CKDIVR ;)
Всего лишь одной командой, микроконтроллер превращается… превращается микроконтроллер… в гоночный болид:

mov $50C0,#%00000000 ;CLK_DIVR f=16MHz
0
так и есть. по дефолту 2МГц. обнулив коэффициент деления частоты получаем 16МГц :)
0
Ставлю STM8L жирный плюс за возможность выбрать оптимальную частоту из весьма внушительного ряда: 16M, 8M, 4M, 2M, 1M, 0,5M, 0,25M, 0,125M. А также за то, что частоту можно переключать на ходу.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.