пятница, 15 апреля 2016 г.

Знакомство с микроконтроллерами ARM Cortex M на примере LPC1114. Часть 2

В предыдущем посте я рассмотрел создание простой прошивки для микроконтроллера LPC1114 полностью на ассемблере. Такой подход, без сомнения, полезен для изучения архитетуры ARM Cortex M, но весьма непрактичен. Как правило такие программы создаются с помощью языка программирования C, а ассемблеру отводится место лишь в небольшом числе "ассемблерных вставок". Нередко обходятся вообще без ассемблера. В этом посте мы перепишем программу мигания светодиодом на C.

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

Итак, будем исполнять в контроллере такой простой код:

Для пауз используются циклы, а с помощью директивы препроцессора #define мы назначаем некоторым специальным адресам, связанным с периферией, более удобные имена.

Остаётся позаботится о том, чтобы кто-то вызвал нашу функцию main. Это сделает код начальной загрузки на ассемблере.

Всё очень просто: во время начальной загрузки управление передаётся инструкциям после метки Reset_handler. Там лежит одна единственная ассемблерная инструкция BL main, которая и вызовет сишную функция main.

Собираем:

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-as.exe -mcpu=cortex-m0 startup-lpc1114.s -o startup.o

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-gcc.exe -mcpu=cortex-m0 -mthumb blink-lpc1114.c -c -o blink.o

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-gcc -nostartfiles -Tblink-min.ld startup.o blink.o -o blink.elf

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-objcopy.exe -O binary blink.elf blink.bin

Бинарник blink.bin готов! Закидываем его в контроллер и наслажнаемся миганием светодиода. Такого же результата можно добиться и на чистом C. Для этого надо будет создать таблицу прервыаний прямо в C файле, и сказать компоновщику, что её надо разместить начиная с нулевого адреса. Вместо ассемблерного файла startup-lpc1114.s у нас теперь будет файл startup-lpc1114.c:

Собираем почти так же:

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-gcc.exe -mcpu=cortex-m0 startup-lpc1114.c -o startup.o

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-gcc.exe -mcpu=cortex-m0 -mthumb blink-lpc1114.c -c -o blink.o

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-gcc -nostartfiles -Tblink-min.ld startup.o blink.o -o blink.elf

PATH_TO_GNU_TOOLCHAIN\arm-none-eabi-objcopy.exe -O binary blink.elf blink.bin


Один из этих двух подходов можно использовать в реальных проектах. В следующиз постах я постараюсь рассказать о библиотеках, которые облегчают создание программ для микроконтроллеров ARM Cortex M.

Комментариев нет:

Отправить комментарий