Перейти к содержанию

    

asm исходники для отладочной платы str912-sk

Доброго времени суток и с наступающими праздниками.

Прошу по возможности оказать содействие в следующей проблеме. Приобретена отладочная плата str912-sk (на основе процессора STR912FA W44X6), софт IAR Embedded Workbench 4.0. после включения все вроде работает, удается запускать исходники, идущие в комплекте к софту и проделывающие на плате разные трюки - от простого вывода на порт светодиодов до примеров работы с остальной периферией.

но вся беда в том что они написаны на СИ, а на ассемблере нету ни одного. Если кто имел дело с такой платой - прошу поделиться кусками написанных прогамм, а то ведь вообще ппц - начинать не с чего, негде взять образец ЛЮБОЙ работающей программы на ассм, чтобы увидеть как там заголовок идет и чем кончается))).

Интересует простейшая программа - выдача в бесконечном цикле инкремента байта в порт GPIO3 (там светодиоды).

Спасибо за внимание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

АСМ, по ряду причин, не пользуется особой популярностью среди программистов АРМов. На нем пишут начальную инициализацию (startup.s в идеологии IAR) и особо критичные секции.

 

З.Ы. на сайте ST в разделе Application Notes точно есть 1 пример на АСМ - это оптимизированная memcpy.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
..но вся беда в том что они написаны на СИ, а на ассемблере нету ни одного.

Можете начинать писать на 'C'. Пора. Заниматься писанием на ASM чего-либо функционально законченного для такого уровня контроллеров, очень мягко говоря, неразумно. Кусочек о пару десятков-сот команд оптимизированный ручками это нормально, но это потом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за ответы) значит будем потихоньку переходить на С

возник еще вопрос: на STR912 пытаюсь настроить GPIO3 на вывод и прописать в него константу, для этого был создан следующий шэдэвр

 

NAME main

PUBLIC main

COMMON INTVEC:CODE

CODE32

B main

RSEG ICODE:CODE

 

mdd1 dc32 0x4c002050 //(адрес регистра SCU_GPIOOUT3)

mdd2 dc32 0x48009400 //(адрес регистра GPIO_DIR)

mdd3 dc32 0x480093fc //(адрес GPIO_DATA, в котором задана маска 11111111)

 

 

CODE32

 

main nop

nop

nop

nop

 

//GPIO data direction register ( 1: Output)

 

ldr r0,mdd2

mov r1,#0xff

strb r1,[r0]

nop

 

//GPIO output register (SCU_GPIOOUTn) set 01: Alternate Output 1 (general purpose output)

 

ldr r0,mdd1

mov r1, #0x55

strb r1,[r0]

strb r1,[r0,#1]

 

 

 

//GPIO data register (GPIO_DATA)

 

 

ldr r0,mdd3

mov r1, #0x0f

strb r1,[r0]

 

main1

B main1

END main

 

в общем он не работает(((

по даташиту описана процедура настройки порта на вывод: нужно настроить порт на вывод, определить Alternate Function 1 (output from GPIO_DATA register) и собственно послать выводимый байт по адресу, биты 9:2 которого содержат маску.

это и проделано в программе. что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
что не так?
В используемом вами пакете есть симулятор (иконка с зеленой лупой). Вы можете самостоятельно пройти ваш код по шагам и в соответствующих окнах (View->Register) увидеть - в какие регистры что записывает ваша программа. Дальше медитировать над исходным текстом, если пишется не то или не туда.

По вашему словесному описанию:

#include <iostr912.h>
int main()
{
    SCU_GPIOOUT3 = 0x5555;  // I/O
    GPIO3_DIR = 0xFF;   // output
    GPIO3_DATA = 0x0F;   // write constant
    for(;;)
       ;
}

Сравнивайте сложноcть исходного текста :biggrin:

Если будете продолжать на ассемблере - включите в начале исходника заголовочный файл iostr912.h, в нем описаны имена всех регистров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сэр Сергей Борщ, благодарю за советы. К сожелению написаный фрагмент тоже не работает нужным образом( судя по всему алгоритм инициализации порта неправильный((

вроде все делается согласно даташиту, но порт на вывод не удается настроить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите Peripheral clock gating register 1 (SCU_PCGR1).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
К сожелению написаный фрагмент тоже не работает нужным образом( судя по всему алгоритм инициализации порта неправильный((
У меня нет STR912 живьем, я с ним не работаю, даташит не читал и пример писал с ваших слов, просто для иллюстрации. Увы - чем могу... Тут появляется AlexandrY, он работает с STR9хх. Почитайте описания с его сайта, но лучше еще раз внимательно проштудировать документацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

действительно не хватало включить перифирию, процесс затянулся всвязи с опечаткой в даташите производителя - неверно указан адрес

14 SCU_PCGR0 Reserved Peripheral Clock Gating Reg. 0

48 SCU_PCGR1 Reserved Peripheral clock Gating Register 1=========18 а не 48

1C SCU_PRR0 Reserved Peripheral Reset Reg. 0

 

в завершении темы публикую законченый шэдэвр простейшей программы на ассме, которая инициализирует порт на вывод и выводит в него 0х55 в замкнутом цикле. надеюсь кому-то это поможет.

===============================================

 

NAME main

PUBLIC main

COMMON INTVEC:CODE

CODE32

B main

RSEG ICODE:CODE

 

 

s_gpout3 dc32 0x4c002050 //SCU_GPIOOUT3 (16 бит)

pcgr1 dc32 0x4c002018 //SCU_PCGR1 (32)

prr1 dc32 0x4c002020 //SCU_PRR1 (32)

mgr1 dc32 0x4c002028 //SCU_MGR1 (32)

pecgr1 dc32 0x4c002030 //SCU_PECGR1 (32)

s_gpt3 dc32 0x4c002090 //SCU_GPIOTYPE3 (8)

 

gp03sel dc32 0x48009420 //GPIO_SEL (8)

gp03dir dc32 0x48009400 //GPIO_DIR (8)

data3 dc32 0x480093fc //GPIO_DATA (8)

 

CODE32

 

main nop

nop

nop

nop

 

//SCU_PCGR1_bit.GPIO3 = 1;

ldr r0,pcgr1;

mov r1,#0x02;

strb r1,[r0,#2];

nop;

//SCU_PRR1_bit.RST_GPIO3 = 1;

ldr r0,prr1;

mov r1, #0x02;

strb r1,[r0,#2];

//SCU_MGR1_bit.MSK_GPIO3 = 1;

ldr r0,mgr1;

mov r1, #0x02;

strb r1,[r0,#2];

//SCU_PECGR1_bit.GPIO3 = 1;

ldr r0,pecgr1;

mov r1,#0x02;

strb r1,[r0,#2];

nop;

//GPIO3_SEL = 0;

ldr r0,gp03sel;

mov r1, #0x0;

strb r1,[r0];

// GPIO3_DIR = 0xFF;

ldr r0,gp03dir;

mov r1, #0xff;

strb r1,[r0];

// SCU_GPIOTYPE3 = 0;

ldr r0,s_gpout3 ;

mov r1, #0x0;

strb r1,[r0];

// SCU_GPIOOUT3 = 0x5555;

ldr r0,s_gpout3;

mov r1, #0x55;

strb r1,[r0];

strb r1,[r0,#1];

 

main1

// SCU_GPIOTYPE3 = 0;

ldr r0,data3 ;

mov r1, #0x55;

strb r1,[r0];

 

 

 

 

B main1;

END main

==================

всем спасибо, и удачных проектов!

Изменено пользователем s868

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация