s868 0 28 декабря, 2007 Опубликовано 28 декабря, 2007 · Жалоба Доброго времени суток и с наступающими праздниками. Прошу по возможности оказать содействие в следующей проблеме. Приобретена отладочная плата str912-sk (на основе процессора STR912FA W44X6), софт IAR Embedded Workbench 4.0. после включения все вроде работает, удается запускать исходники, идущие в комплекте к софту и проделывающие на плате разные трюки - от простого вывода на порт светодиодов до примеров работы с остальной периферией. но вся беда в том что они написаны на СИ, а на ассемблере нету ни одного. Если кто имел дело с такой платой - прошу поделиться кусками написанных прогамм, а то ведь вообще ппц - начинать не с чего, негде взять образец ЛЮБОЙ работающей программы на ассм, чтобы увидеть как там заголовок идет и чем кончается))). Интересует простейшая программа - выдача в бесконечном цикле инкремента байта в порт GPIO3 (там светодиоды). Спасибо за внимание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 28 декабря, 2007 Опубликовано 28 декабря, 2007 · Жалоба АСМ, по ряду причин, не пользуется особой популярностью среди программистов АРМов. На нем пишут начальную инициализацию (startup.s в идеологии IAR) и особо критичные секции. З.Ы. на сайте ST в разделе Application Notes точно есть 1 пример на АСМ - это оптимизированная memcpy. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 28 декабря, 2007 Опубликовано 28 декабря, 2007 · Жалоба ..но вся беда в том что они написаны на СИ, а на ассемблере нету ни одного. Можете начинать писать на 'C'. Пора. Заниматься писанием на ASM чего-либо функционально законченного для такого уровня контроллеров, очень мягко говоря, неразумно. Кусочек о пару десятков-сот команд оптимизированный ручками это нормально, но это потом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s868 0 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба спасибо за ответы) значит будем потихоньку переходить на С возник еще вопрос: на 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 которого содержат маску. это и проделано в программе. что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба что не так?В используемом вами пакете есть симулятор (иконка с зеленой лупой). Вы можете самостоятельно пройти ваш код по шагам и в соответствующих окнах (View->Register) увидеть - в какие регистры что записывает ваша программа. Дальше медитировать над исходным текстом, если пишется не то или не туда. По вашему словесному описанию: #include <iostr912.h> int main() { SCU_GPIOOUT3 = 0x5555; // I/O GPIO3_DIR = 0xFF; // output GPIO3_DATA = 0x0F; // write constant for(;;) ; } Сравнивайте сложноcть исходного текста Если будете продолжать на ассемблере - включите в начале исходника заголовочный файл iostr912.h, в нем описаны имена всех регистров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s868 0 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба Сэр Сергей Борщ, благодарю за советы. К сожелению написаный фрагмент тоже не работает нужным образом( судя по всему алгоритм инициализации порта неправильный(( вроде все делается согласно даташиту, но порт на вывод не удается настроить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба Порт для начала надо включить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s868 0 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба как?) какой регистр за это отвечает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба Смотрите Peripheral clock gating register 1 (SCU_PCGR1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба К сожелению написаный фрагмент тоже не работает нужным образом( судя по всему алгоритм инициализации порта неправильный((У меня нет STR912 живьем, я с ним не работаю, даташит не читал и пример писал с ваших слов, просто для иллюстрации. Увы - чем могу... Тут появляется AlexandrY, он работает с STR9хх. Почитайте описания с его сайта, но лучше еще раз внимательно проштудировать документацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s868 0 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба спасибо, ребята. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s868 0 15 января, 2008 Опубликовано 15 января, 2008 (изменено) · Жалоба действительно не хватало включить перифирию, процесс затянулся всвязи с опечаткой в даташите производителя - неверно указан адрес 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 ================== всем спасибо, и удачных проектов! Изменено 15 января, 2008 пользователем s868 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться