240 likes | 385 Views
Mikk Leini TTÜ Robotiklubi. CAN kursus StellarisWare. Texas Instruments StellarisWare. Texas Instruments (endine Luminary Micro) Stellaris-seeria mikrokontrollerite programeerimise liides (API) C-keeles IAR, GCC (CodeSourcery) ja Keil kompilaatoritele
E N D
Mikk Leini TTÜ Robotiklubi CAN kursusStellarisWare
Texas InstrumentsStellarisWare • Texas Instruments(endine Luminary Micro)Stellaris-seeria mikrokontrollerite programeerimise liides (API) • C-keeles IAR, GCC (CodeSourcery) ja Keil kompilaatoritele • Programmeerimise lihtsustamiseks ja kiirendamiseks
Sardsüsteemide (Embedded) programmeerimine • Assemblersbi 0x2000h 0x01 • C*(0x2000) |= 0x01; • C APISetBit(PORTA, PIN1)
Driver Library • System Control • Interrupt Controller • GPIO • ADC • System Tick Kogu MCU perifeeria kasutamise API. Asub: C:\StellarisWare\driverlib
StellarisWareSystem Control • CPU töörežiimide, pinge, töötakti ja perifeeria seadistamiseks // // 50 MHz takt PLL-ist // SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_8MHZ); // // Port A lubamine // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
StellarisWareInterrupt Controller • Katkestuste lubamine, keelamine ja prioriteedide seadistamine // // Port A väliste katkestuste lubamine // IntEnable(INT_GPIOA); // // Globaalne katkestuste lubamine // IntMasterEnable();
StellarisWareGPIO • IO siinide režiimi valik, seadistamine, kirjutamine ja lugemine. Katkestuste seadistamine. // // Port A viikude 0 ja 1 väljundiks määramine // GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // // Port A viigu 0 kõrgeks ja 1 madalaks määramine // GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_0);
StellarisWareGPIO // // Port A viigu 2 sisendiks määramine // voolu piiramine ja nõrga pull-up takisti lisamine // GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2); GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); // // Port A viigu 2 oleku lugemine // unsigned int x = GPIOPinRead(GPIO_PORTA_BASE, 0xFF) // // Oleku kontroll // if (x == GPIO_PIN_2) …
StellarisWareADC • 10 bit ADC. 4 programeeritavat järjestajat. Erinevad käivitusmehhanismid. Riistvaraline ümardus ja kiiruse seadistus. // // Järjestik-muunduri 0 seadistamine 3 kanali peale // ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); ADCSequenceStepConfigure(ADC0_BASE, 0, 0,ADC_CTL_CH2); ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH3); ADCSequenceEnable(ADC0_BASE, 0); // // Käivitamine // ADCProcessorTrigger(ADC0_BASE, 0);
StellarisWareADC // // ADC katkestus // void ADCIntHandler(void) { unsigned long ulValues[2]; // // ADC katkestuse lipukese kustutamine // ADCIntClear(ADC0_BASE, 0); // // Sämplite lugemine FIFO puhvrist // ADCSequenceDataGet(ADC0_BASE, 0, ulValues); }
StellarisWareSystem Tick • Cortex M3 CPU sisemine taimer. Operatsioonisüsteemi jaoks. Määratav periood CPU taktides. // // Taimeri seadistamine 1 ms perioodi peale, // katkestuste lubamine ja käivitamine // SysTickPeriodSet(SysCtlClockGet() / 1000); SysTickIntEnable(); SysTickEnable();
Seadistamine SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD; SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); GPIOPinTypeCAN(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1); CANInit(CAN0_BASE); CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 250000); CANEnable(CAN0_BASE);
Sõnumi objekt • 32 postkasti sõnumi objektidele TCANMsgObject { unsigned long ulMsgID;unsigned long ulMsgIDMask;unsigned long ulFlags;unsigned long ulMsgLen;unsigned char *pucMsgData; }
Saatmise seadistamine tCANMsgObject psTxMsg; unsigned char pucTxData[4]; psTxMsg.ulMsgID = 0x01; psTxMsg.ulFlags = MSG_OBJ_NO_FLAGS; psTxMsg.ulMsgLen = 4; psTxMsg.pucMsgData = pucTxData; CANMessageSet(CAN0_BASE, 1, &psTxMsg, MSG_OBJ_TYPE_TX);
Vastuvõtmise seadistamine tCANMsgObject psRxMsg; unsigned char pucRxData[4]; psRxMsg.ulMsgID = 0x01; psRxMsg.ulMsgIDMask = 0x7FE; psRxMsg.ulFlags = MSG_OBJ_NO_FLAGS; psRxMsg.ulMsgLen = 4; psRxMsg.pucMsgData = pucRxData; CANMessageSet(CAN0_BASE, 4, &psRxMsg, MSG_OBJ_TYPE_RX);
Vastuvõtmise registreerimine #define RX_BOX 4 #define RX_BOX_MASK(nr) (1 << (nr - 1)) if (CANStatusGet(CAN0_BASE, CAN_STS_NEWDAT) & RX_BOX_MASK(RX_BOX)) { CANMessageGet(CAN0_BASE, RX_BOX, &psRxMsg, true); // todo - pucRxData }
Kokkuvõte • „Saatmist“ ja „Vastu võtmist“ teostab MCU CAN kontroller. Kasutaja saab vaid kontrolleri tööd seadistada. • Extended ID kasutamiseks peab sõnumiulFlags MSG_OBJ_EXTENDED_ID lipp seatud olema