цифровая электроника
вычислительная техника
встраиваемые системы

 

Микроконтроллеры семейства PIC32. Первый проект.

Автор: Mike(admin) от 29-08-2013, 12:37

Компания Microchip давно и широко известна отечественным радиолюбителям благодаря линейке дешевых 8-битных микроконтроллеров, которые успели найти себе применение в различных приложениях, вроде терморегуляторов, сенсорных устройств, приборов малой автоматизации и т.д. и т.п. Там российский разработчик не брал МК компании Atmel (прямой конкурент Microchip), он пользовался именно PIC’ами. Выбирать особо не приходилось. STM, NXP, TexasInstruments и уж тем более Renesas лет 10-15 назад были не так широко представлены на отечественном рынке по сравнению с сегодняшним днем. Да и PIC’и и AVR’ки были просты в освоении, в первую очередь благодаря немалому количеству русскоязычной документации. Но потом эти компании начали массово выпускать 32-разрядные микроконтроллеры (преимущественно с ядром ARMCortex) и заполнять ими мировые рынки. Чтобы не увидеть себя в хвосте этой гонки и не прослыть компанией, выпускающей «DIP’овых тараканов для самопайщиков», Microchip в 2007 году вывела на рынок свои 32-битные микроконтроллеры семейства PIC32.



И это были довольно мощные устройства, способные конкурировать с 32-разрядниками других фирм. Вот некоторые технические данные (все приводить не имеет смысла, в даташите это есть):


  • ядро MIPS32 M4K с 5-уровневым конвейером команд

  • тактовая частота 80 МГц, 1.65 DMIPS/МГц (в то время как Cortex-M3 предлагает 1.25 DMIPS/МГц)

  • до 512 КБ Flash-памяти

  • 5 16-битных таймеров, 2 пары можно объединять в 32-разрядные таймеры

  • приличный набор интерфейсов: USB, UART, I2C, SPI

  • АЦП 10-бит (стандарт практически для всех PIC’ов

и т.п.


В линейке PIC32MXпредставлено огромное количество устройств от PIC32MX1** до PIC32MX7** с разными ценниками (начиная от $1.5 и заканчивая $7), объемом памяти (от 16 КБ флеша и 4096 байт ОЗУ до 512 КБ флеша и 131 КБ ОЗУ), периферийными возможностями и корпусным исполнением. В общем, имеются модели практически для любого приложения.


Серьезно компания Microchipподошла и к среде разработки и программированию своих контроллеров, выпустив IDEMPLABX. Хотя предыдущие версии MPLAB были тоже довольно хороши и удобны, однако, помимо дружелюбного интерфейса и проектно-ориентированной концепции версия X обладает рядом «скрытых», но очень полезных возможностей. Подробнее посмотреть можно здесь.


Программируются микроконтроллеры с помощью программатора-отладчика PICKIT3, цена которого на российском рынке составляет примерно 3000 р. Также можно воспользоваться программаторами сторонних фирм, ровно как и сделать свой.


Отдельно стоит обговорить подключение микроконтроллера. Помимо обязательного соединения всех Vssи Vdd с питанием и землей соответственно, подключения кнопки сброса или хотя бы подведения питания через резистор 4.7 – 10 КОм к ножке MCLR, а также подключения при необходимости внешнего генератора или резонатора, нужно запитать ядро напряжением 1.8 В, что, наверно, выглядит странно для тех, кто переходит с 8-разрядных моделей, где использовалась своя простая RISC-архитектура ядра фирмы Microchip. Благодаря встроенному регулятору никаких внешних стабилизаторов на 1.8 В ставить не надо, достаточно лишь подключить электролит на 10 мкФ, как показано на рисунке ниже:


 Для создания проекта для PIC32 в первую очередь стоит скачать с сайта микрочипа и установить среду разработки MPLABXи C-компилятор для 32-разрядников XC32. Они бесплатны и просты в установке.


Чтобы создать новый проект в MPLABX жмем File->NewProject. Выбираем StandaloneProjectдля создания «чистого» проекта. Если нужно импортировать старый проект, написанный в MPLAB 8, то выбор падет на пункт ExistingMPLABIDEv8 Project. В следующем окне выбирает 32-разрядное семейство и модель (у меня в наличии PIC32MX675F512H).



В следующем окне отображаются средства программирования и отладки данного проекта. По идее, все необходимое там должно быть включено. В окне 6 SelectCompilerбудут показаны доступные компиляторы. Если XC32 установлен правильно, то он будет помечен зеленым кружком. Также можно подключить компилятор C32, поддерживаемый MPLAB8.



И в последнюю очередь необходимо будет дать имя проекту и выбрать для него каталог. Если проектов предполагается несколько, и текущий должен быть основным, то стоить поставить отметить SetasMainproject.


Проект создан. Стоит заметить, что в отличие от проектов MPLAB8 здесь довольно сложная структура файлов и папок. Если нужен hex-файл, то находиться он должен по адресу dist\default\production\


Для начала следует подключить библиотеки, которые могут потребоваться в ходе работы. Стоит в обязательном порядке подключить p32xxxx.h, здесь находятся уже определенные адреса всех регистров для PIC32. Также полезной будет библиотека периферийных компонентов plib.h, которая упростит работу с АЦП, UART, SPI и прочими полезными в эмбеддинге инструментами. Подключение этих библиотек производится с помощью директивы #include и выглядит это так:


#include <p32xxxx.h>
#include <plib.h>

Далее нужно настроить микроконтроллер на требуемый режим работы. Делается это с помощью директивы #pragma, предоставляющей компилятору определенные инструкции. В первую очередь позаботимся о тактировании. Ниже на рисунке показана схема модуля тактирования.


 



 В качестве источника тактовых сигналов этот МК может использовать 4 осциллятора: два внешних (первичный POSC и вторичный SOSC) и два внутренних (высокочастотная RC-цепочка FRC и малопотребляющая RC-цепочка LPRC). Если мы хотим выжать максимум из микроконтроллера (правда нужно помнить, что с увеличением тактовой частоты растет энергопотребление контроллера, и на самом деле в задаче типа «помигать светодиодиками» настраивать на максимум совершенно излишне), то следует к предварительно подключенному внешнему резонатору на 8 МГц приписать такой код:



#pragma config FNOSC=XTPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPLLODIV=DIV_1

Первая стока говорит о том, что мы подключаем резонатор и хотим воспользоваться фазовой автоподстройкой частоты (PLL). Вторая настраивает эту самую PLL:


  • FPLLIDIV=DIV_2 предделитель с коэффициентом 2 (меньше нельзя), то есть будет 8 МГц/2=4 МГц

  • FPLLMUL=MUL_20 умножитель с коэффициентом 20, 4 МГц*20=80 МГц

  • FPLLODIV=DIV_1 постделитель с коэффициентом 1, 80 МГц*1=80 МГц

Но для того, чтобы обеспечить максимальное быстродействие, нужно еще правильно настроить кэш предвыборки команд. Для этого используется макрос mCheConfigure такого формата:



mCheConfigure(CHE_CONF_WS2 | CHE_CONF_PF_ALL | CHE_CONF_COH_INVUNL | CHE_CONF_DC_NONE);

Этой строкой мы задаем минимальное значение тактов задержки при чтении из флеш-памяти (WS2 – 2 такта), предвыборку для всех регионов (кэшируемого и не кэшируемого, PF_ALL), механизм проверки корректности данных в кэше (COH_INVUNL) и не выделяем отдельно кэш для данных (DC_NONE).


Также макрос CheKseg0CacheOn() разрешает кэширование области памяти программ Kseg0. И последнее что нужно сделать, это убрать дополнительные такты задержки к статической оперативной памяти, записав mBMXDisableDRMWaitState().


Все, теперь можно приступать непосредственно к настройке ножек портов и их манипулированием. Здесь все также просто, как и на PIC’ах младших семейств. Я подключил к одному порту два светодиода, к другому четыре кнопки. Теперь в основной функции main запишем следующие строки:



TRISD=0x0000;
PORTD=0x0000;

TRISG=0x03C0;
PORTG=0x0000;

Что это значит? Это значит, что мы захотели воспользоваться портами D и G и настроили их вывода таким образом: для порта D – 0x0000, то есть все контакты работают на выход (для светодиодов), а для порта G – 0x03C0 = b’1111000000’, иначе говоря, контакты с 6 по 9-й настроены на вход (для кнопок) все остальные – на выход. Строчки PORTD=0x0000; и PORTG=0x0000; просто обнуляют соответствующие регистры, чтобы в начале работы с ними точно не было ничего лишнего.


Затем организуем бесконечный цикл «do { } while(1);» и в нем напишем код, заставляющий зажигаться и гаснуть два светодиода, подключенных к 6-й и 7-й ножкам порта D.


Теперь зажжем один светодиод:



if (PORTG & 0x40) PORTDSET=0x0040;

То есть, если будет нажата кнопка, подключенная к 6-му контакту порта G, светодиод на 6-м контакте порта Dзагорится. Регистр PORTDSET позволяет устанавливать определенные биты регистра PORTD, не трогая при этом остальные. Если бы мы написали PORTD=0x0040, то требуемый бит установился бы, но все остальные были бы сброшены в 0, а это не всегда хорошо.


По нажатию 7-й кнопки выключим светодиод:



if (PORTG & 0x80) PORTDCLR=0x0040;

Регистр PORTDCLR в отличие от PORTDSET очищает требуемые биты, но также не трогает остальные.


Теперь включим второй светодиод с помощью 8-йкнопки:



if (PORTG & 0x0100) PORTDSET=0x0080;

А по нажатию 9-й кнопки потушим все светодиоды:



if (PORTG & 0x0200) PORTD=0;

То есть, мы полностью очистили регистр порта D.


Вот полный код программы:



#include
#include

// настраиваем частоту
#pragma config FNOSC=XTPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPLLODIV=DIV_1
#pragma config FWDTEN=OFF // отключаем сторожевой таймер

//основная функция
main ()
{

unsigned char gtp=0;
char c = 0;
int i = 0;

//настройка кэша
mCheConfigure(CHE_CONF_WS2 | CHE_CONF_PF_ALL | CHE_CONF_COH_INVUNL | CHE_CONF_DC_NONE);

CheKseg0CacheOn();
mBMXDisableDRMWaitState();


//Настройка портов

TRISD=0x0000;
PORTD=0x0000;

TRISG=0x03C0;
PORTG=0x0000;

//------------------------------------------------
//бесконечный цикл
do
{

if (PORTG & 0x40) PORTDSET=0x0040; // зажигается один СД
if (PORTG & 0x80) PORTDCLR=0x0040; // гаснет один СД
if (PORTG & 0x0100) PORTDSET=0x0080; // зажигается второй СД
if (PORTG & 0x0200) PORTD=0; // гаснут все СД

}
while(1); // закрытие бесконечного цикла

} // закрытие функции main


Как теперь мы видим, создавать проект, настраивать микроконтроллер, мигать светодиодами по нажатию на кнопки оказалось достаточно просто. Но PIC32 таит в себе немало интересностей, и только зажигать с помощью него лампочки бессмысленно. Но, надеюсь, данный материал послужит хорошим толчком в деле изучения этого устройства.


 


©digitrode.ru


Теги: PIC32, MPLAB X



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

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

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