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

Приобрел EM430F5137RF900 и MSP-FET430UIF, до приобретения особо не заморачивался с подготовкой "рабочего пространства" под новый проект, вроде бы камни не особенно новые, часто встречал различную информацию о них и не думал, что доставабельностью нужной для начала разработки инфы возникнут проблемы. Пол дня поискал в сети примеры заголовочных файлов под этот камень, примеры инициализации периферии, увы - результат 0. Это такой секрет? Такие данные достаются потом и кровью? Раньше работал с AVR (да и продолжаю время от времени), никаких таких проблем не помню, все было как-то проще достать и среда разработки нормальная (и бесплатная). Бог с ней со средой, поставил IAR KS на 4кБ кода (мне для попробовать). С самим ассемблером MSP и системой команд ознакомился поверхностно, страха не вызвал, вроде бы все просто (по крайней мере помигать светодиодом для начала - понятно как, а особенности и "камни" по ходу дела разберу). Стандартный заголовочный файл, который есть в папке иара "\inc" при пустом проекте вызывает негодование у компилятора IAR (дублирование лэйблов в объявлении регистров DMA). Попытался найти нормальный заголовочный файл в сети - нашел лишь такой же, "замазал" все места вызывающие негатив комментариями, чтобы не было ошибок. Далее попытался найти файл, который инициализировал бы мне всю периферию - тут все и загнулось. Я понимаю, что скорее всего при запуске МК все отключает сам и морганию светодиодом врядли что-то помешает, но хотелось бы иметь заготовку с полной инициализацией всех узлов МК ну и ессно полную таблицу векторов прерываний воткнуть в начало. Это добавляет уверенности в дальнейшем освоении камня. В отладчике иара тож пока особо не разобрался, если честно с первого раза иар вроде показался "классическим" средством разработки с простым и понятным интерфейсом, как начал лезть глубже - начало казаться, что первое впечатление обманчиво, чувство "чего-то не хватает" не покидает - ну к примеру как мне для отладчика задать тип МК, частоту кварца (чтоб время выполения отслеживать), также не нашел средства для заливки прошивки в МК (нужно отдельным ПО для этого ввоспользоваться чтоли?!). Прошу извинить за смешивание всего в кучу - помогите найти (или разобраться) с заголовочный файл для ассемблера под этот МК, файл инициализации всех устройств на борту, ну и вектора прерываний до кучи. На Си для МК не программирую и не особо горю желанием.

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


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

Стандартный заголовочный файл, который есть в папке иара "\inc" при пустом проекте вызывает негодование у компилятора IAR (дублирование лэйблов в объявлении регистров DMA). Попытался найти нормальный заголовочный файл в сети - нашел лишь такой же, "замазал" все места вызывающие негатив комментариями, чтобы не было ошибок.

Хедер cc430f5137.h из папки 430\inc\ не вызывает никаких негодований.

Далее попытался найти файл, который инициализировал бы мне всю периферию - тут все и загнулось. Я понимаю, что скорее всего при запуске МК все отключает сам и морганию светодиодом врядли что-то помешает, но хотелось бы иметь заготовку с полной инициализацией всех узлов МК ну и ессно полную таблицу векторов прерываний воткнуть в начало.

Я не знаю, каким именно предыдущим опытом вы так "развращены", но придется огорчить вас - в IAR нет встроенных средств для подготовки шаблона полной инициализации периферии. Можно использовать какие-то примеры, но полную инициализацию периферийных модулей вам придется писать самому - ручками. В IAR есть лишь этакий минивизард, который создает шаблон типа такого.

#include "msp430.h"                     ; #define controlled include file

       NAME    main                    ; module name

       PUBLIC  main                    ; make the main label vissible
                                       ; outside this module
       ORG     0FFFEh
       DC16    init                    ; set reset vector to 'init' label

       RSEG    CSTACK                  ; pre-declaration of segment
       RSEG    CODE                    ; place program in 'CODE' segment

init:   MOV     #SFE(CSTACK), SP        ; set up stack

main:   NOP                             ; main program
       MOV.W   #WDTPW+WDTHOLD,&WDTCTL  ; Stop watchdog timer
       JMP $                           ; jump to current location '$'
                                       ; (endless loop)
       END

ну к примеру как мне для отладчика задать тип МК,
В опциях проекта задается. Project->Options->General Options->Target->Device в выпадающем списке выбираете CC430F5137.

частоту кварца (чтоб время выполения отслеживать),
В отладчике можно вывести окно Register, где отображаются CYCLECOUNTER и CCSTEP. Поделите их значение на частоту тактирования ядра (величина тактового сигнала MCLK) и вы получите время выполнения.

также не нашел средства для заливки прошивки в МК (нужно отдельным ПО для этого ввоспользоваться чтоли?!).
Опять же в опциях проекта нужно выбрать соответствующий эмулятор. Во-первых, нужно установить режим отладки, а не симуляции Project->Options->Debugger->Setup->FET Debugger. Во-вторых, выбрать его тип Project->Options->Debugger->FET Debugger->Setup->Texas Instrument USB-IF.

 

Вообще, хочется пожелать вам много терпения для изучении документации, которую вы можете найти на страничке продукта. http://www.ti.com/product/cc430f5137

В первую очередь вам понадобится User's Guide в котором описаны все, что есть общего в МК серии СС430. Конкретные же особенности данного кристалла (CC430F5137) вам следует уточнять в его datasheet. На той же страничке продукта есть дополнительные материалы по применению - Application Notes.

Про IAR читайте в его собственных документах. Help->ну и там соответствующий Guide.

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


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

Благодарю за напутственные пояснения, наконец-то появилось время вернуться к изучению данного вопроса. Значит подключил я отладчик к ПК и к таргету. Создал "пустой" проект на ассемблере. Узнал о том, что сторожевой таймер по умолчанию у MSP всегда включен - IAR сформировал начальный кусок кода с его отключением. Отлично, дополнительно я запретил все прерывания (на всякий случай) и принялся моргать светодиодом. Сходу получилось, я был рад, но потом начал разбираться в организации памяти этого камня и наткнулся на пока необъяснимую для меня (чайника) вещь. Я моргаю светодиодом с помощью начальной установки пина 0 порта 1 на вывод командой "BIS.W 0x0001,PADIR", затем собственно моргаю командами "BIS.W 0x0001,PAOUT" и "BIC.W 0x0001,PAOUT". При изменении кода на начальную установку командой "BIS.B 0x01,P1DIR" с морганием командами "BIS.B 0x01,P1OUT" и "BIC.B 0x01,P1OUT" иар благополучно запускает отладчик, но моргания не происходит. Почему? (прошу извинить за нубовские вопросы, но, как вы и сами знаете при начале освоения новой архитектуры бывают мелкие запинки, которые кажутся непреодолимыми стенами).

 

Честно говоря моргание не исчезает, почему то данные, которые я отправляю в порт не соответствуют реальным на плате таргета. Записываю 0x40 - получаю 0xFF. Эээ.. что-то я недочитал видимо..

 

        DINT
        BIS.B   0xFF,P1DIR
        CLR.B   P1OUT
loop1:
        MOV.B     0x00,P1OUT
        MOV.B     0x01,P1OUT
        JMP loop1

 

Записываю в порт 0x00 - получаю 0x31. Записываю в порт 0x02 - получаю 0xFE. Что я делаю не так, Help!

 

Моргание получилось, ура, пока вслепую применил увиденный принцип записи (моргаю аж двумя светодиодами поочереди):

 

        DINT
        CLR.B   P1SEL                  ; configure Port 1
        MOV.B   #0FFh,&P1DIR
        CLR.B   P1OUT
        CLR.B   P3SEL                  ; configure Port 3
        MOV.B   #0FFh,&P3DIR
        CLR.B   P3OUT
loop1:
        MOV.B     #00h,&P1OUT
        MOV.B     #40h,&P3OUT
        MOV.B     #01h,&P1OUT
        MOV.B     #00h,&P3OUT
        JMP loop1

 

Пока не понял как влияют символы "#" и "&", но они позволяют корректно передавать данные регистрам. Кстати, к примеру, запись числа в виде "#FFh" не катит, правильно будет "#0FFh" - этой фишки тоже пока не понял. Видимо все это особенности ассемблера.

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

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


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

"#" - непосредственный операнд, если значение начинается с hex-буквы, то надо ноль спереди. "&" - работа с переменной в памяти (или портом, которые тоже в памяти), адрес которой указан после этого символа.

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


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

А правда то, что ограничение 4кБ IAR Kickstart относится только к программам на Си? Если пишешь на ассемблере, то ограничений вообще никаких нет?

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


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

А правда то, что ограничение 4кБ IAR Kickstart относится только к программам на Си? Если пишешь на ассемблере, то ограничений вообще никаких нет?

Вроде бы как да...

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


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

Почитал о режимах адресации, впринципе все понятно кроме одного: в чем принципиальная разница между символьной и абсолютной адресацией? Ну, к примеру, команды "MOV.B #00h,P3OUT" и "MOV.B #00h,&P3OUT" в результате дают одно и тоже. Единственное "преимущество" абсолюной адресации это гарантия переносимости программы с камня на камень. По-моему, можно на это забить по началу и пользоваться символьной адресацией без перегружения кода закорючками "&". Есть у профи мнения на этот счет? Или при обращении к конкретной периферии лучше изначально пользоваться абсолютной адресацией?

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


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

Почитал о режимах адресации, впринципе все понятно кроме одного: в чем принципиальная разница между символьной и абсолютной адресацией? Ну, к примеру, команды "MOV.B #00h,P3OUT" и "MOV.B #00h,&P3OUT" в результате дают одно и тоже. Единственное "преимущество" абсолюной адресации это гарантия переносимости программы с камня на камень. По-моему, можно на это забить по началу и пользоваться символьной адресацией без перегружения кода закорючками "&". Есть у профи мнения на этот счет? Или при обращении к конкретной периферии лучше изначально пользоваться абсолютной адресацией?

Задавал я уже такой вопрос. Почитай: здесь. В принципе разницы нет, но при определенных условиях может быть выигрыш в размере кода.

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

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


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

Вроде бы как да...

Я пока усмиряю тягу узнать все и сразу про эти MSP, поэтому не проверял. Вы случайно/специально не проверяли сей момент (на счет >4кБ ассемблерного кода)?

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


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

Я пока усмиряю тягу узнать все и сразу про эти MSP, поэтому не проверял. Вы случайно/специально не проверяли сей момент (на счет >4кБ ассемблерного кода)?

Не проверял. Мои программы пока меньше 4 кБ...

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


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

Не могу найти/понять информацию про стек. Вершина ОЗУ находится по адресу 0x1AFF. Когда я записываю в SP адрес, то я должен, к примеру, указать адрес 0x1AFF или младший байт слова по четному адресу 0x1AFE? И если кому не трудно, то дайте ссылку, где это регламентируется.

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


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

А еще непонятны примочки ассемблера типа "NAME main" и "PUBLIC main", что-то Сишным духом больно пахнут. Это вообще обязательно? Без указания PUBLIC тело основного цикла main не будет "видно" остальному коду? И обязательно ли его (main) объявлять с помощью NAME?

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


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

Не могу найти/понять информацию про стек. Вершина ОЗУ находится по адресу 0x1AFF. Когда я записываю в SP адрес, то я должен, к примеру, указать адрес 0x1AFF или младший байт слова по четному адресу 0x1AFE? И если кому не трудно, то дайте ссылку, где это регламентируется.

Вершина стека (регистр SP) всегда должна иметь четный адрес. Если ты укажешь 0x1AFF - это будет не правильно, так как ты указываешь нечетный адрес. Если ты укажешь 0x1AFE, то это будет правильно, но слово (2 байта) по адресу 0x1AFE никогда стеком занято не будет. Алгоритм "работы" стека, например при вызове функции, такой:

1. Из вершины стека вычитается 2 (SP = SP - 2);

2. По адресу, указанному в вершине стека, записывается адрес возврата.

 

При выходе из стека происходит все наоборот:

1. По адресу, указанному в вершине стека, читается адрес возврата;

2. К вершине стека прибавляется 2 (SP = SP + 2).

 

Даже если ты помещаешь в стек один байт (PUSH.B R15), то все равно вершина стека изменяется на 2.

 

А еще непонятны примочки ассемблера типа "NAME main" и "PUBLIC main", что-то Сишным духом больно пахнут. Это вообще обязательно? Без указания PUBLIC тело основного цикла main не будет "видно" остальному коду? И обязательно ли его (main) объявлять с помощью NAME?

Первое. PUBLIC main означает то, что функция main является публичной, то есть должна быть видна в другом модуле. В моем проекте 2 ассемблерных файла. Первый главный. В нем сделан основной цикл программы. В этом цикле выполняются функции, которые реализованы во втором файле. Так вот во втором файле помимо реализации тела функции (например функция Copying), есть строка PUBLIC Copying. А в первом файле есть строка EXTERN Copying, которая означает, что функция Copying является внешней.

 

Второе. NAME main - это имя модуля. Никакого отношения к функции main NAME не имеет. После NAME можно написать что-то другое (дать другое имя модулю).

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


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

Первое. PUBLIC main означает то, что функция main является публичной, то есть должна быть видна в другом модуле. В моем проекте 2 ассемблерных файла. Первый главный. В нем сделан основной цикл программы. В этом цикле выполняются функции, которые реализованы во втором файле. Так вот во втором файле помимо реализации тела функции (например функция Copying), есть строка PUBLIC Copying. А в первом файле есть строка EXTERN Copying, которая означает, что функция Copying является внешней.

 

Второе. NAME main - это имя модуля. Никакого отношения к функции main NAME не имеет. После NAME можно написать что-то другое (дать другое имя модулю).

 

Про стек большое спасибо за пояснения! По поводу директив ассемблера, которых в IAR в избытке - у меня создается четкое ощущение, что мне навязывают некую "полезную" с точки зрения IAR модель программирования. Я, как неприемлющий языки высокого уровня в системах где память измеряется в кБ, не могу пока этого понять (на языке высокого уровня я пишу ПО верхнего уровня под Win, Я НЕ ПРОТИВНИК Си, а даже наоборот). "Видимость" блока памяти для меня вообще непонятная вещь. У меня есть набор команд (MSP), которые позволяют работать с любой ячейкой памяти 64кБ без исключения, что значит "видимость/невидимость"? Блин, помогите как-то уложить это в голове. Это конкретно IAR так нагибает разработчиков даже в ассемблерном коде использовать приблуды "видимости", "декларирования"?

 

Ну к примеру, у меня есть самый простой кусок кода, который выдает IAR в начале создания проекта. Я убираю оттуда директивы NAME, PUBLIC и прочую "чушь" (может и не чушь, я просто пока понять этого не могу). Между концом основного цикла main и директивой END (конец программы) добавляю инструкцию #include <file>, в file размещаю свои подпрограммы, которые хочу вызывать как из цикла main, так и из подпрограмм прерываний (таблицу векторов будем счиать добавленной в проект и подпрограммы тоже). Так вот без всяких приблуд типа PUBLIC, EXTERN я не смогу вызывать подпрограммы из цикла main и прерываний?

 

Да наступит просветление! Иначе дальше не получается двигаться.. Попробовал почитать в IAR "Help -> Assebler User Guide", но что-то как-то вобщем......(

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


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

Про стек большое спасибо за пояснения! По поводу директив ассемблера, которых в IAR в избытке - у меня создается четкое ощущение, что мне навязывают некую "полезную" с точки зрения IAR модель программирования. Я, как неприемлющий языки высокого уровня в системах где память измеряется в кБ, не могу пока этого понять (на языке высокого уровня я пишу ПО верхнего уровня под Win, Я НЕ ПРОТИВНИК Си, а даже наоборот). "Видимость" блока памяти для меня вообще непонятная вещь. У меня есть набор команд (MSP), которые позволяют работать с любой ячейкой памяти 64кБ без исключения, что значит "видимость/невидимость"? Блин, помогите как-то уложить это в голове. Это конкретно IAR так нагибает разработчиков даже в ассемблерном коде использовать приблуды "видимости", "декларирования"?

 

Ну к примеру, у меня есть самый простой кусок кода, который выдает IAR в начале создания проекта. Я убираю оттуда директивы NAME, PUBLIC и прочую "чушь" (может и не чушь, я просто пока понять этого не могу). Между концом основного цикла main и директивой END (конец программы) добавляю инструкцию #include <file>, в file размещаю свои подпрограммы, которые хочу вызывать как из цикла main, так и из подпрограмм прерываний (таблицу векторов будем счиать добавленной в проект и подпрограммы тоже). Так вот без всяких приблуд типа PUBLIC, EXTERN я не смогу вызывать подпрограммы из цикла main и прерываний?

 

Да наступит просветление! Иначе дальше не получается двигаться.. Попробовал почитать в IAR "Help -> Assebler User Guide", но что-то как-то вобщем......(

Сразу хочу дать совет: не пытайся понять все и сразу. Это просто невозможно. Все приходит постепенно.

Итак, "чушь". Если IAR вставляет какие-то директивы, значит они нужны. Если ты их убираешь и все работает, то значит конкретно сейчас они могут быть убраны, а в другой какой-то ситуации тебе просто необходимо будет их использовать. Согласись, по кой хрен разработчикам компилятора для ассемблера придумывать в нем что-то "ненужное".

 

По поводу "видимости\невидимости". Эти директивы придуманы для упрощения жизни программиста, а не для его "нагибания". Проект на ассемблере может быть очень большой и запутаться там можно только в путь. Ты говоришь, что создашь отдельные файлы со своими функциями, добавишь этот файл директивой include и будешь вызывать оттуда функции. А ты попробуй так сделать. Я попытался. Ничего не получилось. Проведи эксперимент и отпишись. С наступающим, кстати!

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...