From: richardbarry Date: Sat, 1 Jan 2011 17:22:05 +0000 (+0000) Subject: Add MSP430X CCS4 demo project. X-Git-Tag: V6.1.1~54 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=cd86219d708e183872daeefb163e1e3846dfd09e;p=freertos Add MSP430X CCS4 demo project. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1203 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.ccsproject b/Demo/MSP430X_MSP430F5438_CCS4/.ccsproject new file mode 100644 index 000000000..ac776e6da --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/.ccsproject @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.cdtbuild b/Demo/MSP430X_MSP430F5438_CCS4/.cdtbuild new file mode 100644 index 000000000..7b70eb301 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/.cdtbuild @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.cdtproject b/Demo/MSP430X_MSP430F5438_CCS4/.cdtproject new file mode 100644 index 000000000..fa825035b --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/.cdtproject @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.project b/Demo/MSP430X_MSP430F5438_CCS4/.project new file mode 100644 index 000000000..5201cfb28 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/.project @@ -0,0 +1,20 @@ + + + RTOSDemo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + com.ti.ccstudio.managedbuild.core.ccsNature + + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 000000000..42f0f270b --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,6 @@ +#Sat Jan 01 13:05:50 GMT 2011 +com.ti.ccstudio.buildDefinitions.MSP430.Debug.1203657382/internalBuilder/enabled=false +com.ti.ccstudio.buildDefinitions.MSP430.Debug.1203657382/internalBuilder/ignoreErr=true +eclipse.preferences.version=1 +environment/project=\r\n\r\n +environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.1203657382=\r\n\r\n diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.ltk.core.refactoring.prefs b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.ltk.core.refactoring.prefs new file mode 100644 index 000000000..9a8bc90c8 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.ltk.core.refactoring.prefs @@ -0,0 +1,3 @@ +#Sat Jan 01 16:11:34 GMT 2011 +eclipse.preferences.version=1 +org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false diff --git a/Demo/MSP430X_MSP430F5438_CCS4/CreateProjectDirectoryStructure.bat b/Demo/MSP430X_MSP430F5438_CCS4/CreateProjectDirectoryStructure.bat new file mode 100644 index 000000000..8d0e30052 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/CreateProjectDirectoryStructure.bat @@ -0,0 +1,50 @@ +REM This file should be executed from the command line prior to the first +REM build. It will be necessary to refresh the Eclipse project once the +REM .bat file has been executed (normally just press F5 to refresh). + +REM Copies all the required files from their location within the standard +REM FreeRTOS directory structure to under the Eclipse project directory. +REM This permits the Eclipse project to be used in 'managed' mode and without +REM having to setup any linked resources. + +REM Have the files already been copied? +IF EXIST FreeRTOS_Source Goto END + + REM Create the required directory structure. + MD FreeRTOS_Source + MD FreeRTOS_Source\include + MD FreeRTOS_Source\portable\CCS4 + MD FreeRTOS_Source\portable\CCS4\MSP430X + MD FreeRTOS_Source\portable\MemMang + MD Demo_Source\Common_Demo_Files + MD Demo_Source\Common_Demo_Files\include + + REM Copy the core kernel files. + copy ..\..\Source\tasks.c FreeRTOS_Source + copy ..\..\Source\queue.c FreeRTOS_Source + copy ..\..\Source\list.c FreeRTOS_Source + + REM Copy the common header files + + copy ..\..\Source\include\*.* FreeRTOS_Source\include + + REM Copy the portable layer files + copy ..\..\Source\portable\GCC\ARM_CM3\*.* FreeRTOS_Source\portable\CCS4\MSP430X + + REM Copy the basic memory allocation files + copy ..\..\Source\portable\MemMang\heap_1.c FreeRTOS_Source\portable\MemMang + + REM Copy the files that define the common demo tasks. + copy ..\Common\minimal\dynamic.c Demo_Source\Common_Demo_Files + copy ..\Common\minimal\comtest.c Demo_Source\Common_Demo_Files + copy ..\Common\minimal\GenQTest.c Demo_Source\Common_Demo_Files + + REM Copy the common demo file headers. + copy ..\Common\include\dynamic.h Demo_Source\Common_Demo_Files\include + copy ..\Common\include\comtest.h Demo_Source\Common_Demo_Files\include + copy ..\Common\include\comtest2.h Demo_Source\Common_Demo_Files\include + copy ..\Common\include\GenQTest.h Demo_Source\Common_Demo_Files\include + copy ..\Common\include\serial.h Demo_Source\Common_Demo_Files\include + copy ..\Common\include\partest.h Demo_Source\Common_Demo_Files\include + +: END \ No newline at end of file diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.c new file mode 100644 index 000000000..0b67ec7e6 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.c @@ -0,0 +1,267 @@ +//******************************************************************************* +// Provides Functions to Initialize the UCS/FLL and clock sources +// File: hal_ucs.c +// +// Texas Instruments +// +// Version 1.2 +// 11/24/09 +// +// V1.0 Initial Version +// V1.1 Added timeout function +// V1.1 Added parameter for XTDrive +//******************************************************************************* + +#include "msp430.h" +#include "hal_UCS.h" + +//************************************************************************ +// Check and define required Defines +//************************************************************************ + +#ifndef XT1LFOFFG // Defines if not available in header file +#define XT1LFOFFG 0 +#endif +#ifndef XT1HFOFFG // Defines if not available in header file +#define XT1HFOFFG 0 +#endif +#ifndef XT2OFFG // Defines if not available in header file +#define XT2OFFG 0 +#endif +#ifndef XTS // Defines if not available in header file +#define XTS 0 +#endif +#ifndef XT2DRIVE_3 // Defines if not available in header file +#define XT2DRIVE_3 0 +#endif + +//==================================================================== +/** + * Startup routine for 32kHz Cristal on LFXT1 + * +*/ +void LFXT_Start(uint16_t xtdrive) +{ + UCSCTL6_L |= XT1DRIVE1_L+XT1DRIVE0_L; // Highest drive setting for XT1 startup + + while (SFRIFG1 & OFIFG) { // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) |(xtdrive); // set Drive mode +} + +//==================================================================== +/** + * Startup routine for 32kHz Cristal on LFXT1 with timeout counter + * +*/ +uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout) +{ + UCSCTL6_L |= XT1DRIVE1_L+XT1DRIVE0_L; // Highest drive setting for XT1 startup + + while ((SFRIFG1 & OFIFG) && timeout--){ // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) |(xtdrive); // set Drive mode + if (timeout) + return (UCS_STATUS_OK); + else + return (UCS_STATUS_ERROR); +} + + +//==================================================================== +/** + * Startup routine for XT1 + * +*/ +void XT1_Start(uint16_t xtdrive) +{ + UCSCTL6 &= ~(XT1OFF | XT1DRIVE_3); // enable XT1 + UCSCTL6 |= (XTS | xtdrive); // enable XT1 and set XT1Drive + + while (SFRIFG1 & OFIFG) { // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } +} + +//==================================================================== +/** + * Startup routine for XT1 with timeout counter + * +*/ +uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout) +{ + UCSCTL6 &= ~(XT1OFF | XT1DRIVE_3); // enable XT1 + UCSCTL6 |= (XTS | xtdrive); // enable XT1 and set XT1Drive + + while ((SFRIFG1 & OFIFG) && timeout--) { // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + if (timeout) + return (UCS_STATUS_OK); + else + return (UCS_STATUS_ERROR); +} + +//==================================================================== +/** + * Use XT1 in Bypasss mode + * +*/ +void XT1_Bypass(void) +{ + UCSCTL6 |= XT1BYPASS; + + while (SFRIFG1 & OFIFG) { // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } +} + +//==================================================================== +/** + * Startup routine for XT2 + * +*/ +void XT2_Start(uint16_t xtdrive) +{ + UCSCTL6 &= ~(XT2OFF | XT2DRIVE_3); // enable XT2 + UCSCTL6 |= (xtdrive); // Set XT2Drive + + while (SFRIFG1 & OFIFG) { // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + +} + +//==================================================================== +/** + * Startup routine for XT2 with timeout counter + * +*/ +uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout) +{ + UCSCTL6 &= ~XT2OFF; // Set XT2 On + UCSCTL6 &= ~XT2DRIVE_3; // enable XT2 + UCSCTL6 |= (xtdrive); // Set XT2Drive + + while ((SFRIFG1 & OFIFG) && timeout--){ // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + if (timeout) + return (UCS_STATUS_OK); + else + return (UCS_STATUS_ERROR); +} + +//==================================================================== +/** + * Use XT2 in Bypasss mode + * +*/ +void XT2_Bypass(void) +{ +#ifdef XT2BYPASS // on devices without XT2 this function will be empty + UCSCTL6 |= XT2BYPASS; + + while (SFRIFG1 & OFIFG) { // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } +#endif +} + +//==================================================================== +/** + * Initializes FLL of the UCS and wait till settled + * + * \param fsystem required system frequency (MCLK) in kHz + * \param ratio ratio between MCLK and FLLREFCLK + */ +void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio) +{ + volatile uint16_t x = ratio * 32; + // save actual state of FLL loop control + uint16_t globalInterruptState = __get_SR_register() & SCG0; + + __bic_SR_register(SCG0); // Enable FLL loop control + + Init_FLL(fsystem, ratio); + + while(x--) + { + __delay_cycles(30); + } + + __bis_SR_register(globalInterruptState); // restore previous state + +} + +//==================================================================== +/** + * Initializes FLL of the UCS + * + * \param fsystem required system frequency (MCLK) in kHz + * \param ratio ratio between fsystem and FLLREFCLK + */ +static void Init_FLL(uint16_t fsystem, uint16_t ratio) +{ + uint16_t d, dco_div_bits; + uint16_t mode = 0; + + d = ratio; + dco_div_bits = FLLD__2; // Have at least a divider of 2 + if (fsystem > 16000){ + d >>= 1 ; + mode = 1; + } + else + fsystem <<= 1; // fsystem = fsystem * 2 + + while (d > 512) + { + dco_div_bits = dco_div_bits + FLLD0; // set next higher div level + d >>= 1; + } + + UCSCTL0 = 0x000; // Set DCO to lowest Tap + + UCSCTL2 &= ~(0x3FF); // Reset FN bits + UCSCTL2 = dco_div_bits | (d - 1); + + if (fsystem <= 630) // fsystem < 0.63MHz + UCSCTL1= DCORSEL_0 ; + else if (fsystem < 1250) // 0.63MHz < fsystem < 1.25MHz + UCSCTL1= DCORSEL_1 ; + else if (fsystem < 2500) // 1.25MHz < fsystem < 2.5MHz + UCSCTL1= DCORSEL_2 ; + else if (fsystem < 5000) // 2.5MHz < fsystem < 5MHz + UCSCTL1= DCORSEL_3 ; + else if (fsystem < 10000) // 5MHz < fsystem < 10MHz + UCSCTL1= DCORSEL_4 ; + else if (fsystem < 20000) // 10MHz < fsystem < 20MHz + UCSCTL1= DCORSEL_5 ; + else if (fsystem < 40000) // 20MHz < fsystem < 40MHz + UCSCTL1= DCORSEL_6 ; + else + UCSCTL1= DCORSEL_7 ; + + while (SFRIFG1 & OFIFG) { // check OFIFG fault flag + UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags + SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag + } + + if (mode == 1) // fsystem > 16000 + SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK); // select DCOCLK + else + SELECT_MCLK_SMCLK(SELM__DCOCLKDIV + SELS__DCOCLKDIV); // selcet DCODIVCLK + + +} // End of fll_init() diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.h new file mode 100644 index 000000000..d78aa5df6 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.h @@ -0,0 +1,143 @@ +//******************************************************************************* +// Provides Functions to Initialize the UCS/FLL and clock sources +// File: hal_ucs.c +// +// Texas Instruments +// +// Version 1.2 +// 11/24/09 +// +// V1.0 Initial Version +// V1.1 Added timeout function +// V1.1 Added parameter for XTDrive +//******************************************************************************* + + +#ifndef __hal_UCS +#define __hal_UCS + +#include +#include "hal_macros.h" + +/************************************************************************* +* MACROS +**************************************************************************/ + +/* Select source for FLLREF e.g. SELECT_FLLREF(SELREF__XT1CLK) */ +#define SELECT_FLLREF(source) st(UCSCTL3 = (UCSCTL3 & ~(SELREF_7)) | (source);) +/* Select source for ACLK e.g. SELECT_ACLK(SELA__XT1CLK) */ +#define SELECT_ACLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELA_7)) | (source);) +/* Select source for MCLK e.g. SELECT_MCLK(SELM__XT2CLK) */ +#define SELECT_MCLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELM_7)) | (source);) +/* Select source for SMCLK e.g. SELECT_SMCLK(SELS__XT2CLK) */ +#define SELECT_SMCLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELS_7)) | (source);) +/* Select source for MCLK and SMCLK e.g. SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK) */ +#define SELECT_MCLK_SMCLK(sources) st(UCSCTL4 = (UCSCTL4 & ~(SELM_7 + SELS_7)) | (sources);) + +/* set ACLK/x */ +#define ACLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVA_7)) | (DIVA__##x);) +/* set MCLK/x */ +#define MCLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVM_7)) | (DIVM__##x);) +/* set SMCLK/x */ +#define SMCLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVS_7)) | (DIVS__##x);) +/* Select divider for FLLREF e.g. SELECT_FLLREFDIV(2) */ +#define SELECT_FLLREFDIV(x) st(UCSCTL3 = (UCSCTL3 & ~(FLLREFDIV_7))|(FLLREFDIV__##x);) + +//************************************************************************ +// Defines +//************************************************************************ + +#define UCS_STATUS_OK 0 +#define UCS_STATUS_ERROR 1 + +//==================================================================== +/** + * Startup routine for 32kHz Cristal on LFXT1 + * + * \param xtdrive: Bits defining the LFXT drive mode after startup + * +*/ +extern void LFXT_Start(uint16_t xtdrive); + +//==================================================================== +/** + * Startup routine for 32kHz Cristal on LFXT1 with timeout counter + * + * \param xtdrive: Bits defining the LFXT drive mode after startup + * \param timeout: value for the timeout counter + * +*/ +extern uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout); + +//==================================================================== +/** + * Startup routine for XT1 + * + * \param xtdrive: Bits defining the XT drive mode + * +*/ +extern void XT1_Start(uint16_t xtdrive); + +//==================================================================== +/** + * Startup routine for XT1 with timeout counter + * + * \param xtdrive: Bits defining the XT drive mode + * \param timeout: value for the timeout counter + * +*/ +extern uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout); + +//==================================================================== +/** + * Use XT1 in Bypasss mode + * +*/ +extern void XT1_Bypass(void); + +//==================================================================== +/** + * Startup routine for XT2 + * + * \param xtdrive: Bits defining the XT drive mode + * +*/ +extern void XT2_Start(uint16_t xtdrive); + +//==================================================================== +/** + * Startup routine for XT2 with timeout counter + * + * \param xtdrive: Bits defining the XT drive mode + * \param timeout: value for the timeout counter + * +*/ +extern uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout); + +//==================================================================== +/** + * Use XT2 in Bypasss mode for MCLK + * +*/ +extern void XT2_Bypass(void); + +//==================================================================== +/** + * Initializes FLL of the UCS and wait till settled + * + * \param fsystem required system frequency (MCLK) in kHz + * \param ratio ratio between fsystem and FLLREFCLK + */ +extern void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio); + + +//==================================================================== +/** + * Initializes FLL of the UCS + * + * \param fsystem required system frequency (MCLK) in kHz + * \param ratio ratio between fsystem and FLLREFCLK + */ +static void Init_FLL(uint16_t fsystem, uint16_t ratio); + +#endif /* __hal_UCS */ diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_macros.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_macros.h new file mode 100644 index 000000000..4eec43a1d --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_macros.h @@ -0,0 +1,4 @@ +/* + * This macro is for use by other macros to form a fully valid C statement. + */ +#define st(x) do { x } while (__LINE__ == -1) diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/FreeRTOSConfig.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/FreeRTOSConfig.h new file mode 100644 index 000000000..b66c9b28a --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/FreeRTOSConfig.h @@ -0,0 +1,123 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + ***NOTE*** The exception to the GPL is included to allow you to distribute + a combined work that includes FreeRTOS without being obliged to provide the + source code for proprietary components outside of the FreeRTOS kernel. + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( 16000000UL ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 9 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 10 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 5 +#define configGENERATE_RUN_TIME_STATS 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 0 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_APPLICATION_TASK_TAG 0 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +/* The MSP430X port uses a callback function to configure its tick interrupt. +This allows the application to choose the tick interrupt source. +configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct +interrupt vector for the chosen tick interrupt source. This implementation of +vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this +case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */ +#define configTICK_INTERRUPT_VECTOR TIMER0_A0_VECTOR + +/* Prevent the following definitions being included when FreeRTOSConfig.h +is included from an asm file. */ +#ifdef __ICC430__ + extern void vConfigureTimerForRunTimeStats( void ); + extern inline unsigned long ulGetRunTimeStatsTime( void ); + extern volatile unsigned long ulStatsOverflowCount; +#endif /* __ICCARM__ */ + +//#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats() +//#define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeStatsTime() + +#endif /* FREERTOS_CONFIG_H */ + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h new file mode 100644 index 000000000..c1baa94ff --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h @@ -0,0 +1,27 @@ +/******************************************************************************* + Filename: hal_MSP-EXP430F5438.h + + Copyright 2010 Texas Instruments, Inc. + +This is the master header file and also the only necessary file to be included +in order to use MSP-EXP430F5438 HAL. +***************************************************************************/ +#ifndef HAL_MSP_EXP430F5438_H +#define HAL_MSP_EXP430F5438_H + +#include "msp430.h" + +//#include "hal_PMM.h" +#include "hal_UCS.h" + +#include "hal_lcd.h" +#include "hal_buttons.h" +//#include "hal_adc.h" +#include "hal_board.h" +//#include "hal_usb.h" +#include "hal_buttons.h" +//#include "hal_rf.h" +//#include "hal_rtc.h" +//#include "hal_tlv.h" + +#endif /* HAL_MSP_EXP430F5438_H */ diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.c new file mode 100644 index 000000000..f44d7409a --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.c @@ -0,0 +1,68 @@ +/** + * @file hal_board.c + * + * Copyright 2010 Texas Instruments, Inc. +******************************************************************************/ +#include "msp430.h" +#include "hal_MSP-EXP430F5438.h" + +/**********************************************************************//** + * @brief Initializes ACLK, MCLK, SMCLK outputs on P11.0, P11.1, + * and P11.2, respectively. + * + * @param none + * + * @return none + *************************************************************************/ +void halBoardOutputSystemClock(void) //outputs clock to testpoints +{ + CLK_PORT_DIR |= 0x07; + CLK_PORT_SEL |= 0x07; +} + +/**********************************************************************//** + * @brief Stops the output of ACLK, MCLK, SMCLK on P11.0, P11.1, and P11.2. + * + * @param none + * + * @return none + *************************************************************************/ +void halBoardStopOutputSystemClock(void) +{ + CLK_PORT_OUT &= ~0x07; + CLK_PORT_DIR |= 0x07; + CLK_PORT_SEL &= ~0x07; +} + +/**********************************************************************//** + * @brief Initializes all GPIO configurations. + * + * @param none + * + * @return none + *************************************************************************/ +void halBoardInit(void) +{ + //Tie unused ports + PAOUT = 0; + PADIR = 0xFFFF; + PASEL = 0; + PBOUT = 0; + PBDIR = 0xFFFF; + PBSEL = 0; + PCOUT = 0; + PCDIR = 0xFFFF; + PCSEL = 0; + PDOUT = 0; + PDDIR = 0xFFFF; + PDSEL = 0x0003; + PEOUT = 0; + PEDIR = 0xFEFF; // P10.0 to USB RST pin, + // ...if enabled with J5 + PESEL = 0; + P11OUT = 0; + P11DIR = 0xFF; + PJOUT = 0; + PJDIR = 0xFF; + P11SEL = 0; +} diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.h new file mode 100644 index 000000000..603c72836 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.h @@ -0,0 +1,31 @@ +/**********************************************************************//** + Filename: hal_board.h + + Copyright 2010 Texas Instruments, Inc. +***************************************************************************/ +#ifndef HAL_BOARD_H +#define HAL_BOARD_H + +#define LED_PORT_DIR P1DIR +#define LED_PORT_OUT P1OUT +#define LED_1 BIT0 +#define LED_2 BIT1 + +#define CLK_PORT_DIR P11DIR //outputs clocks to testpoints +#define CLK_PORT_OUT P11OUT +#define CLK_PORT_SEL P11SEL + +/*---------------------------------------------------------------- + * Function Prototypes + *---------------------------------------------------------------- + */ +static void halBoardGetSystemClockSettings(unsigned char systemClockSpeed, + unsigned char *setDcoRange, + unsigned char *setVCore, + unsigned int *setMultiplier); + +extern void halBoardOutputSystemClock(void); +extern void halBoardStopOutputSystemClock(void); +extern void halBoardInit(void); + +#endif /* HAL_BOARD_H */ diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.c new file mode 100644 index 000000000..42c8f0ec5 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.c @@ -0,0 +1,76 @@ +/** + * @file hal_buttons.c + * + * Copyright 2010 Texas Instruments, Inc. +***************************************************************************/ +#include "msp430.h" +#include "hal_MSP-EXP430F5438.h" + +/**********************************************************************//** + * @brief Initializes the GPIO ports to act as buttons. + * + * @param buttonsMask The mask that specifies the button pins. + * + * @return none + *************************************************************************/ +void halButtonsInit(unsigned char buttonsMask) +{ + BUTTON_PORT_OUT |= buttonsMask; + BUTTON_PORT_DIR &= ~buttonsMask; + BUTTON_PORT_REN |= buttonsMask; + BUTTON_PORT_SEL &= ~buttonsMask; +} + +/**********************************************************************//** + * @brief Returns LOW for the buttons pressed. + * + * @param none + * + * @return The buttons that have been pressed, identified by a bit = 0. + *************************************************************************/ +unsigned char halButtonsPressed(void) +{ + unsigned char value; + value = BUTTON_PORT_IN; + return (0xFF - value); //Low==ButtonPressed +} + +/**********************************************************************//** + * @brief Enables button interrupt(s) with low to high transitions. + * + * @param buttonIntEnableMask The button pin(s) for which the interrupt(s) + * should be enabled. + * + * @return none + *************************************************************************/ +void halButtonsInterruptEnable(unsigned char buttonIntEnableMask) +{ + BUTTON_PORT_IES &= ~buttonIntEnableMask; + BUTTON_PORT_IFG &= ~buttonIntEnableMask; + BUTTON_PORT_IE |= buttonIntEnableMask; +} + +/**********************************************************************//** + * @brief Disables button interrupts + * + * @param buttonIntEnableMask The button pin(s) for which the interrupt(s) + * should be disabled. + * + * @return none + *************************************************************************/ +void halButtonsInterruptDisable(unsigned char buttonIntEnableMask) +{ + BUTTON_PORT_IE &= ~buttonIntEnableMask; +} + +/**********************************************************************//** + * @brief Clears the button GPIO settings, disables the buttons. + * + * @param none + *************************************************************************/ +void halButtonsShutDown() +{ + //All output, outputting 0s + BUTTON_PORT_OUT &= ~(BUTTON_ALL); + BUTTON_PORT_DIR |= BUTTON_ALL; +} diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.h new file mode 100644 index 000000000..ffe691ae9 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.h @@ -0,0 +1,38 @@ +/******************************************************************************* + Filename: hal_buttons.h + + Copyright 2010 Texas Instruments, Inc. +***************************************************************************/ +#ifndef HAL_BUTTONS_H +#define HAL_BUTTONS_H + +#define BUTTON_PORT_DIR P2DIR +#define BUTTON_PORT_SEL P2SEL +#define BUTTON_PORT_OUT P2OUT +#define BUTTON_PORT_REN P2REN +#define BUTTON_PORT_IE P2IE +#define BUTTON_PORT_IES P2IES +#define BUTTON_PORT_IFG P2IFG +#define BUTTON_PORT_IN P2IN + +#define BUTTON_SELECT BIT3 +#define BUTTON_DOWN BIT5 +#define BUTTON_UP BIT4 +#define BUTTON_RIGHT BIT2 +#define BUTTON_LEFT BIT1 +#define BUTTON_S1 BIT6 +#define BUTTON_S2 BIT7 +#define BUTTON_ALL 0xFE + +extern volatile unsigned char buttonsPressed; + +/*------------------------------------------------------------- + * Function Prototypes + * ------------------------------------------------------------*/ +extern void halButtonsInit(unsigned char buttonsMask); +extern unsigned char halButtonsPressed(void); +extern void halButtonsInterruptEnable(unsigned char buttonIntEnableMask); +extern void halButtonsInterruptDisable(unsigned char buttonIntEnableMask); +extern void halButtonsShutDown(); + +#endif /* HAL_BUTTONS_H */ diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.c new file mode 100644 index 000000000..f589c23dd --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.c @@ -0,0 +1,1122 @@ +/** + * @file hal_lcd.c + * + * Copyright 2010 Texas Instruments, Inc. +***************************************************************************/ + +#include "msp430.h" +#include "hal_MSP-EXP430F5438.h" +#include "hal_lcd_fonts.h" + +unsigned char LcdInitMacro[]={ + 0x74,0x00,0x00,0x76,0x00,0x01, // R00 start oscillation + 0x74,0x00,0x01,0x76,0x00,0x0D, // R01 driver output control + 0x74,0x00,0x02,0x76,0x00,0x4C, // R02 LCD - driving waveform control + 0x74,0x00,0x03,0x76,0x12,0x14, // R03 Power control + 0x74,0x00,0x04,0x76,0x04,0x66, // R04 Contrast control + 0x74,0x00,0x05,0x76,0x00,0x10, // R05 Entry mode + 0x74,0x00,0x06,0x76,0x00,0x00, // R06 RAM data write mask + 0x74,0x00,0x07,0x76,0x00,0x15, // R07 Display control + 0x74,0x00,0x08,0x76,0x00,0x03, // R08 Cursor Control + 0x74,0x00,0x09,0x76,0x00,0x00, // R09 RAM data write mask + 0x74,0x00,0x0A,0x76,0x00,0x15, // R0A + 0x74,0x00,0x0B,0x76,0x00,0x03, // R0B Horizontal Cursor Position + 0x74,0x00,0x0C,0x76,0x00,0x03, // R0C Vertical Cursor Position + 0x74,0x00,0x0D,0x76,0x00,0x00, // R0D + 0x74,0x00,0x0E,0x76,0x00,0x15, // R0E + 0x74,0x00,0x0F,0x76,0x00,0x03, // R0F + 0x74,0x00,0x10,0x76,0x00,0x15, // R0E + 0x74,0x00,0x11,0x76,0x00,0x03, // R0F +}; + +unsigned char Read_Block_Address_Macro[]= {0x74,0x00,0x12,0x77,0x00,0x00}; +unsigned char Draw_Block_Value_Macro[]={0x74,0x00,0x12,0x76,0xFF,0xFF}; +unsigned char Draw_Block_Address_Macro[]={0x74,0x00,0x11,0x76,0x00,0x00}; + +unsigned int LcdAddress = 0, LcdTableAddress = 0; +unsigned char contrast = 0x66; +unsigned char backlight = 8; +int LCD_MEM[110*17]; //This array stores a copy of all data on the LCD + //screen. If memory is an issue though, this array + //can be eliminated and the halLcdReadBlock() + //command can be used instead whenever you are + //manipulating the currently displayed data. + +/**********************************************************************//** + * @brief Sends 3+3 bytes of data to the LCD using the format specified + * by the LCD Guide. + * + * @param Data[] Data array for transmission + * + * @return none + *************************************************************************/ +void halLcdSendCommand(unsigned char Data[]) +{ + unsigned char i; + + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + for ( i = 0; i < 6; i++ ) + { + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = Data[i]; // Load data + + if (i == 2) //Pull CS up after 3 bytes + { + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + } + } + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer +} + +/**********************************************************************//** + * @brief Initializes the USCI module, LCD device for communication. + * + * - Sets up the SPI2C Communication Module + * - Performs Hitachi LCD Initialization Procedure + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdInit(void) +{ + volatile unsigned int i=0; + + LCD_CS_RST_OUT |= LCD_CS_PIN | LCD_RESET_PIN ; + LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ; + + LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN; + + LCD_CS_RST_OUT &= ~LCD_RESET_PIN; // Reset LCD + __delay_cycles(0x47FF); //Reset Pulse + LCD_CS_RST_OUT |= LCD_RESET_PIN; + + // UCLK,MOSI setup, SOMI cleared + LCD_SPI_SEL |= LCD_MOSI_PIN + LCD_CLK_PIN; + LCD_SPI_SEL &= ~LCD_MISO_PIN; + LCD_SPI_DIR &= ~(LCD_MISO_PIN + LCD_MOSI_PIN); // Pin direction controlled by module, + // Set both pins to input as default + + // Initialize the USCI_B2 module for SPI operation + UCB2CTL1 = UCSWRST; // Hold USCI in SW reset mode while configuring it + UCB2CTL0 = UCMST+UCSYNC+UCCKPL+UCMSB; // 3-pin, 8-bit SPI master + UCB2CTL1 |= UCSSEL_2; // SMCLK + UCB2BR0 = 4; // Note: Do not exceed D/S spec for UCLK! + UCB2BR1 = 0; + UCB2CTL1 &= ~UCSWRST; // Release USCI state machine + UCB2IFG &= ~UCRXIFG; + + // Wake-up the LCD as per datasheet specifications + halLcdActive(); + + // LCD Initialization Routine Using Predefined Macros + halLcdSendCommand(&LcdInitMacro[ 1 * 6 ]); + halLcdSendCommand(&LcdInitMacro[ 2 * 6 ]); + halLcdSendCommand(&LcdInitMacro[ 4 * 6 ]); + halLcdSendCommand(&LcdInitMacro[ 5 * 6 ]); + halLcdSendCommand(&LcdInitMacro[ 6 * 6 ]); + halLcdSendCommand(&LcdInitMacro[ 7 * 6 ]); + +} + +/**********************************************************************//** + * @brief Shuts down the LCD display and hdisables the USCI communication. + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdShutDown(void) +{ + halLcdStandby(); + + LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ; + LCD_CS_RST_OUT &= ~(LCD_CS_PIN | LCD_RESET_PIN ); + LCD_CS_RST_OUT &= ~LCD_RESET_PIN; + + LCD_SPI_SEL &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN); + LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN; + LCD_CS_RST_OUT &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN); + + UCB2CTL0 = UCSWRST; +} + +/**********************************************************************//** + * @brief Initializes the LCD backlight PWM signal. + * + * @param none + * + * @return none + * + *************************************************************************/ +void halLcdBackLightInit(void) +{ + LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN; + LCD_BACKLT_OUT |= LCD_BACKLIGHT_PIN; + LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN; + + TA0CCTL3 = OUTMOD_7; + TA0CCR3 = TA0CCR0 >> 1 ; + backlight = 8; + + TA0CCR0 = 400; + TA0CTL = TASSEL_2+MC_1; +} + +/**********************************************************************//** + * @brief Get function for the backlight PWM's duty cycle. + * + * @param none + * + * @return backlight One of the the 17 possible settings - valued 0 to 16. + * + *************************************************************************/ +unsigned int halLcdGetBackLight(void) +{ + return backlight; +} + +/**********************************************************************//** + * @brief Set function for the backlight PWM's duty cycle + * + * @param BackLightLevel The target backlight duty cycle - valued 0 to 16. + * + * @return none + *************************************************************************/ +void halLcdSetBackLight(unsigned char BackLightLevel) +{ + unsigned int dutyCycle = 0, i, dummy; + + if (BackLightLevel > 0) + { + TA0CCTL3 = OUTMOD_7; + dummy = (TA0CCR0 >> 4); + + for (i = 0; i < BackLightLevel; i++) + dutyCycle += dummy; + + TA0CCR3 = dutyCycle; + + // If the backlight was previously turned off, turn it on. + if (!backlight) + TA0CTL |= MC0; + } + else + { + TA0CCTL3 = 0; + TA0CTL &= ~MC0; + } + backlight = BackLightLevel; +} + +/**********************************************************************//** + * @brief Turns off the backlight. + * + * Clears the respective GPIO and timer settings. + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdShutDownBackLight(void) +{ + LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN; + LCD_BACKLT_OUT &= ~(LCD_BACKLIGHT_PIN); + LCD_BACKLT_SEL &= ~LCD_BACKLIGHT_PIN; + + TA0CCTL3 = 0; + TA0CTL = 0; + + backlight = 0; +} + +/**********************************************************************//** + * @brief Set function for the contrast level of the LCD. + * + * @param ContrastLevel The target contrast level + * + * @return none + *************************************************************************/ +void halLcdSetContrast(unsigned char ContrastLevel) +{ + if (ContrastLevel > 127) ContrastLevel = 127; + if (ContrastLevel < 70) ContrastLevel = 70; + LcdInitMacro[ 0x04 * 6 + 5 ] = ContrastLevel; + halLcdSendCommand(&LcdInitMacro[ 0x04 * 6 ]); +} + +/**********************************************************************//** + * @brief Get function for the contrast level of the LCD. + * + * @param none + * + * @return ContrastLevel The LCD constrast level + *************************************************************************/ +unsigned char halLcdGetContrast(void) +{ + return LcdInitMacro[ 0x04 * 6 + 5 ] ; +} + +/**********************************************************************//** + * @brief Turns the LCD cursor on at the current text position. + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdCursor(void) +{ + LcdInitMacro[ 8 * 6 + 5 ] ^= BIT2; + halLcdSendCommand(&LcdInitMacro[ 8 * 6 ]); + + LcdInitMacro[ 0x0B * 6 + 5 ] = ((LcdAddress & 0x1F) << 3) ; + LcdInitMacro[ 0x0B * 6 + 4 ] = ( (LcdAddress & 0x1F) << 3 ) + 3; + LcdInitMacro[ 0x0C * 6 + 5 ] = (LcdAddress >> 5); + LcdInitMacro[ 0x0C * 6 + 4 ] = (LcdAddress >> 5) + 7; + halLcdSendCommand(&LcdInitMacro[ 0x0B * 6 ]); + halLcdSendCommand(&LcdInitMacro[ 0x0C * 6 ]); + + halLcdSetAddress(LcdAddress); +} + +/**********************************************************************//** + * @brief Turns off the LCD cursor. + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdCursorOff(void) +{ + LcdInitMacro[ 8 * 6 + 5 ] &= ~BIT2; + halLcdSendCommand(&LcdInitMacro[ 8 * 6 ]); +} + +/**********************************************************************//** + * @brief Inverts the grayscale values of the LCD display (Black <> white). + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdReverse(void) +{ + LcdInitMacro[ 7 * 6 + 5 ] ^= BIT1; + halLcdSendCommand(&LcdInitMacro[ 7 * 6 ]); +} + +/**********************************************************************//** + * @brief Sets the LCD in standby mode to reduce power consumption. + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdStandby(void) +{ + LcdInitMacro[ 3 * 6 + 5 ] &= (~BIT3) & (~BIT2); + LcdInitMacro[ 3 * 6 + 5 ] |= BIT0; + halLcdSendCommand(&LcdInitMacro[ 3 * 6 ]); +} + +/**********************************************************************//** + * @brief Puts the LCD into active mode. + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdActive(void) +{ + halLcdSendCommand(LcdInitMacro); // R00 start oscillation + + // Wait a minimum of 25ms after issuing "start oscillation" + // command (to accomodate for MCLK up to 25MHz) + __delay_cycles(250000); + + LcdInitMacro[ 3 * 6 + 5 ] |= BIT3; + LcdInitMacro[ 3 * 6 + 5 ] &= ~BIT0; + halLcdSendCommand(&LcdInitMacro[ 3 * 6 ]); // R03 Power control +} + +/**********************************************************************//** + * @brief Sets the pointer location in the LCD. + * + * - LcdAddress = Address + * - LcdTableAddress = Correct Address Row + Column + * = (Address / 0x20)* 17 + Column + * + * @param Address The target pointer location in the LCD. + * + * @return none + *************************************************************************/ +void halLcdSetAddress(int Address) +{ + int temp; + + Draw_Block_Address_Macro[4] = Address >> 8; + Draw_Block_Address_Macro[5] = Address & 0xFF; + halLcdSendCommand(Draw_Block_Address_Macro); + LcdAddress = Address; + temp = Address >> 5; // Divided by 0x20 + temp = temp + (temp << 4); + //Multiplied by (1+16) and added by the offset + LcdTableAddress = temp + (Address & 0x1F); +} + +/**********************************************************************//** + * @brief Draws a block at the specified LCD address. + * + * A block is the smallest addressable memory on the LCD and is + * equivalent to 8 pixels, each of which is represented by 2 bits + * that represent a grayscale value between 00b and 11b. + * + * @param Address The address at which to draw the block. + * + * @param Value The value of the block + * + * @return none + *************************************************************************/ +void halLcdDrawBlock(unsigned int Address, unsigned int Value) +{ + halLcdSetAddress(Address); + halLcdDrawCurrentBlock(Value); +} + +/**********************************************************************//** + * @brief Writes Value to LCD CGram and MSP430 internal LCD table. + * + * Also updates the LcdAddress and LcdTableAddress to the correct values. + * + * @param Value The value of the block to be written to the LCD. + * + * @return none + *************************************************************************/ +void halLcdDrawCurrentBlock(unsigned int Value) +{ + int temp; + + Draw_Block_Value_Macro[4] = Value >> 8; + Draw_Block_Value_Macro[5] = Value & 0xFF; + LCD_MEM[ LcdTableAddress ] = Value; + + halLcdSendCommand(Draw_Block_Value_Macro); + + LcdAddress++; + temp = LcdAddress >> 5; // Divided by 0x20 + temp = temp + (temp << 4); + // Multiplied by (1+16) and added by the offset + LcdTableAddress = temp + (LcdAddress & 0x1F); + + // If LcdAddress gets off the right edge, move to next line + if ((LcdAddress & 0x1F) > 0x11) + halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 ); + if (LcdAddress == LCD_Size) + halLcdSetAddress( 0 ); +} + +/**********************************************************************//** + * @brief Returns the LCD CGRAM value at location Address. + * + * @param Address The address of the block to be read from the LCD. + * + * @return Value The value held at the specified address. + *************************************************************************/ +int halLcdReadBlock(unsigned int Address) +{ + int i = 0, Value = 0, ReadData[7]; + + halLcdSetAddress( Address ); + halLcdSendCommand(Read_Block_Address_Macro); + + LCD_CS_RST_OUT &= ~LCD_CS_PIN; // start transfer CS=0 + UCB2TXBUF = 0x77; // Transmit first character 0x77 + + while (!(UCB2IFG & UCTXIFG)); + while (UCB2STAT & UCBUSY); + + //Read 5 dummies values and 2 valid address data + LCD_SPI_SEL &= ~LCD_MOSI_PIN; //Change SPI2C Dir + LCD_SPI_SEL |= LCD_MISO_PIN; + + for (i = 0; i < 7; i ++ ) + { + UCB2IFG &= ~UCRXIFG; + UCB2TXBUF = 1; // load dummy byte 1 for clk + while (!(UCB2IFG & UCRXIFG)); + ReadData[i] = UCB2RXBUF; + } + LCD_CS_RST_OUT |= LCD_CS_PIN; // Stop Transfer CS = 1 + + LCD_SPI_SEL |= LCD_MOSI_PIN; //Change SPI2C Dir + LCD_SPI_SEL &= ~LCD_MISO_PIN; + LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN; + LCD_CS_RST_DIR &= ~LCD_MISO_PIN; + + Value = (ReadData[5] << 8) + ReadData[6]; + return Value; +} + +/**********************************************************************//** + * @brief Draw a Pixel of grayscale at coordinate (x,y) to LCD + * + * @param x x-coordinate for grayscale value + * + * @param y y-coordinate for grayscale value + * + * @param GrayScale The intended grayscale value of the pixel - one of + * four possible settings. + * + * @return none + *************************************************************************/ +void halLcdPixel( int x, int y, unsigned char GrayScale) +{ + int Address, Value; + unsigned char offset; + + //Each line increments by 0x20 + if ( (x>=0 ) && (x=0) && (y> 3) ; //Narrow down to 8 possible pixels + + Value = LCD_MEM[(y << 4)+ y + (x>>3)]; //y * 17 --> row. x>>3 --> column + + offset = (x & 0x07) << 1; //3 LSBs = pos. within the 8 columns + Value &= ~ (3 << offset); //clear out the corresponding bits + Value |= GrayScale << offset; //set pixel to GrayScale level + + halLcdDrawBlock( Address, Value ); + } +} + +/**********************************************************************//** + * @brief Clears entire LCD CGRAM as well as LCD_MEM. + * + * @param none + * + * @return none + *************************************************************************/ +void halLcdClearScreen(void) +{ + int i, j, k, Current_Location = 0; + halLcdSetAddress(0); + + for (i=0; i < 110; i++) + { + //prepare to send image + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + for ( k = 0; k < 3; k++ ) + { + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = Draw_Block_Value_Macro[k]; // Load data + } + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = Draw_Block_Value_Macro[3]; // Load data + + //send blank line + for (j=0; j < 17; j++) + { + LCD_MEM[ LcdTableAddress++ ] = 0x00; + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = 0x00; // Load data + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = 0x00; // Load data + } + //Clear the partially visible block at the edge of the screen + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = 0x00; // Load data + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = 0x00; // Load data + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer + + Current_Location += 0x20; + halLcdSetAddress(Current_Location ); + } + + halLcdSetAddress(0); +} + +/**********************************************************************//** + * @brief Loads an image of size = rows * columns, starting at the + * coordinate (x,y). + * + * @param Image[] The image to be loaded + * + * @param Rows The number of rows in the image. Size = Rows * Columns. + * + * @param Columns The number of columns in the image. Size = Rows * Columns. + * + * @param x x-coordinate of the image's starting location + * + * @param y y-coordinate of the image's starting location + * + * @return none + *************************************************************************/ +void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y) +{ + int i, CurrentLocation; + + CurrentLocation = (y << 5) + (x >> 3); + halLcdSetAddress(CurrentLocation); + for (i=0; i < Rows; i++) + { + halLcdDrawCurrentLine(Image, Columns); + Image += Columns; + CurrentLocation += 0x20; + halLcdSetAddress(CurrentLocation); + } +} + +/**********************************************************************//** + * @brief Writes Value to LCD CGram and MSP430 internal LCD table. + * + * Also updates the LcdAddress and LcdTableAddress to the correct values. + * + * @param *value Pointer to the line to be written to the LCD. + * + * @return none + *************************************************************************/ +void halLcdDrawCurrentLine(const unsigned int *value, int Columns) +{ + unsigned char i; + + //prepare to send image + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + for ( i = 0; i < 3; i++ ) + { + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = Draw_Block_Value_Macro[i]; // Load data + } + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = Draw_Block_Value_Macro[3]; // Load data + + //send the image + for ( i = 0; i < Columns; i++ ) + { + // Make sure we are not writing outside LCD_MEM[] + if (LcdTableAddress >= sizeof(LCD_MEM)) { + break; + } + LCD_MEM[ LcdTableAddress++ ] = *value; + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = (*value) >> 8; // Load data + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = (*value++) & 0xFF; // Load data + } + + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer +} + +/**********************************************************************//** + * @brief Clears an image of size rows x columns starting at (x, y). + * + * @param Columns The size, in columns, of the image to be cleared. + * + * @param Rows The size, in rows, of the image to be cleared. + * + * @param x x-coordinate of the image to be cleared + * + * @param y y-coordinate of the image to be cleared + * + * @return none + *************************************************************************/ +void halLcdClearImage(int Columns, int Rows, int x, int y) +{ + int i,j,k, Current_Location; + Current_Location = (y << 5) + (x >> 3); + halLcdSetAddress( Current_Location ); + + for (i=0; i < Rows; i++) + { + //prepare to send image + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + for ( k = 0; k < 3; k++ ) + { + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = Draw_Block_Value_Macro[k]; // Load data + } + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer + LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = Draw_Block_Value_Macro[3]; // Load data + + //send blank line + for (j=0; j < Columns; j++) + { + LCD_MEM[ LcdTableAddress++ ] = 0x00; + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = 0x00; // Load data + while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG + UCB2TXBUF = 0x00; // Load data + } + while (UCB2STAT & UCBUSY); + LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer + + Current_Location += 0x20; + halLcdSetAddress(Current_Location ); + } +} + +/**********************************************************************//** + * @brief Writes Value to LCD CGRAM. Pointers internal to the LCD + * are also updated. + * + * @param Value The value to be written to the current LCD pointer + * + * @return none + *************************************************************************/ +void halLcdDrawTextBlock(unsigned int Value) +{ + int temp; + + Draw_Block_Value_Macro[4] = Value >> 8; + Draw_Block_Value_Macro[5] = Value & 0xFF; + LCD_MEM[ LcdTableAddress ] = Value; + + halLcdSendCommand(Draw_Block_Value_Macro); + + LcdAddress++; + temp = LcdAddress >> 5; // Divided by 0x20 + temp = temp + (temp << 4); + //Multiplied by (1+16) and added by the offset + LcdTableAddress = temp + (LcdAddress & 0x1F); + + // If LcdAddress gets off the right edge, move to next line + if ((LcdAddress & 0x1F) > 0x10) + halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 ); + + if (LcdAddress >= LCD_Size) + halLcdSetAddress( 0 ); +} + +/**********************************************************************//** + * @brief Displays the string to the LCD starting at current location. + * + * Writes all the data to LCD_MEM first, then updates all corresponding + * LCD CGRAM locations at once, in a continuous fashion. + * + * @param String[] The string to be displayed on LCD. + * + * @param TextStyle Value that specifies whether the string is to be + * inverted or overwritten. + * - Invert = 0x01 + * - Overwrite = 0x04 + * + * @return none + *************************************************************************/ +void halLcdPrint( char String[], unsigned char TextStyle) +{ + int i, j, Counter=0, BlockValue; + int Address, LCD_MEM_Add, ActualAddress; + int temp; + char LookUpChar; + + ActualAddress = LcdAddress; + Counter = LcdAddress & 0x1F; + i=0; + + while (String[i]!=0) // Stop on null character + { + LookUpChar = fonts_lookup[String[i]]; + + for (j=0;j < FONT_HEIGHT ;j++) + { + Address = ActualAddress + j*0x20; + temp = Address >> 5; + temp += (temp <<4); + + LCD_MEM_Add = temp + (Address & 0x1F); + + BlockValue = LCD_MEM[ LCD_MEM_Add ]; + + if(TextStyle & GRAYSCALE_TEXT) + { + if (TextStyle & INVERT_TEXT) + if (TextStyle & OVERWRITE_TEXT) + BlockValue = 0xAAAA - GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j]; + else + BlockValue |= 0xAAAA - GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j]; + else + if (TextStyle & OVERWRITE_TEXT) + BlockValue = GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j]; + else + BlockValue |= GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j]; + } + else + { + if (TextStyle & INVERT_TEXT) + if (TextStyle & OVERWRITE_TEXT) + BlockValue = 0xFFFF - fonts[LookUpChar*13+j]; + else + BlockValue |= 0xFFFF - fonts[LookUpChar*13+j]; + + else + if (TextStyle & OVERWRITE_TEXT) + BlockValue = fonts[LookUpChar*(FONT_HEIGHT+1) +j]; + else + BlockValue |= fonts[LookUpChar*(FONT_HEIGHT+1) +j]; + } + halLcdDrawBlock( Address, BlockValue); + } + + Counter++; + if (Counter == 17) + { + Counter = 0; + ActualAddress += 0x20*FONT_HEIGHT - 16; + if (ActualAddress > LCD_Last_Pixel-0x20*FONT_HEIGHT ) + ActualAddress = 0; + } + else + ActualAddress++; + i++; + } + halLcdSetAddress(ActualAddress); + +} + +/**********************************************************************//** + * @brief Displays the string to the LCD starting at (x,y) location. + * + * Writes all the data to LCD_MEM first, then updates all corresponding + * LCD CGRAM locations at once, in a continuous fashion. + * + * @param String[] String to be displayed on LCD + * + * @param x x-coordinate of the write location on the LCD + * + * @param y y-coordinate of the write location on the LCD + * + * @param TextStyle Value that specifies whether the string is to be + * inverted or overwritten. + * - Invert = 0x01 + * - Overwrite = 0x04 + *************************************************************************/ +void halLcdPrintXY( char String[], int x, int y, unsigned char TextStyle) +{ + //Each line increments by 0x20 + halLcdSetAddress( (y << 5) + (x >> 3)) ; //Narrow down to 8 possible pixels + halLcdPrint(String, TextStyle); +} + +/**********************************************************************//** + * @brief Displays a string on the LCD on the specified line. + * + * @param String[] The string to be displayed on LCD. + * + * @param Line The line on the LCD on which to print the string. + * + * @param TextStyle Value that specifies whether the string is to be + * inverted or overwritten. + * - Invert = 0x01 + * - Overwrite = 0x04 + * + * @return none + *************************************************************************/ +void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle) +{ + int temp; + temp = Line * FONT_HEIGHT ; + halLcdSetAddress( temp << 5 ) ; // 0x20 = 2^5 + halLcdPrint(String, TextStyle); +} + +/**********************************************************************//** + * @brief Prints a string beginning on a given line and column. + * + * @param String[] The string to be displayed on LCD. + * + * @param Line The line on which to print the string of text + * + * @param Col The column on which to print the string of text + * + * @param TextStyle Value that specifies whether the string is to be + * inverted or overwritten. + * - Invert = 0x01 + * - Overwrite = 0x04 + * + * @return none + *************************************************************************/ +void halLcdPrintLineCol(char String[], unsigned char Line, unsigned char Col, + unsigned char TextStyle) +{ + int temp; + + temp = Line * FONT_HEIGHT; + temp <<= 5; + temp += Col; + + halLcdSetAddress( temp ) ; // 0x20 = 2^5 + halLcdPrint(String, TextStyle); +} + + +/**********************************************************************//** + * @brief Draws a horizontral line from (x1,y) to (x2,y) of GrayScale level + * + * @param x1 x-coordinate of the first point + * + * @param x2 x-coordinate of the second point + * + * @param y y-coordinate of both points + * + * @param GrayScale Grayscale level of the horizontal line + * + * @return none + *************************************************************************/ +void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale) +{ + int x_dir, x; + if ( x1 < x2 ) + x_dir = 1; + else + x_dir = -1; + x = x1; + while (x != x2) + { + halLcdPixel( x,y, GrayScale); + x += x_dir; + } +} + +/**********************************************************************//** + * @brief Draws a vertical line from (x,y1) to (x,y2) of GrayScale level + * + * @param x x-coordinate of both points + * + * @param y1 y-coordinate of the first point + * + * @param y2 y-coordinate of the second point + * + * @param GrayScale GrayScale level of the vertical line + * + * @return none + *************************************************************************/ +void halLcdVLine( int x, int y1, int y2, unsigned char GrayScale) +{ + int y_dir, y; + if ( y1 < y2 ) + y_dir = 1; + else + y_dir = -1; + y = y1; + while (y != y2) + { + halLcdPixel( x,y, GrayScale); + y += y_dir; + } +} + +/**********************************************************************//** + * @brief Draws a line from (x1,y1) to (x2,y2) of GrayScale level. + * + * Uses Bresenham's line algorithm. + * + * @param x1 x-coordinate of the first point + * + * @param y1 y-coordinate of the first point + * + * @param x2 x-coordinate of the second point + * + * @param y2 y-coordinate of the second point + * + * @param GrayScale Grayscale level of the line + * + * @return none + *************************************************************************/ +void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale) +{ + int x, y, deltay, deltax, d; + int x_dir, y_dir; + + if ( x1 == x2 ) + halLcdVLine( x1, y1, y2, GrayScale ); + else + { + if ( y1 == y2 ) + halLcdHLine( x1, x2, y1, GrayScale ); + else // a diagonal line + { + if (x1 > x2) + x_dir = -1; + else x_dir = 1; + if (y1 > y2) + y_dir = -1; + else y_dir = 1; + + x = x1; + y = y1; + deltay = ABS(y2 - y1); + deltax = ABS(x2 - x1); + + if (deltax >= deltay) + { + d = (deltay << 1) - deltax; + while (x != x2) + { + halLcdPixel(x, y, GrayScale); + if ( d < 0 ) + d += (deltay << 1); + else + { + d += ((deltay - deltax) << 1); + y += y_dir; + } + x += x_dir; + } + } + else + { + d = (deltax << 1) - deltay; + while (y != y2) + { + halLcdPixel(x, y, GrayScale); + if ( d < 0 ) + d += (deltax << 1); + else + { + d += ((deltax - deltay) << 1); + x += x_dir; + } + y += y_dir; + } + } + } + } +} + + +/**********************************************************************//** + * @brief Draw a circle of Radius with center at (x,y) of GrayScale level. + * + * Uses Bresenham's circle algorithm + * + * @param x x-coordinate of the circle's center point + * + * @param y y-coordinate of the circle's center point + * + * @param Radius Radius of the circle + * + * @param GrayScale Grayscale level of the circle + *************************************************************************/ +void halLcdCircle(int x, int y, int Radius, int GrayScale) +{ + int xx, yy, ddF_x, ddF_y, f; + + ddF_x = 0; + ddF_y = -(2 * Radius); + f = 1 - Radius; + + xx = 0; + yy = Radius; + halLcdPixel(x + xx, y + yy, GrayScale); + halLcdPixel(x + xx, y - yy, GrayScale); + halLcdPixel(x - xx, y + yy, GrayScale); + halLcdPixel(x - xx, y - yy, GrayScale); + halLcdPixel(x + yy, y + xx, GrayScale); + halLcdPixel(x + yy, y - xx, GrayScale); + halLcdPixel(x - yy, y + xx, GrayScale); + halLcdPixel(x - yy, y - xx, GrayScale); + while (xx < yy) + { + if (f >= 0) + { + yy--; + ddF_y += 2; + f += ddF_y; + } + xx++; + ddF_x += 2; + f += ddF_x + 1; + halLcdPixel(x + xx, y + yy, GrayScale); + halLcdPixel(x + xx, y - yy, GrayScale); + halLcdPixel(x - xx, y + yy, GrayScale); + halLcdPixel(x - xx, y - yy, GrayScale); + halLcdPixel(x + yy, y + xx, GrayScale); + halLcdPixel(x + yy, y - xx, GrayScale); + halLcdPixel(x - yy, y + xx, GrayScale); + halLcdPixel(x - yy, y - xx, GrayScale); + } +} + +/**********************************************************************//** + * @brief Scrolls a single row of pixels one column to the left. + * + * The column that is scrolled out of the left side of the LCD will be + * displayed the right side of the LCD. + * + * @param y The row of pixels to scroll. y = 0 is at the top-left + * corner of the LCD. + * + * @return none + *************************************************************************/ +void halLcdScrollRow(int y) +{ + int i, Address, LcdTableAddressTemp; + unsigned int temp; + + Address = y << 5; + + halLcdSetAddress( Address ); + + //Multiplied by (1+16) and added by the offset + LcdTableAddressTemp = y + (y << 4); + temp = ((LCD_MEM[LcdTableAddressTemp] & 0x0003) <<14); + + for (i = 0; i < 0x10; i++) + halLcdDrawCurrentBlock( ( (LCD_MEM[LcdTableAddressTemp+i] & 0xFFFC ) >> 2 ) \ + + ((LCD_MEM[LcdTableAddressTemp+i+1] & 0x0003) << 14 )); + + halLcdDrawCurrentBlock( (( LCD_MEM[LcdTableAddressTemp + 0x10] & 0xFFFC ) >> 2) + temp); +} + +/**********************************************************************//** + * @brief Scrolls multiple rows of pixels, yStart to yEnd, + * one column to the left. + * + * The column that is scrolled out of the left side of the LCD will be + * displayed the right side of the LCD. y = 0 is at the top-left of the + * LCD screen. + * + * @param yStart The beginning row to be scrolled + * + * @param yEnd The last row to be scrolled + * + * @return none + *************************************************************************/ +void halLcdHScroll(int yStart, int yEnd) +{ + int i ; + + for (i = yStart; i < yEnd+1; i++) + halLcdScrollRow(i); +} + +/**********************************************************************//** + * @brief Scrolls a line of text one column to the left. + * + * @param Line The line of text to be scrolled. + * + * @return none + *************************************************************************/ +void halLcdScrollLine(int Line) +{ + int i, Row ; + + Row = Line * FONT_HEIGHT; + + for (i = Row; i < Row + FONT_HEIGHT ; i++) + halLcdScrollRow(i); +} diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.h new file mode 100644 index 000000000..ab047b056 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.h @@ -0,0 +1,122 @@ +/******************************************************************************* + Filename: hal_lcd.h + + Copyright 2010 Texas Instruments, Inc. +***************************************************************************/ +#ifndef HAL_LCD_H +#define HAL_LCD_H + +#ifndef MIN +#define MIN(n,m) (((n) < (m)) ? (n) : (m)) +#endif + +#ifndef MAX +#define MAX(n,m) (((n) < (m)) ? (m) : (n)) +#endif + +#ifndef ABS +#define ABS(n) (((n) < 0) ? -(n) : (n)) +#endif + +#define LCD_BACKLT_OUT P8OUT +#define LCD_BACKLT_DIR P8DIR +#define LCD_BACKLT_SEL P8SEL +#define LCD_BACKLIGHT_PIN BIT3 +#define LCD_CS_RST_DIR P9DIR +#define LCD_CS_RST_OUT P9OUT +#define LCD_CS_PIN BIT6 +#define LCD_RESET_PIN BIT7 +#define LCD_SPI_SEL P9SEL +#define LCD_SPI_DIR P9DIR +#define LCD_MOSI_PIN BIT1 +#define LCD_MISO_PIN BIT2 +#define LCD_CLK_PIN BIT3 + +#define LCD_ROW 110 +#define LCD_COL 138 +#define LCD_Size 3505 +#define LCD_MEM_Size 110*17 +#define LCD_Max_Column_Offset 0x10 + +#define LCD_Last_Pixel 3505 + +#define LCD_MEM_Row 0x11 +#define LCD_Row 0x20 + +// Grayscale level definitions +#define PIXEL_OFF 0 +#define PIXEL_LIGHT 1 +#define PIXEL_DARK 2 +#define PIXEL_ON 3 + +#define INVERT_TEXT BIT0 +#define OVERWRITE_TEXT BIT2 +#define GRAYSCALE_TEXT BIT1 + +/*------------------------------------------------------------- + * Function Prototypes + * ------------------------------------------------------------*/ +extern void halLcdInit(void); +extern void halLcdShutDown(void); +extern void halLcdBackLightInit(void); +extern void halLcdSetBackLight(unsigned char BackLightLevel); +extern unsigned int halLcdGetBackLight(void); +extern void halLcdShutDownBackLight(void); +extern void halLcdSendCommand(unsigned char Data[]) ; +extern void halLcdSetContrast(unsigned char ContrastLevel); +extern unsigned char halLcdGetContrast(void); +extern void halLcdStandby(void); +extern void halLcdActive(void); + +//Move to specified LCD address +extern void halLcdSetAddress(int Address); + +//Draw at current segment location +extern void halLcdDrawCurrentBlock(unsigned int Value); +extern void halLcdDrawCurrentLine(const unsigned int *value, int length); + +//Draw at specified location by calling +//LCD_Set_Address(Address) & LCD_Draw_Current_Block( value ) +extern void halLcdDrawBlock(unsigned int Address, unsigned int Value); + +//Read value from LCD CGRAM +extern int halLcdReadBlock(unsigned int Address); + +//Clear LCD Screen +extern void halLcdClearScreen(void); + +//Invert black to white and vice versa +extern void halLcdReverse(void); + +// Draw a Pixel @ (x,y) with GrayScale level +extern void halLcdPixel( int x, int y, unsigned char GrayScale); +//Draw Line from (x1,y1) to (x2,y2) with GrayScale level +extern void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale); +extern void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale); +extern void halLcdVLine( int x1, int x2, int y, unsigned char GrayScale); + +extern void halLcdCircle(int x, int y, int Radius, int GrayScale); + +extern void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y); +extern void halLcdClearImage(int Columns, int Rows, int x, int y); + +//Print String of Length starting at current LCD location +extern void halLcdPrint(char String[], unsigned char TextStyle) ; + +//Print String of Length starting at (x,y) +extern void halLcdPrintXY(char String[], int x, int y, unsigned char TextStyle); + +//Print String of Length starting at (x,y) +extern void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle); +extern void halLcdPrintLineCol(char String[], unsigned char Line, unsigned char Col, unsigned char TextStyle); + +extern void halLcdCursor(void); +extern void halLcdCursorOff(void); +//Scroll a single row of pixels +extern void halLcdScrollRow(int y); +//Scroll a number of consecutive rows from yStart to yEnd +extern void halLcdHScroll(int yStart, int yEnd); +//Scroll a line of text +extern void halLcdScrollLine(int Line); + +#endif /* HAL_LCD_H */ diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.c new file mode 100644 index 000000000..06002ace6 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.c @@ -0,0 +1,323 @@ +/**********************************************************************//** + * @file UserExperienceGraphics.c + * + * Copyright 2010 Texas Instruments, Inc. +***************************************************************************/ + +const unsigned char fonts_lookup[]={ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 64,65,0,69,0,68,67,0,0,1, //'0' = 48 = 0x30 + 2,3,4,5,6,7,8,9,66,0, //'9' = 57 = 0x39 + 0,70,0,62,0,10,11,12,13,14, //'A' --> 'Z' + 15,16,17,18,19,20,21,22,23,24, + 25,26,27,28,29,30,31,32,33,34, + 35,0,0,0,71,0,0,36,37,38, //'a' = 97 + 39,40,41,42,43,44,45,46,47,48, + 49,50,51,52,53,54,55,56,57,58, + 59,60,61,62,0 ,0, 0, 72,73,74, + 75,76,77,78,79,80,81 //'z' = 122 + }; + +const unsigned int fonts[]= { + 0x0000, 0x0ffc, 0x3c0f, 0x3f0f, 0x3fcf, 0x3ccf, 0x3cff, 0x3c3f, + 0x3c0f, 0x0ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c0, 0x00f0, + 0x00ff, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x0fff, 0x0000, + 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f00, 0x03c0, + 0x00f0, 0x003c, 0x0f0f, 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, + 0x03fc, 0x0f0f, 0x0f00, 0x0f00, 0x03f0, 0x0f00, 0x0f00, 0x0f0f, + 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f00, 0x0fc0, 0x0ff0, + 0x0f3c, 0x0f0f, 0x3fff, 0x0f00, 0x0f00, 0x3fc0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0fff, 0x000f, 0x000f, 0x000f, 0x03ff, 0x0f00, + 0x0f00, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, + 0x003c, 0x000f, 0x000f, 0x03ff, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x3c0f, 0x3c0f, 0x3c00, + 0x0f00, 0x03c0, 0x00f0, 0x00f0, 0x00f0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f3f, 0x03fc, 0x0fcf, 0x0f0f, + 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, + 0x0f0f, 0x0f0f, 0x0ffc, 0x03c0, 0x03c0, 0x00f0, 0x00fc, 0x0000, + 0x0000, 0x0000, 0x0000, 0x00f0, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, + 0x0fff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0fff, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ffc, 0x3c3c, 0x3c3c, 0x3c3c, + 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ff0, 0x3c3c, 0x3c0f, + 0x000f, 0x000f, 0x000f, 0x3c0f, 0x3c3c, 0x0ff0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x03ff, 0x0f3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x0f3c, 0x03ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, + 0x303c, 0x003c, 0x0c3c, 0x0ffc, 0x0c3c, 0x003c, 0x303c, 0x3fff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x3c3c, 0x303c, 0x0c3c, + 0x0ffc, 0x0c3c, 0x003c, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0ff0, 0x3c3c, 0x3c0f, 0x000f, 0x000f, 0x3f0f, 0x3c0f, + 0x3c3c, 0x3ff0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, + 0x0f0f, 0x0f0f, 0x0fff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, + 0x0000, 0x0000, 0x0000, 0x03fc, 0x00f0, 0x00f0, 0x00f0, 0x00f0, + 0x00f0, 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3fc0, 0x0f00, 0x0f00, 0x0f00, 0x0f00, 0x0f0f, 0x0f0f, 0x0f0f, + 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c3f, 0x3c3c, 0x0f3c, + 0x0f3c, 0x03fc, 0x0f3c, 0x0f3c, 0x3c3c, 0x3c3f, 0x0000, 0x0000, + 0x0000, 0x0000, 0x00ff, 0x003c, 0x003c, 0x003c, 0x003c, 0x303c, + 0x3c3c, 0x3c3c, 0x3fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, + 0x3f3f, 0x3fff, 0x3fff, 0x3ccf, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, 0x3c0f, 0x3c3f, 0x3cff, + 0x3fff, 0x3fcf, 0x3f0f, 0x3c0f, 0x3c0f, 0x0000, 0x0000, 0x0000, + 0x0000, 0x03f0, 0x0f3c, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x0f3c, 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x3c3c, + 0x3c3c, 0x3c3c, 0x0ffc, 0x003c, 0x003c, 0x003c, 0x00ff, 0x0000, + 0x0000, 0x0000, 0x0000, 0x03f0, 0x0f3c, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3f0f, 0x3fcf, 0x0ffc, 0x0f00, 0x3fc0, 0x0000, 0x0000, 0x0000, + 0x0fff, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ffc, 0x0f3c, 0x3c3c, 0x3c3c, + 0x3c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, + 0x000f, 0x00fc, 0x03c0, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0fff, 0x0cf3, 0x00f0, 0x00f0, 0x00f0, 0x00f0, + 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, + 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, + 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x00f0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3ccf, 0x3ccf, 0x0f3c, + 0x0f3c, 0x0f3c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, + 0x0f0f, 0x03fc, 0x00f0, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, + 0x00f0, 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3fff, 0x3f0f, 0x03c3, 0x03c0, 0x00f0, 0x003c, 0x303c, 0x3c0f, + 0x3fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x03fc, 0x0f00, 0x0ffc, 0x0f0f, 0x0f0f, 0x3cfc, 0x0000, 0x0000, + 0x0000, 0x0000, 0x003f, 0x003c, 0x003c, 0x0ffc, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3c, 0x0fcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x000f, 0x000f, 0x0f0f, 0x03fc, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0fc0, 0x0f00, 0x0f00, 0x0ffc, + 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x3cfc, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0fff, 0x000f, + 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, 0x0f3c, + 0x003c, 0x003c, 0x03ff, 0x003c, 0x003c, 0x003c, 0x00ff, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3cfc, 0x0f0f, + 0x0f0f, 0x0f0f, 0x0ffc, 0x0f00, 0x0f0f, 0x03fc, 0x0000, 0x0000, + 0x003f, 0x003c, 0x003c, 0x0f3c, 0x3cfc, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03c0, 0x03c0, 0x0000, + 0x03fc, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x3ffc, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0f00, 0x0f00, 0x0000, 0x0ff0, 0x0f00, 0x0f00, + 0x0f00, 0x0f00, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x003f, + 0x003c, 0x003c, 0x3c3c, 0x0f3c, 0x03fc, 0x0f3c, 0x3c3c, 0x3c3f, + 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x03c0, 0x03c0, 0x03c0, + 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x3ffc, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x3ccf, 0x3ccf, 0x3ccf, + 0x3ccf, 0x3c0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x03ff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, + 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0fcf, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x0ffc, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3cfc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0ffc, 0x0f00, 0x3fc0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f3f, 0x3f3c, 0x3cfc, + 0x003c, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x003c, 0x03c0, 0x0f0f, 0x03fc, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x003c, 0x0fff, + 0x003c, 0x003c, 0x003c, 0x0f3c, 0x03f0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, + 0x0f0f, 0x3cfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x00f0, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, 0x3c0f, + 0x3ccf, 0x3ccf, 0x0f3c, 0x0f3c, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3c0f, 0x0f3c, 0x03f0, 0x03f0, 0x0f3c, + 0x3c0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ff0, 0x0f00, 0x03c0, 0x00ff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x0f03, 0x03c0, + 0x003c, 0x0c0f, 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, + 0x0f0f, 0x0f00, 0x03c0, 0x00f0, 0x00f0, 0x0000, 0x00f0, 0x00f0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0f00, 0x03c0, 0x00f0, 0x003c, 0x003c, 0x003c, 0x00f0, + 0x03c0, 0x0f00, 0x0000, 0x0000, 0x0000, 0x0000, 0x003c, 0x00f0, + 0x03c0, 0x0f00, 0x0f00, 0x0f00, 0x03c0, 0x00f0, 0x003c, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, 0x03f0, 0x0000, + 0x0000, 0x03f0, 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, + 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3ffc, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x03c0, 0x03c0, 0x3ffc, 0x3ffc, + 0x03c0, 0x03c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3ffc, 0x0000, 0x0000, 0x3ffc, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, + 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +//0--------------------------- + 0x0000, 0x0ffc, 0x3c0f, 0x3f0f, 0x3fcf, 0x3ccf, 0x3cff, 0x3c3f, + 0x3c0f, 0x0ffc, 0x0000, 0x0000, 0x0000, +//1--------------------------- + 0x0000, 0x00c0, 0x00f0, 0x00ff, 0x00f0, 0x00f0, 0x00f0, 0x00f0, + 0x00f0, 0x0fff, 0x0000, 0x0000, 0x0000, +//2--------------------------- + 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f00, 0x03c0, 0x00f0, 0x003c, + 0x0f0f, 0x0fff, 0x0000, 0x0000, 0x0000, +//3--------------------------- + 0x0000, 0x03fc, 0x0f0f, 0x0f00, 0x0f00, 0x03f0, 0x0f00, 0x0f00, + 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, +//4--------------------------- + 0x0000, 0x0f00, 0x0fc0, 0x0ff0, 0x0f3c, 0x0f0f, 0x3fff, 0x0f00, + 0x0f00, 0x3fc0, 0x0000, 0x0000, 0x0000, +//5--------------------------- + 0x0000, 0x0fff, 0x000f, 0x000f, 0x000f, 0x03ff, 0x0f00, 0x0f00, + 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, +//6--------------------------- + 0x0000, 0x03f0, 0x003c, 0x000f, 0x000f, 0x03ff, 0x0f0f, 0x0f0f, + 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, +//7--------------------------- + 0x0000, 0x3fff, 0x3c0f, 0x3c0f, 0x3c00, 0x0f00, 0x03c0, 0x00f0, + 0x00f0, 0x00f0, 0x0000, 0x0000, 0x0000, +//8--------------------------- + 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f3f, 0x03fc, 0x0fcf, 0x0f0f, + 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, +//9--------------------------- + 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0ffc, 0x03c0, 0x03c0, + 0x00f0, 0x00fc, 0x0000, 0x0000, 0x0000, +} ; + + +const unsigned int GrayScale_fonts[]= { + 0x0000, 0x0aa8, 0x280a, 0x2a0a, 0x2a8a, 0x288a, 0x28aa, 0x282a, + 0x280a, 0x0aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x00a0, + 0x00aa, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x0aaa, 0x0000, + 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a00, 0x0280, + 0x00a0, 0x0028, 0x0a0a, 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, + 0x02a8, 0x0a0a, 0x0a00, 0x0a00, 0x02a0, 0x0a00, 0x0a00, 0x0a0a, + 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a00, 0x0a80, 0x0aa0, + 0x0a28, 0x0a0a, 0x2aaa, 0x0a00, 0x0a00, 0x2a80, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0aaa, 0x000a, 0x000a, 0x000a, 0x02aa, 0x0a00, + 0x0a00, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, + 0x0028, 0x000a, 0x000a, 0x02aa, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, 0x280a, 0x280a, 0x2800, + 0x0a00, 0x0280, 0x00a0, 0x00a0, 0x00a0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a2a, 0x02a8, 0x0a8a, 0x0a0a, + 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, + 0x0a0a, 0x0a0a, 0x0aa8, 0x0280, 0x0280, 0x00a0, 0x00a8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x00a0, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, + 0x0aaa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0aaa, 0x2828, 0x2828, 0x2828, 0x0aa8, 0x2828, 0x2828, 0x2828, + 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aa0, 0x2828, 0x280a, + 0x000a, 0x000a, 0x000a, 0x280a, 0x2828, 0x0aa0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02aa, 0x0a28, 0x2828, 0x2828, 0x2828, 0x2828, + 0x2828, 0x0a28, 0x02aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, + 0x2028, 0x0028, 0x0828, 0x0aa8, 0x0828, 0x0028, 0x2028, 0x2aaa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, 0x2828, 0x2028, 0x0828, + 0x0aa8, 0x0828, 0x0028, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0aa0, 0x2828, 0x280a, 0x000a, 0x000a, 0x2a0a, 0x280a, + 0x2828, 0x2aa0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, + 0x0a0a, 0x0a0a, 0x0aaa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x02a8, 0x00a0, 0x00a0, 0x00a0, 0x00a0, + 0x00a0, 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2a80, 0x0a00, 0x0a00, 0x0a00, 0x0a00, 0x0a0a, 0x0a0a, 0x0a0a, + 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x282a, 0x2828, 0x0a28, + 0x0a28, 0x02a8, 0x0a28, 0x0a28, 0x2828, 0x282a, 0x0000, 0x0000, + 0x0000, 0x0000, 0x00aa, 0x0028, 0x0028, 0x0028, 0x0028, 0x2028, + 0x2828, 0x2828, 0x2aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x280a, + 0x2a2a, 0x2aaa, 0x2aaa, 0x288a, 0x280a, 0x280a, 0x280a, 0x280a, + 0x0000, 0x0000, 0x0000, 0x0000, 0x280a, 0x280a, 0x282a, 0x28aa, + 0x2aaa, 0x2a8a, 0x2a0a, 0x280a, 0x280a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x02a0, 0x0a28, 0x280a, 0x280a, 0x280a, 0x280a, 0x280a, + 0x0a28, 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x2828, + 0x2828, 0x2828, 0x0aa8, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0000, + 0x0000, 0x0000, 0x0000, 0x02a0, 0x0a28, 0x280a, 0x280a, 0x280a, + 0x2a0a, 0x2a8a, 0x0aa8, 0x0a00, 0x2a80, 0x0000, 0x0000, 0x0000, + 0x0aaa, 0x2828, 0x2828, 0x2828, 0x0aa8, 0x0a28, 0x2828, 0x2828, + 0x282a, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, + 0x000a, 0x00a8, 0x0280, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0aaa, 0x08a2, 0x00a0, 0x00a0, 0x00a0, 0x00a0, + 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, + 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, + 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x00a0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x280a, 0x280a, 0x280a, 0x280a, 0x288a, 0x288a, 0x0a28, + 0x0a28, 0x0a28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, + 0x0a0a, 0x02a8, 0x00a0, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, + 0x00a0, 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2aaa, 0x2a0a, 0x0282, 0x0280, 0x00a0, 0x0028, 0x2028, 0x280a, + 0x2aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x02a8, 0x0a00, 0x0aa8, 0x0a0a, 0x0a0a, 0x28a8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x002a, 0x0028, 0x0028, 0x0aa8, 0x2828, 0x2828, + 0x2828, 0x2828, 0x0a8a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x000a, 0x000a, 0x0a0a, 0x02a8, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0a80, 0x0a00, 0x0a00, 0x0aa8, + 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x28a8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0aaa, 0x000a, + 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, 0x0a28, + 0x0028, 0x0028, 0x02aa, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28a8, 0x0a0a, + 0x0a0a, 0x0a0a, 0x0aa8, 0x0a00, 0x0a0a, 0x02a8, 0x0000, 0x0000, + 0x002a, 0x0028, 0x0028, 0x0a28, 0x28a8, 0x2828, 0x2828, 0x2828, + 0x282a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0280, 0x0280, 0x0000, + 0x02a8, 0x0280, 0x0280, 0x0280, 0x0280, 0x2aa8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0a00, 0x0a00, 0x0000, 0x0aa0, 0x0a00, 0x0a00, + 0x0a00, 0x0a00, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x002a, + 0x0028, 0x0028, 0x2828, 0x0a28, 0x02a8, 0x0a28, 0x2828, 0x282a, + 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0280, 0x0280, 0x0280, + 0x0280, 0x0280, 0x0280, 0x0280, 0x2aa8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x288a, 0x288a, 0x288a, + 0x288a, 0x280a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x02aa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, + 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0a8a, 0x2828, 0x2828, 0x2828, 0x2828, + 0x0aa8, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x28a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0aa8, 0x0a00, 0x2a80, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a2a, 0x2a28, 0x28a8, + 0x0028, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0028, 0x0280, 0x0a0a, 0x02a8, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0028, 0x0aaa, + 0x0028, 0x0028, 0x0028, 0x0a28, 0x02a0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, + 0x0a0a, 0x28a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x00a0, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x280a, 0x280a, + 0x288a, 0x288a, 0x0a28, 0x0a28, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x280a, 0x0a28, 0x02a0, 0x02a0, 0x0a28, + 0x280a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2828, 0x2828, 0x2828, 0x2828, 0x0aa0, 0x0a00, 0x0280, 0x00aa, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x0a02, 0x0280, + 0x0028, 0x080a, 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, + 0x0a0a, 0x0a00, 0x0280, 0x00a0, 0x00a0, 0x0000, 0x00a0, 0x00a0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0a00, 0x0280, 0x00a0, 0x0028, 0x0028, 0x0028, 0x00a0, + 0x0280, 0x0a00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x00a0, + 0x0280, 0x0a00, 0x0a00, 0x0a00, 0x0280, 0x00a0, 0x0028, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, 0x02a0, 0x0000, + 0x0000, 0x02a0, 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, + 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2aa8, 0x2aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0280, 0x0280, 0x2aa8, 0x2aa8, + 0x0280, 0x0280, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2aa8, 0x0000, 0x0000, 0x2aa8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, + 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +//0--------------------------- + 0x0000, 0x0aa8, 0x280a, 0x2a0a, 0x2a8a, 0x288a, 0x28aa, 0x282a, + 0x280a, 0x0aa8, 0x0000, 0x0000, 0x0000, +//1--------------------------- + 0x0000, 0x0080, 0x00a0, 0x00aa, 0x00a0, 0x00a0, 0x00a0, 0x00a0, + 0x00a0, 0x0aaa, 0x0000, 0x0000, 0x0000, +//2--------------------------- + 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a00, 0x0280, 0x00a0, 0x0028, + 0x0a0a, 0x0aaa, 0x0000, 0x0000, 0x0000, +//2--------------------------- + 0x0000, 0x02a8, 0x0a0a, 0x0a00, 0x0a00, 0x02a0, 0x0a00, 0x0a00, + 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, +//4--------------------------- + 0x0000, 0x0a00, 0x0a80, 0x0aa0, 0x0a28, 0x0a0a, 0x2aaa, 0x0a00, + 0x0a00, 0x2a80, 0x0000, 0x0000, 0x0000, +//5--------------------------- + 0x0000, 0x0aaa, 0x000a, 0x000a, 0x000a, 0x02aa, 0x0a00, 0x0a00, + 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, +//6--------------------------- + 0x0000, 0x02a0, 0x0028, 0x000a, 0x000a, 0x02aa, 0x0a0a, 0x0a0a, + 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, +//7--------------------------- + 0x0000, 0x2aaa, 0x280a, 0x280a, 0x2800, 0x0a00, 0x0280, 0x00a0, + 0x00a0, 0x00a0, 0x0000, 0x0000, 0x0000, +//8--------------------------- + 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a2a, 0x02a8, 0x0a8a, 0x0a0a, + 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, +//9--------------------------- + 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0aa8, 0x0280, 0x0280, + 0x00a0, 0x00a8, 0x0000, 0x0000, 0x0000, +} ; diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.h new file mode 100644 index 000000000..48239c9f1 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.h @@ -0,0 +1,15 @@ +/******************************************************************************* + Filename: hal_lcd_fonts.h + + Copyright 2010 Texas Instruments, Inc. +***************************************************************************/ +#ifndef FONTS_H +#define FONTS_H + +#define FONT_HEIGHT 12 // Each character has 13 lines + +extern const unsigned char fonts_lookup[]; +extern const unsigned int fonts[]; +extern const unsigned int GrayScale_fonts[]; + +#endif /* FONTS_H */ diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/ParTest.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/ParTest.c new file mode 100644 index 000000000..688deaa5c --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/ParTest.c @@ -0,0 +1,144 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + ***NOTE*** The exception to the GPL is included to allow you to distribute + a combined work that includes FreeRTOS without being obliged to provide the + source code for proprietary components outside of the FreeRTOS kernel. + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines to flash LEDs. + *-----------------------------------------------------------*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware includes. */ +#include "msp430.h" +#include "hal_MSP-EXP430F5438.h" + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + /* The port used by the two LEDs is configured from halBoardInit() so + nothing needs to be done here. */ +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* Only two LEDs are provided on the hardware. */ + taskENTER_CRITICAL(); + { + if( xValue != pdFALSE ) + { + switch( uxLED ) + { + case 0: LED_PORT_OUT |= LED_1; + break; + + case 1: LED_PORT_OUT |= LED_2; + break; + + default: /* Nothing to do here, there are only two LEDs. */ + break; + } + } + else + { + switch( uxLED ) + { + case 0: LED_PORT_OUT &= ~LED_1; + break; + + case 1: LED_PORT_OUT &= ~LED_2; + break; + default: /* Nothing to do here, there are only two LEDs. */ + break; + } + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ + taskENTER_CRITICAL(); + { + switch( uxLED ) + { + case 0: if( ( LED_PORT_OUT & LED_1 ) == 0 ) + { + LED_PORT_OUT |= LED_1; + } + else + { + LED_PORT_OUT &= ~LED_1; + } + break; + + case 1: if( ( LED_PORT_OUT & LED_2 ) == 0 ) + { + LED_PORT_OUT |= LED_2; + } + else + { + LED_PORT_OUT &= ~LED_2; + } + break; + default: /* Nothing to do here, there are only two LEDs. */ + break; + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RegTest.asm b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RegTest.asm new file mode 100644 index 000000000..8e147017f --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RegTest.asm @@ -0,0 +1,188 @@ +; +; FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. +; +; *************************************************************************** +; * * +; * If you are: * +; * * +; * + New to FreeRTOS, * +; * + Wanting to learn FreeRTOS or multitasking in general quickly * +; * + Looking for basic training, * +; * + Wanting to improve your FreeRTOS skills and productivity * +; * * +; * then take a look at the FreeRTOS books - available as PDF or paperback * +; * * +; * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * +; * http://www.FreeRTOS.org/Documentation * +; * * +; * A pdf reference manual is also available. Both are usually delivered * +; * to your inbox within 20 minutes to two hours when purchased between 8am * +; * and 8pm GMT (although please allow up to 24 hours in case of * +; * exceptional circumstances). Thank you for your support! * +; * * +; *************************************************************************** +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; ***NOTE*** The exception to the GPL is included to allow you to distribute +; a combined work that includes FreeRTOS without being obliged to provide the +; source code for proprietary components outside of the FreeRTOS kernel. +; FreeRTOS is distributed in the hope that it will be useful, but WITHOUT +; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. You should have received a copy of the GNU General Public +; License and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. + +; * The definition of the "register test" tasks, as described at the top of +; * main.c + + + + + .global usRegTest1Counter + .global usRegTest2Counter + .global vPortYield + + .def vRegTest1Task + .def vRegTest2Task + + .text + +vRegTest1Task: + + ; Fill each general purpose register with a known value. + movx.a #0x44444, r4 + movx.a #0x55555, r5 + movx.a #0x66666, r6 + movx.a #0x77777, r7 + movx.a #0x88888, r8 + movx.a #0x99999, r9 + movx.a #0xaaaaa, r10 + movx.a #0xbbbbb, r11 + movx.a #0xccccc, r12 + movx.a #0xddddd, r13 + movx.a #0xeeeee, r14 + movx.a #0xfffff, r15 + +prvRegTest1Loop: + + ; Test each general purpose register to check that it still contains the + ; expected known value, jumping to vRegTest1Error if any register contains + ; an unexpected value. + cmpx.a #0x44444, r4 + jne vRegTest1Error + cmpx.a #0x55555, r5 + jne vRegTest1Error + cmpx.a #0x66666, r6 + jne vRegTest1Error + cmpx.a #0x77777, r7 + jne vRegTest1Error + cmpx.a #0x88888, r8 + jne vRegTest1Error + cmpx.a #0x99999, r9 + jne vRegTest1Error + cmpx.a #0xaaaaa, r10 + jne vRegTest1Error + cmpx.a #0xbbbbb, r11 + jne vRegTest1Error + cmpx.a #0xccccc, r12 + jne vRegTest1Error + cmpx.a #0xddddd, r13 + jne vRegTest1Error + cmpx.a #0xeeeee, r14 + jne vRegTest1Error + cmpx.a #0xfffff, r15 + jne vRegTest1Error + + ; This task is still running without jumping to vRegTest1Error, so increment + ; the loop counter so the check task knows the task is running error free. + incx.w &usRegTest1Counter + + ; Loop again, performing the same tests. + jmp prvRegTest1Loop + nop + + +vRegTest1Error: + jmp vRegTest1Error + nop + +; ----------------------------------------------------------- + +; See the comments in vRegTest1Task. This task is the same, it just uses +; different values in its registers. +vRegTest2Task: + + movx.a #0x14441, r4 + movx.a #0x15551, r5 + movx.a #0x16661, r6 + movx.a #0x17771, r7 + movx.a #0x18881, r8 + movx.a #0x19991, r9 + movx.a #0x1aaa1, r10 + movx.a #0x1bbb1, r11 + movx.a #0x1ccc1, r12 + movx.a #0x1ddd1, r13 + movx.a #0x1eee1, r14 + movx.a #0x1fff1, r15 + +prvRegTest2Loop: + + cmpx.a #0x14441, r4 + jne vRegTest2Error + cmpx.a #0x15551, r5 + jne vRegTest2Error + cmpx.a #0x16661, r6 + jne vRegTest2Error + cmpx.a #0x17771, r7 + jne vRegTest2Error + cmpx.a #0x18881, r8 + jne vRegTest2Error + cmpx.a #0x19991, r9 + jne vRegTest2Error + cmpx.a #0x1aaa1, r10 + jne vRegTest2Error + cmpx.a #0x1bbb1, r11 + jne vRegTest2Error + cmpx.a #0x1ccc1, r12 + jne vRegTest2Error + cmpx.a #0x1ddd1, r13 + jne vRegTest2Error + cmpx.a #0x1eee1, r14 + jne vRegTest2Error + cmpx.a #0x1fff1, r15 + jne vRegTest2Error + + ; Also perform a manual yield, just to increase the scope of the test. + calla #vPortYield + + incx.w &usRegTest2Counter + jmp prvRegTest2Loop + nop + + +vRegTest2Error: + jmp vRegTest2Error + nop +; /*----------------------------------------------------------- + + + .end + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RunTimeStatsConfig.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RunTimeStatsConfig.c new file mode 100644 index 000000000..94dd0f953 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RunTimeStatsConfig.c @@ -0,0 +1,115 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + ***NOTE*** The exception to the GPL is included to allow you to distribute + a combined work that includes FreeRTOS without being obliged to provide the + source code for proprietary components outside of the FreeRTOS kernel. + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" + +/* Hardware includes. */ +#include "msp430.h" +#include "hal_MSP-EXP430F5438.h" + +/* This demo uses Timer A1 to generate the time base for gathering run time +statistics information. Run time statistics show much processing time has +been allocated to each task since the application booted. */ + +/* The time base for the run time stats is generated by a 16 bit timer. Each +time the timer overflows ulStatsOverflowCount is incremented. Therefore, +when converting the total run time to a 32 bit number, the most significant two +bytes are given by ulStatsOverflowCount and the least significant two bytes are +given by the current timer counter value. Care must be taken with data +consistency when combining the two in case a timer overflow occurs as the +value is being read. */ +volatile unsigned long ulStatsOverflowCount = 0; + +/*-----------------------------------------------------------*/ + +void vConfigureTimerForRunTimeStats( void ) +{ + /* Ensure the timer is stopped. */ + TA1CTL = 0; + + /* Run the timer from the ACLK/4. */ + TA1CTL = TASSEL_1 | ID__4; + + /* Clear everything to start with. */ + TA1CTL |= TACLR; + + /* Enable the interrupts. */ + TA1CCTL0 = CCIE; + + /* Start up clean. */ + TA1CTL |= TACLR; + + /* Continuous mode. */ + TA1CTL |= MC__CONTINOUS; +} +/*-----------------------------------------------------------*/ + +#pragma vector=TIMER1_A0_VECTOR +static __interrupt void prvRunTimeStatsOverflowISR( void ) +{ + ulStatsOverflowCount++; +} +/*-----------------------------------------------------------*/ + +inline unsigned long ulGetRunTimeStatsTime( void ) +{ +unsigned long ulReturn; + + TA1CTL &= ~MC__CONTINOUS; + ulReturn = ( ( ulStatsOverflowCount << 16UL ) | ( unsigned long ) TA1R ); + TA1CTL |= MC__CONTINOUS; + + return ulReturn; +} +/*-----------------------------------------------------------*/ diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/main.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/main.c new file mode 100644 index 000000000..7f83be8ca --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/main.c @@ -0,0 +1,624 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + ***NOTE*** The exception to the GPL is included to allow you to distribute + a combined work that includes FreeRTOS without being obliged to provide the + source code for proprietary components outside of the FreeRTOS kernel. + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* + * The documentation page for this demo available on http://www.FreeRTOS.org + * documents the hardware configuration required to run this demo. It also + * provides more information on the expected demo application behaviour. + * + * main() creates all the demo application tasks, then starts the scheduler. + * A lot of the created tasks are from the pool of "standard demo" tasks. The + * web documentation provides more details of the standard demo tasks, which + * provide no particular functionality but do provide good examples of how to + * use the FreeRTOS API. + * + * In addition to the standard demo tasks, the following tasks, interrupts and + * tests are defined and/or created within this file: + * + * "LCD" task - The LCD task is a 'gatekeeper' task. It is the only task that + * is permitted to access the LCD and therefore ensures access to the LCD is + * always serialised and there are no mutual exclusion issues. When a task or + * an interrupt wants to write to the LCD, it does not access the LCD directly + * but instead sends the message to the LCD task. The LCD task then performs + * the actual LCD output. This mechanism also allows interrupts to, in effect, + * write to the LCD by sending messages to the LCD task. + * + * The LCD task is also a demonstration of a 'controller' task design pattern. + * Some tasks do not actually send a string to the LCD task directly, but + * instead send a command that is interpreted by the LCD task. In a normal + * application these commands can be control values or set points, in this + * simple example the commands just result in messages being displayed on the + * LCD. + * + * "Button Poll" task - This task polls the state of the 'up' key on the + * joystick input device. It uses the vTaskDelay() API function to control + * the poll rate to ensure debouncing is not necessary and that the task does + * not use all the available CPU processing time. + * + * Button Interrupt and run time stats display - The select button on the + * joystick input device is configured to generate an external interrupt. The + * handler for this interrupt sends a message to LCD task, which interprets the + * message to mean, firstly write a message to the LCD, and secondly, generate + * a table of run time statistics. The run time statistics are displayed as a + * table that contains information on how much processing time each task has + * been allocated since the application started to execute. This information + * is provided both as an absolute time, and as a percentage of the total run + * time. The information is displayed in the terminal IO window of the IAR + * embedded workbench. The online documentation for this demo shows a screen + * shot demonstrating where the run time stats can be viewed. + * + * Idle Hook - The idle hook is a function that is called on each iteration of + * the idle task. In this case it is used to place the processor into a low + * power mode. Note however that this application is implemented using standard + * components, and is therefore not optimised for low power operation. Lower + * power consumption would be achieved by converting polling tasks into event + * driven tasks, and slowing the tick interrupt frequency. + * + * "Check" function called from the tick hook - The tick hook is called during + * each tick interrupt. It is called from an interrupt context so must execute + * quickly, not attempt to block, and not call any FreeRTOS API functions that + * do not end in "FromISR". In this case the tick hook executes a 'check' + * function. This only executes every five seconds. Its main function is to + * check that all the standard demo tasks are still operational. Each time it + * executes it sends a status code to the LCD task. The LCD task interprets the + * code and displays an appropriate message - which will be PASS if no tasks + * have reported any errors, or a message stating which task has reported an + * error. + * + * "Reg test" tasks - These fill the registers with known values, then check + * that each register still contains its expected value. Each task uses + * different values. The tasks run with very low priority so get preempted + * very frequently. A check variable is incremented on each iteration of the + * test loop. A register containing an unexpected value is indicative of an + * error in the context switching mechanism and will result in a branch to a + * null loop - which in turn will prevent the check variable from incrementing + * any further and allow the check task (described a above) to determine that an + * error has occurred. The nature of the reg test tasks necessitates that they + * are written in assembly code. + * + * *NOTE 2* vApplicationSetupTimerInterrupt() is called by the kernel to let + * the application set up a timer to generate the tick interrupt. In this + * example a timer A0 is used for this purpose. + * +*/ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Hardware includes. */ +#include "msp430.h" +#include "hal_MSP-EXP430F5438.h" + +/* Standard demo includes. */ +#include "ParTest.h" +#include "dynamic.h" +#include "comtest2.h" +#include "GenQTest.h" + +/* Codes sent within messages to the LCD task so the LCD task can interpret +exactly what the message it just received was. These are sent in the +cMessageID member of the message structure (defined below). */ +#define mainMESSAGE_BUTTON_UP ( 1 ) +#define mainMESSAGE_BUTTON_SEL ( 2 ) +#define mainMESSAGE_STATUS ( 3 ) + +/* When the cMessageID member of the message sent to the LCD task is +mainMESSAGE_STATUS then these definitions are sent in the ulMessageValue member +of the same message and indicate what the status actually is. */ +#define mainERROR_DYNAMIC_TASKS ( pdPASS + 1 ) +#define mainERROR_COM_TEST ( pdPASS + 2 ) +#define mainERROR_GEN_QUEUE_TEST ( pdPASS + 3 ) +#define mainERROR_REG_TEST ( pdPASS + 4 ) + +/* The length of the queue (the number of items the queue can hold) that is used +to send messages from tasks and interrupts the the LCD task. */ +#define mainQUEUE_LENGTH ( 5 ) + +/* Priorities used by the test and demo tasks. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainGENERIC_QUEUE_TEST_PRIORITY ( tskIDLE_PRIORITY ) + +/* The LED used by the comtest tasks. See the comtest.c file for more +information. */ +#define mainCOM_TEST_LED ( 1 ) + +/* The baud rate used by the comtest tasks described at the top of this file. */ +#define mainCOM_TEST_BAUD_RATE ( 38400 ) + +/* The maximum number of lines of text that can be displayed on the LCD. */ +#define mainMAX_LCD_LINES ( 8 ) +/*-----------------------------------------------------------*/ + +/* + * The reg test tasks as described at the top of this file. + */ +extern void vRegTest1Task( void *pvParameters ); +extern void vRegTest2Task( void *pvParameters ); + +/* + * Configures clocks, LCD, port pints, etc. necessary to execute this demo. + */ +static void prvSetupHardware( void ); + +/* + * Definition of the LCD/controller task described in the comments at the top + * of this file. + */ +static void prvLCDTask( void *pvParameters ); + +/* + * Definition of the button poll task described in the comments at the top of + * this file. + */ +static void prvButtonPollTask( void *pvParameters ); + +/* + * Converts a status message value into an appropriate string for display on + * the LCD. The string is written to pcBuffer. + */ +static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue ); + +/*-----------------------------------------------------------*/ + +/* Variables that are incremented on each iteration of the reg test tasks - +provided the tasks have not reported any errors. The check task inspects these +variables to ensure they are still incrementing as expected. If a variable +stops incrementing then it is likely that its associate task has stalled. */ +volatile unsigned short usRegTest1Counter = 0, usRegTest2Counter = 0; + +/* The handle of the queue used to send messages from tasks and interrupts to +the LCD task. */ +static xQueueHandle xLCDQueue = NULL; + +/* The definition of each message sent from tasks and interrupts to the LCD +task. */ +typedef struct +{ + char cMessageID; /* << States what the message is. */ + unsigned long ulMessageValue; /* << States the message value (can be an integer, string pointer, etc. depending on the value of cMessageID). */ +} xQueueMessage; + +/*-----------------------------------------------------------*/ + +void main( void ) +{ + /* Configure the peripherals used by this demo application. This includes + configuring the joystick input select button to generate interrupts. */ + prvSetupHardware(); + + /* Create the queue used by tasks and interrupts to send strings to the LCD + task. */ + xLCDQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( xQueueMessage ) ); + + /* If the queue could not be created then don't create any tasks that might + attempt to use the queue. */ + if( xLCDQueue != NULL ) + { + /* Add the created queue to the queue registry so it can be viewed in + the IAR FreeRTOS state viewer plug-in. */ + vQueueAddToRegistry( xLCDQueue, ( signed char * ) "LCDQueue" ); + + /* Create the standard demo tasks. */ + vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED ); + vStartDynamicPriorityTasks(); + vStartGenericQueueTasks( mainGENERIC_QUEUE_TEST_PRIORITY ); + + /* Create the LCD, button poll and register test tasks, as described at + the top of this file. */ + xTaskCreate( prvLCDTask, ( signed char * ) "LCD", configMINIMAL_STACK_SIZE * 2, NULL, mainLCD_TASK_PRIORITY, NULL ); + xTaskCreate( prvButtonPollTask, ( signed char * ) "BPoll", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vRegTest1Task, ( signed char * ) "Reg1", configMINIMAL_STACK_SIZE, NULL, 0, NULL ); + xTaskCreate( vRegTest2Task, ( signed char * ) "Reg2", configMINIMAL_STACK_SIZE, NULL, 0, NULL ); + + /* Start the scheduler. */ + vTaskStartScheduler(); + } + + /* If all is well then this line will never be reached. If it is reached + then it is likely that there was insufficient (FreeRTOS) heap memory space + to create the idle task. This may have been trapped by the malloc() failed + hook function, if one is configured. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvLCDTask( void *pvParameters ) +{ +xQueueMessage xReceivedMessage; + +/* Buffer into which strings are formatted and placed ready for display on the +LCD. Note this is a static variable to prevent it being allocated on the task +stack, which is too small to hold such a variable. The stack size is configured +when the task is created. */ +static char cBuffer[ 512 ]; +unsigned char ucLine = 1; + + + /* This function is the only function that uses printf(). If printf() is + used from any other function then some sort of mutual exclusion on stdout + will be necessary. + + This is also the only function that is permitted to access the LCD. + + First print out the number of bytes that remain in the FreeRTOS heap. This + can be viewed in the terminal IO window within the IAR Embedded Workbench. */ + printf( "%d bytes of heap space remain unallocated\n", ( int ) xPortGetFreeHeapSize() ); + + for( ;; ) + { + /* Wait for a message to be received. Using portMAX_DELAY as the block + time will result in an indefinite wait provided INCLUDE_vTaskSuspend is + set to 1 in FreeRTOSConfig.h, therefore there is no need to check the + function return value and the function will only return when a value + has been received. */ + xQueueReceive( xLCDQueue, &xReceivedMessage, portMAX_DELAY ); + + /* Clear the LCD if no room remains for any more text output. */ + if( ucLine > mainMAX_LCD_LINES ) + { + halLcdClearScreen(); + ucLine = 0; + } + + /* What is this message? What does it contain? */ + switch( xReceivedMessage.cMessageID ) + { + case mainMESSAGE_BUTTON_UP : /* The button poll task has just + informed this task that the up + button on the joystick input has + been pressed or released. */ + sprintf( cBuffer, "Button up = %d", ( int ) xReceivedMessage.ulMessageValue ); + break; + + case mainMESSAGE_BUTTON_SEL : /* The select button interrupt + just informed this task that the + select button was pressed. + Generate a table of task run time + statistics and output this to + the terminal IO window in the IAR + embedded workbench. */ + printf( "\nTask\t Abs Time\t %%Time\n*****************************************" ); + fflush( stdout ); + //vTaskGetRunTimeStats( ( signed char * ) cBuffer ); + //printf( cBuffer ); + //fflush( stdout ); + + /* Also print out a message to + the LCD - in this case the + pointer to the string to print + is sent directly in the + ulMessageValue member of the + message. This just demonstrates + a different communication + technique. */ + sprintf( cBuffer, "%s", ( char * ) xReceivedMessage.ulMessageValue ); + break; + + case mainMESSAGE_STATUS : /* The tick interrupt hook + function has just informed this + task of the system status. + Generate a string in accordance + with the status value. */ + prvGenerateStatusMessage( cBuffer, xReceivedMessage.ulMessageValue ); + break; + + default : sprintf( cBuffer, "Unknown message" ); + break; + } + + /* Output the message that was placed into the cBuffer array within the + switch statement above, then move onto the next line ready for the next + message to arrive on the queue. */ + halLcdPrintLine( cBuffer, ucLine, OVERWRITE_TEXT ); + ucLine++; + } +} +/*-----------------------------------------------------------*/ + +static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue ) +{ + /* Just a utility function to convert a status value into a meaningful + string for output onto the LCD. */ + switch( lStatusValue ) + { + case pdPASS : sprintf( pcBuffer, "Status = PASS" ); + break; + case mainERROR_DYNAMIC_TASKS : sprintf( pcBuffer, "Err: Dynamic tsks" ); + break; + case mainERROR_COM_TEST : sprintf( pcBuffer, "Err: COM test" ); + break; + case mainERROR_GEN_QUEUE_TEST : sprintf( pcBuffer, "Error: Gen Q test" ); + break; + case mainERROR_REG_TEST : sprintf( pcBuffer, "Error: Reg test" ); + break; + default : sprintf( pcBuffer, "Unknown status" ); + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvButtonPollTask( void *pvParameters ) +{ +unsigned char ucLastState = pdFALSE, ucState; +xQueueMessage xMessage; + + /* This tasks performs the button polling functionality as described at the + top of this file. */ + for( ;; ) + { + /* Check the button state. */ + ucState = ( halButtonsPressed() & BUTTON_UP ); + + if( ucState != 0 ) + { + /* The button was pressed. */ + ucState = pdTRUE; + } + + if( ucState != ucLastState ) + { + /* The state has changed, send a message to the LCD task. */ + xMessage.cMessageID = mainMESSAGE_BUTTON_UP; + xMessage.ulMessageValue = ( unsigned long ) ucState; + ucLastState = ucState; + xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY ); + } + + /* Block for 10 milliseconds so this task does not utilise all the CPU + time and debouncing of the button is not necessary. */ + vTaskDelay( 10 / portTICK_RATE_MS ); + } +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ +/* Convert a Hz value to a KHz value, as required by the Init_FLL_Settle() +function. */ +unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL ); + + taskDISABLE_INTERRUPTS(); + + /* Disable the watchdog. */ + WDTCTL = WDTPW + WDTHOLD; + + halBoardInit(); + + LFXT_Start( XT1DRIVE_0 ); + Init_FLL_Settle( ( unsigned short ) ulCPU_Clock_KHz, 488 ); + + halButtonsInit( BUTTON_ALL ); + halButtonsInterruptEnable( BUTTON_SELECT ); + + /* Initialise the LCD, but note that the backlight is not used as the + library function uses timer A0 to modulate the backlight, and this file + defines vApplicationSetupTimerInterrupt() to also use timer A0 to generate + the tick interrupt. If the backlight is required, then change either the + halLCD library or vApplicationSetupTimerInterrupt() to use a different + timer. Timer A1 is used for the run time stats time base6. */ + halLcdInit(); + halLcdSetContrast( 100 ); + halLcdClearScreen(); + + halLcdPrintLine( " www.FreeRTOS.org", 0, OVERWRITE_TEXT ); +} +/*-----------------------------------------------------------*/ + +void vApplicationTickHook( void ) +{ +static unsigned short usLastRegTest1Counter = 0, usLastRegTest2Counter = 0; +static unsigned long ulCounter = 0; +static const unsigned long ulCheckFrequency = 5000UL / portTICK_RATE_MS; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + +/* Define the status message that is sent to the LCD task. By default the +status is PASS. */ +static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS }; + + /* This is called from within the tick interrupt and performs the 'check' + functionality as described in the comments at the top of this file. + + Is it time to perform the 'check' functionality again? */ + ulCounter++; + if( ulCounter >= ulCheckFrequency ) + { + /* See if the standard demo tasks are executing as expected, changing + the message that is sent to the LCD task from PASS to an error code if + any tasks set reports an error. */ + if( xAreComTestTasksStillRunning() != pdPASS ) + { + xStatusMessage.ulMessageValue = mainERROR_COM_TEST; + } + + if( xAreDynamicPriorityTasksStillRunning() != pdPASS ) + { + xStatusMessage.ulMessageValue = mainERROR_DYNAMIC_TASKS; + } + + if( xAreGenericQueueTasksStillRunning() != pdPASS ) + { + xStatusMessage.ulMessageValue = mainERROR_GEN_QUEUE_TEST; + } + + /* Check the reg test tasks are still cycling. They will stop + incrementing their loop counters if they encounter an error. */ + if( usRegTest1Counter == usLastRegTest1Counter ) + { + xStatusMessage.ulMessageValue = mainERROR_REG_TEST; + } + + if( usRegTest2Counter == usLastRegTest2Counter ) + { + xStatusMessage.ulMessageValue = mainERROR_REG_TEST; + } + + usLastRegTest1Counter = usRegTest1Counter; + usLastRegTest2Counter = usRegTest2Counter; + + /* As this is the tick hook the lHigherPriorityTaskWoken parameter is not + needed (a context switch is going to be performed anyway), but it must + still be provided. */ + xQueueSendFromISR( xLCDQueue, &xStatusMessage, &xHigherPriorityTaskWoken ); + ulCounter = 0; + } + + /* Just periodically toggle an LED to show that the tick interrupt is + running. Note that this access LED_PORT_OUT in a non-atomic way, so tasks + that access the same port must do so from a critical section. */ + if( ( ulCounter & 0xff ) == 0 ) + { + if( ( LED_PORT_OUT & LED_1 ) == 0 ) + { + LED_PORT_OUT |= LED_1; + } + else + { + LED_PORT_OUT &= ~LED_1; + } + } +} +/*-----------------------------------------------------------*/ + +#pragma vector=PORT2_VECTOR +interrupt void prvSelectButtonInterrupt( void ) +{ +/* Define the message sent to the LCD task from this interrupt. */ +static const xQueueMessage xMessage = { mainMESSAGE_BUTTON_SEL, ( unsigned long ) "Select Interrupt" }; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* This is the interrupt handler for the joystick select button input. + The button has been pushed, write a message to the LCD via the LCD task. */ + xQueueSendFromISR( xLCDQueue, &xMessage, &xHigherPriorityTaskWoken ); + + P2IFG = 0; + + /* If writing to xLCDQueue caused a task to unblock, and the unblocked task + has a priority equal to or above the task that this interrupt interrupted, + then lHigherPriorityTaskWoken will have been set to pdTRUE internally within + xQueuesendFromISR(), and portEND_SWITCHING_ISR() will ensure that this + interrupt returns directly to the higher priority unblocked task. */ + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +/* The MSP430X port uses this callback function to configure its tick interrupt. +This allows the application to choose the tick interrupt source. +configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct +interrupt vector for the chosen tick interrupt source. This implementation of +vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this +case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */ +void vApplicationSetupTimerInterrupt( void ) +{ +const unsigned short usACLK_Frequency_Hz = 32768; + + /* Ensure the timer is stopped. */ + TA0CTL = 0; + + /* Run the timer from the ACLK. */ + TA0CTL = TASSEL_1; + + /* Clear everything to start with. */ + TA0CTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TA0CCR0 = usACLK_Frequency_Hz / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TA0CCTL0 = CCIE; + + /* Start up clean. */ + TA0CTL |= TACLR; + + /* Up mode. */ + TA0CTL |= MC_1; +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* Called on each iteration of the idle task. In this case the idle task + just enters a low(ish) power mode. */ + __bis_SR_register( LPM1_bits + GIE ); +} +/*-----------------------------------------------------------*/ + +void vApplicationMallocFailedHook( void ) +{ + /* Called if a call to pvPortMalloc() fails because there is insufficient + free memory available in the FreeRTOS heap. pvPortMalloc() is called + internally by FreeRTOS API functions that create tasks, queues or + semaphores. */ + taskDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ) +{ + ( void ) pxTask; + ( void ) pcTaskName; + + /* Run time stack overflow checking is performed if + configconfigCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook + function is called if a stack overflow is detected. */ + taskDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/serial.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/serial.c new file mode 100644 index 000000000..639a7a32b --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/serial.c @@ -0,0 +1,205 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + ***NOTE*** The exception to the GPL is included to allow you to distribute + a combined work that includes FreeRTOS without being obliged to provide the + source code for proprietary components outside of the FreeRTOS kernel. + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + + +/* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER. + * + * This is not a proper UART driver. It only supports one port, uses loopback + * mode, and is used to test interrupts that use the FreeRTOS API as part of + * a wider test suite. Nor is it intended to show an efficient implementation + * of a UART interrupt service routine as queues are used to pass individual + * characters one at a time! + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "queue.h" +#include "task.h" + +/* Demo application includes. */ +#include "serial.h" + +/* Misc. constants. */ +#define serNO_BLOCK ( ( portTickType ) 0 ) + +/* The queue used to hold received characters. */ +static xQueueHandle xRxedChars; + +/* The queue used to hold characters waiting transmission. */ +static xQueueHandle xCharsForTx; + +/*-----------------------------------------------------------*/ + +xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength ) +{ +unsigned portLONG ulBaudRateCount; + + /* Initialise the hardware. */ + + /* Generate the baud rate constants for the wanted baud rate. */ + ulBaudRateCount = configCPU_CLOCK_HZ / ulWantedBaud; + + portENTER_CRITICAL(); + { + /* Create the queues used by the com test task. */ + xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) ); + xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) ); + + /* Reset UART. */ + UCA1CTL1 |= UCSWRST; + + /* Use SMCLK. */ + UCA1CTL1 = UCSSEL0 | UCSSEL1; + + /* Setup baud rate low byte. */ + UCA1BR0 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff ); + + /* Setup baud rate high byte. */ + ulBaudRateCount >>= 8UL; + UCA1BR1 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff ); + + /* UCLISTEN sets loopback mode! */ + UCA1STAT = UCLISTEN; + + /* Enable interrupts. */ + UCA1IE |= UCRXIE; + + /* Take out of reset. */ + UCA1CTL1 &= ~UCSWRST; + } + portEXIT_CRITICAL(); + + /* Note the comments at the top of this file about this not being a generic + UART driver. */ + return NULL; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime ) +{ + /* Get the next character from the buffer. Return false if no characters + are available, or arrive before xBlockTime expires. */ + if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) ) + { + return pdTRUE; + } + else + { + return pdFALSE; + } +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime ) +{ +signed portBASE_TYPE xReturn; + + /* Send the next character to the queue of characters waiting transmission, + then enable the UART Tx interrupt, just in case UART transmission has already + completed and switched itself off. */ + xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime ); + UCA1IE |= UCTXIE; + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#pragma vector=USCI_A1_VECTOR +interrupt void prvUSCI_A0_ISR( void ) +{ +signed portCHAR cChar; +portBASE_TYPE xTaskWoken = pdFALSE; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + while( ( UCA1IFG & UCRXIFG ) != 0 ) + { + /* Get the character from the UART and post it on the queue of Rxed + characters. */ + cChar = UCA1RXBUF; + xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken ); + } + + /* If there is a Tx interrupt pending and the tx interrupts are enabled. */ + if( ( UCA1IFG & UCTXIFG ) != 0 ) + { + /* The previous character has been transmitted. See if there are any + further characters waiting transmission. */ + if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWoken ) == pdTRUE ) + { + /* There was another character queued - transmit it now. */ + UCA1TXBUF = cChar; + } + else + { + /* There were no other characters to transmit - disable the Tx + interrupt. */ + UCA1IE &= ~UCTXIE; + } + } + + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + + /* If writing to a queue caused a task to unblock, and the unblocked task + has a priority equal to or above the task that this interrupt interrupted, + then lHigherPriorityTaskWoken will have been set to pdTRUE internally within + xQueuesendFromISR(), and portEND_SWITCHING_ISR() will ensure that this + interrupt returns directly to the higher priority unblocked task. + + THIS MUST BE THE LAST THING DONE IN THE ISR. */ + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); +} + + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/MSP430F5438A.ccxml b/Demo/MSP430X_MSP430F5438_CCS4/MSP430F5438A.ccxml new file mode 100644 index 000000000..ab962b6ab --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/MSP430F5438A.ccxml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Demo/MSP430X_MSP430F5438_CCS4/lnk_msp430f5438a.cmd b/Demo/MSP430X_MSP430F5438_CCS4/lnk_msp430f5438a.cmd new file mode 100644 index 000000000..449f775c5 --- /dev/null +++ b/Demo/MSP430X_MSP430F5438_CCS4/lnk_msp430f5438a.cmd @@ -0,0 +1,197 @@ +/******************************************************************************/ +/* lnk_msp430f5438a.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5438A PROGRAMS */ +/* */ +/* Usage: lnk430 -o -m lnk.cmd */ +/* cl430 -z -o -m lnk.cmd */ +/* */ +/*----------------------------------------------------------------------------*/ +/* These linker options are for command line linking only. For IDE linking, */ +/* you should set your linker options in Project Properties */ +/* -c LINK USING C CONVENTIONS */ +/* -stack 0x0100 SOFTWARE STACK SIZE */ +/* -heap 0x0100 HEAP AREA SIZE */ +/* */ +/*----------------------------------------------------------------------------*/ + + +/****************************************************************************/ +/* SPECIFY THE SYSTEM MEMORY MAP */ +/****************************************************************************/ + +MEMORY +{ + SFR : origin = 0x0000, length = 0x0010 + PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0 + PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100 + RAM : origin = 0x1C00, length = 0x4000 + INFOA : origin = 0x1980, length = 0x0080 + INFOB : origin = 0x1900, length = 0x0080 + INFOC : origin = 0x1880, length = 0x0080 + INFOD : origin = 0x1800, length = 0x0080 + FLASH : origin = 0x5C00, length = 0xA380 + FLASH2 : origin = 0x10000,length = 0x35C00 + INT00 : origin = 0xFF80, length = 0x0002 + INT01 : origin = 0xFF82, length = 0x0002 + INT02 : origin = 0xFF84, length = 0x0002 + INT03 : origin = 0xFF86, length = 0x0002 + INT04 : origin = 0xFF88, length = 0x0002 + INT05 : origin = 0xFF8A, length = 0x0002 + INT06 : origin = 0xFF8C, length = 0x0002 + INT07 : origin = 0xFF8E, length = 0x0002 + INT08 : origin = 0xFF90, length = 0x0002 + INT09 : origin = 0xFF92, length = 0x0002 + INT10 : origin = 0xFF94, length = 0x0002 + INT11 : origin = 0xFF96, length = 0x0002 + INT12 : origin = 0xFF98, length = 0x0002 + INT13 : origin = 0xFF9A, length = 0x0002 + INT14 : origin = 0xFF9C, length = 0x0002 + INT15 : origin = 0xFF9E, length = 0x0002 + INT16 : origin = 0xFFA0, length = 0x0002 + INT17 : origin = 0xFFA2, length = 0x0002 + INT18 : origin = 0xFFA4, length = 0x0002 + INT19 : origin = 0xFFA6, length = 0x0002 + INT20 : origin = 0xFFA8, length = 0x0002 + INT21 : origin = 0xFFAA, length = 0x0002 + INT22 : origin = 0xFFAC, length = 0x0002 + INT23 : origin = 0xFFAE, length = 0x0002 + INT24 : origin = 0xFFB0, length = 0x0002 + INT25 : origin = 0xFFB2, length = 0x0002 + INT26 : origin = 0xFFB4, length = 0x0002 + INT27 : origin = 0xFFB6, length = 0x0002 + INT28 : origin = 0xFFB8, length = 0x0002 + INT29 : origin = 0xFFBA, length = 0x0002 + INT30 : origin = 0xFFBC, length = 0x0002 + INT31 : origin = 0xFFBE, length = 0x0002 + INT32 : origin = 0xFFC0, length = 0x0002 + INT33 : origin = 0xFFC2, length = 0x0002 + INT34 : origin = 0xFFC4, length = 0x0002 + INT35 : origin = 0xFFC6, length = 0x0002 + INT36 : origin = 0xFFC8, length = 0x0002 + INT37 : origin = 0xFFCA, length = 0x0002 + INT38 : origin = 0xFFCC, length = 0x0002 + INT39 : origin = 0xFFCE, length = 0x0002 + INT40 : origin = 0xFFD0, length = 0x0002 + INT41 : origin = 0xFFD2, length = 0x0002 + INT42 : origin = 0xFFD4, length = 0x0002 + INT43 : origin = 0xFFD6, length = 0x0002 + INT44 : origin = 0xFFD8, length = 0x0002 + INT45 : origin = 0xFFDA, length = 0x0002 + INT46 : origin = 0xFFDC, length = 0x0002 + INT47 : origin = 0xFFDE, length = 0x0002 + INT48 : origin = 0xFFE0, length = 0x0002 + INT49 : origin = 0xFFE2, length = 0x0002 + INT50 : origin = 0xFFE4, length = 0x0002 + INT51 : origin = 0xFFE6, length = 0x0002 + INT52 : origin = 0xFFE8, length = 0x0002 + INT53 : origin = 0xFFEA, length = 0x0002 + INT54 : origin = 0xFFEC, length = 0x0002 + INT55 : origin = 0xFFEE, length = 0x0002 + INT56 : origin = 0xFFF0, length = 0x0002 + INT57 : origin = 0xFFF2, length = 0x0002 + INT58 : origin = 0xFFF4, length = 0x0002 + INT59 : origin = 0xFFF6, length = 0x0002 + INT60 : origin = 0xFFF8, length = 0x0002 + INT61 : origin = 0xFFFA, length = 0x0002 + INT62 : origin = 0xFFFC, length = 0x0002 + RESET : origin = 0xFFFE, length = 0x0002 +} + +/****************************************************************************/ +/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */ +/****************************************************************************/ + +SECTIONS +{ + .bss : {} > RAM /* GLOBAL & STATIC VARS */ + .sysmem : {} > RAM /* DYNAMIC MEMORY ALLOCATION AREA */ + .stack : {} > RAM (HIGH) /* SOFTWARE SYSTEM STACK */ + + .text : {}>> FLASH | FLASH2 /* CODE */ + .text:_isr : {} > FLASH /* ISR CODE SPACE */ + .cinit : {} > FLASH /* INITIALIZATION TABLES */ +//#ifdef (__LARGE_DATA_MODEL__) + .const : {} > FLASH | FLASH2 /* CONSTANT DATA */ +//#else +// .const : {} > FLASH /* CONSTANT DATA */ +//#endif + .cio : {} > RAM /* C I/O BUFFER */ + + .pinit : {} > FLASH /* C++ CONSTRUCTOR TABLES */ + + .infoA : {} > INFOA /* MSP430 INFO FLASH MEMORY SEGMENTS */ + .infoB : {} > INFOB + .infoC : {} > INFOC + .infoD : {} > INFOD + + .int00 : {} > INT00 /* MSP430 INTERRUPT VECTORS */ + .int01 : {} > INT01 + .int02 : {} > INT02 + .int03 : {} > INT03 + .int04 : {} > INT04 + .int05 : {} > INT05 + .int06 : {} > INT06 + .int07 : {} > INT07 + .int08 : {} > INT08 + .int09 : {} > INT09 + .int10 : {} > INT10 + .int11 : {} > INT11 + .int12 : {} > INT12 + .int13 : {} > INT13 + .int14 : {} > INT14 + .int15 : {} > INT15 + .int16 : {} > INT16 + .int17 : {} > INT17 + .int18 : {} > INT18 + .int19 : {} > INT19 + .int20 : {} > INT20 + .int21 : {} > INT21 + .int22 : {} > INT22 + .int23 : {} > INT23 + .int24 : {} > INT24 + .int25 : {} > INT25 + .int26 : {} > INT26 + .int27 : {} > INT27 + .int28 : {} > INT28 + .int29 : {} > INT29 + .int30 : {} > INT30 + .int31 : {} > INT31 + .int32 : {} > INT32 + .int33 : {} > INT33 + .int34 : {} > INT34 + .int35 : {} > INT35 + .int36 : {} > INT36 + .int37 : {} > INT37 + .int38 : {} > INT38 + .int39 : {} > INT39 + .int40 : {} > INT40 + .int41 : {} > INT41 + .int42 : {} > INT42 + .int43 : {} > INT43 + .int44 : {} > INT44 + .int45 : {} > INT45 + .int46 : {} > INT46 + .int47 : {} > INT47 + .int48 : {} > INT48 + .int49 : {} > INT49 + .int50 : {} > INT50 + .int51 : {} > INT51 + .int52 : {} > INT52 + .int53 : {} > INT53 + .int54 : {} > INT54 + .int55 : {} > INT55 + .int56 : {} > INT56 + .int57 : {} > INT57 + .int58 : {} > INT58 + .int59 : {} > INT59 + .int60 : {} > INT60 + .int61 : {} > INT61 + .int62 : {} > INT62 + .reset : {} > RESET /* MSP430 RESET VECTOR */ +} + +/****************************************************************************/ +/* INCLUDE PERIPHERALS MEMORY MAP */ +/****************************************************************************/ + +-l msp430f5438a.cmd +