Пора создать первый проект... Запускаем IAR, смотрим на его желтенькую стартовую страницу, жмем Project->Create New Project. Выбор инструментов невелик, а язык берем конечно же asm. Ведь мы же знаем, что C++ это только для тех, кто хочет отстрелить себе ногу.
#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
Замечательно, но понятного пока мало... На старый добрый ARM32 не похоже совсем... Одна инструкция JMP чего стоит! Попахивает интелом. А уж от жутко шипящего 'vissible' хочется выпить пенного пива.
А еще странно, что адрес reset вектора не объявлен константой. Да ладно, и хуже видали. Архитектура далеко не самая коммерчески-раскрученная.
Пиво открыто, можно начинать препарировать...
Что бы сделать для начала? Проще всего моргнуть уже знакомым нам красным светодиодом. Изучение принципиальной схемы и шелкографии на печатной плате дают разведданые: светодиод красный имеет псевдоним LED1 и отзывается на порт P1.0
Примеров в интернете обнаружилась масса, но все они написаны на C. Неспортивно. Начинаем изучать вопрос...
Программируемые (ну, не те по которым подается питание) ноги страшного 20 лапого зверя могут одевать 2 маски: просто быть Digital I/O (что-то типа старого доброго General Purpose Input/Output) или какой-то peripheral module, специфичный для данной ноги. Данное мультиплексирование для порта P1 делается регистром P1SEL. Изучение уже знакомого pdf документа подсказывает, что по умолчанию нужная нам лапа уже и так в нужном режиме Digital I/O. Двигаемся дальше...
Теперь необходимо настроить нужную лапу на выход, и сказать ей что на выходе будет логическая единица... P1DIR и P1OUT должны мне помочь. Скоро сказка сказывается, да нескоро дело делается. Ассемблер то незнакомый. Курим pdf файл дальше, и в тумане его дыма вырисовывается команда BIS.B (BItSet.Byte). То, что доктор прописал!
BIS.B #1,&P1DIR ; P1.0 -> output
BIS.B #1,&P1OUT ; turn LED1 on
Вставляем эти 2 строчки перед endless loop (а зачем оно там надо?), собираем, нажав F7. Ну, тут я слукавил... Пришлось еще немного помучать старину гугла дабы понять что надо ставить & перед константой-адресом регистра... То, что надо ставить # перед числовой константой, я догадался сам. Собралось вроде успешно, так что жмем Download and Debug, а затем F5 (Go). Программа успешно запускается где-то в недрах системы, но ничего не происходит... Воттыжеблин!
Жму Stop Debugging и лезу в опции проекта. Ну да, конечно... Умная IAR (она же девочка!) ничего лучше не придумала, как отлаживаться во встроенном эмуляторе. Ну ничего страшного! Меняем Simulator на FET Debugger. А заодно и выбираем правильный тип микроконтроллера (MSP430G2553). Снова собираем проект, заливаем на микроконтроллер и запускаем. Красный глаз предательски светится в полумраке кабинета...
...To be continued