Мигаем светодиодами на микроконтроллера TMS320F28027.

В данном уроке мы рассмотрим основы работы с микроконтроллером TMS320F28027 и как обычно помигаем светодиодами. 
Подключим четыре светодиода к ножкам GPIO0-GPIO3 (при этом помним, что напряжения питания нашего микроконтроллера 3,3В).

В данном микроконтроллере нет привычных нам портов А или B:

Как мы видим у нас есть только номер вывода, в связи с эти мы будем использовать только номера ножек: GPIOx.

Так же в данном микроконтроллере , прежде чем изменить/настроить ножки необходимо разрешить изменения в регистрах командой EALLOW. После окончания всех настроек мы запрещаем изменения в регистрах командой EDIS. 

Если мы посмотрим на внутреннюю структуру входов/выходов, то мы увидим, что каждую даже настроенную ножку надо подключить к порту:

Для этого используется  команда GpioCtrlRegs.GPAMUX.bit.CPIOx. Только после подключения ножки к порту, мы можем менять ее состояние командами GpioDataRegs.GPACLEAR.bit.GPIOx и GpioDataRegs.GPASET.bit.GPIOx.

Программный код:

#include "DSP28x_Project.h" // подключаем библиотеку
void InitLED(void); // инициализация ножек
void delay(unsigned long i); / / задержка

void main(void) {
InitSysCtrl();// инициализируе систему: PLL и WatchDog
InitPieCtrl();// функция которая выключает все прерывания и сбрасывает флаги прерываний
InitPieVectTable();//функция которая заполняет таблицу с векторами прерываний

IER = 0x0000;// выключаем прерывания
IFR = 0x0000; // очищаем флаги

InitLED();// настраиваем ножки

while(1) {
  GpioDataRegs.GPASET.bit.GPIO0 = 1;// включаем
  GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;//выключаем
  GpioDataRegs.GPASET.bit.GPIO2 = 1;
  GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
  delay(1000000);
  GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
  GpioDataRegs.GPASET.bit.GPIO1 = 1;
  GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
  GpioDataRegs.GPASET.bit.GPIO3 = 1;
  delay(1000000);
 }
}

void delay(unsigned long i){// пауза
while(--i){};
}

void InitLED(void){// инициализация
EALLOW; // разрешаем делать изменения в регистрах
//подключаем ножки к выходу.
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
//устанавливаем все ножки на выход
//GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;
EDIS; // запрещаем работать с регистрами
}

#include «DSP28x_Project.h» // Device Headerfile and Examples Include Files

#include «common/include/clk.h»
#include «common/include/flash.h»
#include «common/include/gpio.h»
#include «common/include/pie.h»
#include «common/include/pll.h»
#include «common/include/wdog.h»

void InitLED(void);
void delay(unsigned long i);

// Globals
//
CLK_Handle myClk;
FLASH_Handle myFlash;
GPIO_Handle myGpio;
PIE_Handle myPie;

void main(void) {

CPU_Handle myCpu;
PLL_Handle myPll;
WDOG_Handle myWDog;

myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));

// Perform basic system initialization
//
WDOG_disable(myWDog);
CLK_enableAdcClock(myClk);
(*Device_cal)();
CLK_disableAdcClock(myClk);

//
// Select the internal oscillator 1 as the clock source
//
CLK_setOscSrc(myClk, CLK_OscSrc_Internal);

//
// Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
//
PLL_setup(myPll, PLL_Multiplier_10, PLL_DivideSelect_ClkIn_by_2);

//
// Disable the PIE and all interrupts
//
PIE_disable(myPie);
PIE_disableAllInts(myPie);
CPU_disableGlobalInts(myCpu);
CPU_clearIntFlags(myCpu);

//
// If running from flash copy RAM only functions to RAM
//
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif

//
// Setup a debug vector table and enable the PIE
//
PIE_setDebugIntVectorTable(myPie);
PIE_enable(myPie);


IER = 0x0000;
IFR = 0x0000;
InitLED();
while(1) {
GpioDataRegs.GPASET.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO2 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
delay(1000000);
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
GpioDataRegs.GPASET.bit.GPIO3 = 1;
delay(1000000);
}
}

void delay(unsigned long i){
while(—i){};
}

void InitLED(void){
EALLOW;

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
//GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;
EDIS;
}