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

 

Микроконтроллеры семейства 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



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


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

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

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