mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-02 04:13:54 -04:00
Add FreeRTOS-Plus directory.
This commit is contained in:
parent
7bd5f21ad5
commit
f508a5f653
6798 changed files with 134949 additions and 19 deletions
|
@ -0,0 +1,248 @@
|
|||
/*******************************************************************************
|
||||
*
|
||||
* HAL_PMM.c
|
||||
* Power Management Module Library for MSP430F5xx/6xx family
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include "msp430.h"
|
||||
#include "HAL_PMM.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* \brief Increase Vcore by one level
|
||||
*
|
||||
* \param level Level to which Vcore needs to be increased
|
||||
* \return status Success/failure
|
||||
******************************************************************************/
|
||||
|
||||
static uint16_t SetVCoreUp(uint8_t level)
|
||||
{
|
||||
uint16_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup;
|
||||
|
||||
// The code flow for increasing the Vcore has been altered to work around
|
||||
// the erratum FLASH37.
|
||||
// Please refer to the Errata sheet to know if a specific device is affected
|
||||
// DO NOT ALTER THIS FUNCTION
|
||||
|
||||
// Open PMM registers for write access
|
||||
PMMCTL0_H = 0xA5;
|
||||
|
||||
// Disable dedicated Interrupts
|
||||
// Backup all registers
|
||||
PMMRIE_backup = PMMRIE;
|
||||
PMMRIE &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE | SVSLPE | SVMHVLRIE |
|
||||
SVMHIE | SVSMHDLYIE | SVMLVLRIE | SVMLIE | SVSMLDLYIE);
|
||||
SVSMHCTL_backup = SVSMHCTL;
|
||||
SVSMLCTL_backup = SVSMLCTL;
|
||||
|
||||
// Clear flags
|
||||
PMMIFG = 0;
|
||||
|
||||
// Set SVM highside to new level and check if a VCore increase is possible
|
||||
SVSMHCTL = SVMHE | SVSHE | (SVSMHRRL0 * level);
|
||||
|
||||
// Wait until SVM highside is settled
|
||||
while ((PMMIFG & SVSMHDLYIFG) == 0) ;
|
||||
|
||||
// Clear flag
|
||||
PMMIFG &= ~SVSMHDLYIFG;
|
||||
|
||||
// Check if a VCore increase is possible
|
||||
if ((PMMIFG & SVMHIFG) == SVMHIFG){ // -> Vcc is too low for a Vcore increase
|
||||
// recover the previous settings
|
||||
PMMIFG &= ~SVSMHDLYIFG;
|
||||
SVSMHCTL = SVSMHCTL_backup;
|
||||
|
||||
// Wait until SVM highside is settled
|
||||
while ((PMMIFG & SVSMHDLYIFG) == 0) ;
|
||||
|
||||
// Clear all Flags
|
||||
PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG);
|
||||
|
||||
PMMRIE = PMMRIE_backup; // Restore PMM interrupt enable register
|
||||
PMMCTL0_H = 0x00; // Lock PMM registers for write access
|
||||
return PMM_STATUS_ERROR; // return: voltage not set
|
||||
}
|
||||
|
||||
// Set also SVS highside to new level
|
||||
// Vcc is high enough for a Vcore increase
|
||||
SVSMHCTL |= (SVSHRVL0 * level);
|
||||
|
||||
// Wait until SVM highside is settled
|
||||
while ((PMMIFG & SVSMHDLYIFG) == 0) ;
|
||||
|
||||
// Clear flag
|
||||
PMMIFG &= ~SVSMHDLYIFG;
|
||||
|
||||
// Set VCore to new level
|
||||
PMMCTL0_L = PMMCOREV0 * level;
|
||||
|
||||
// Set SVM, SVS low side to new level
|
||||
SVSMLCTL = SVMLE | (SVSMLRRL0 * level) | SVSLE | (SVSLRVL0 * level);
|
||||
|
||||
// Wait until SVM, SVS low side is settled
|
||||
while ((PMMIFG & SVSMLDLYIFG) == 0) ;
|
||||
|
||||
// Clear flag
|
||||
PMMIFG &= ~SVSMLDLYIFG;
|
||||
// SVS, SVM core and high side are now set to protect for the new core level
|
||||
|
||||
// Restore Low side settings
|
||||
// Clear all other bits _except_ level settings
|
||||
SVSMLCTL &= (SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
|
||||
|
||||
// Clear level settings in the backup register,keep all other bits
|
||||
SVSMLCTL_backup &= ~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
|
||||
|
||||
// Restore low-side SVS monitor settings
|
||||
SVSMLCTL |= SVSMLCTL_backup;
|
||||
|
||||
// Restore High side settings
|
||||
// Clear all other bits except level settings
|
||||
SVSMHCTL &= (SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
|
||||
|
||||
// Clear level settings in the backup register,keep all other bits
|
||||
SVSMHCTL_backup &= ~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
|
||||
|
||||
// Restore backup
|
||||
SVSMHCTL |= SVSMHCTL_backup;
|
||||
|
||||
// Wait until high side, low side settled
|
||||
while (((PMMIFG & SVSMLDLYIFG) == 0) && ((PMMIFG & SVSMHDLYIFG) == 0)) ;
|
||||
|
||||
// Clear all Flags
|
||||
PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG);
|
||||
|
||||
PMMRIE = PMMRIE_backup; // Restore PMM interrupt enable register
|
||||
PMMCTL0_H = 0x00; // Lock PMM registers for write access
|
||||
|
||||
return PMM_STATUS_OK;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* \brief Decrease Vcore by one level
|
||||
*
|
||||
* \param level Level to which Vcore needs to be decreased
|
||||
* \return status Success/failure
|
||||
******************************************************************************/
|
||||
|
||||
static uint16_t SetVCoreDown(uint8_t level)
|
||||
{
|
||||
uint16_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup;
|
||||
|
||||
// The code flow for decreasing the Vcore has been altered to work around
|
||||
// the erratum FLASH37.
|
||||
// Please refer to the Errata sheet to know if a specific device is affected
|
||||
// DO NOT ALTER THIS FUNCTION
|
||||
|
||||
// Open PMM registers for write access
|
||||
PMMCTL0_H = 0xA5;
|
||||
|
||||
// Disable dedicated Interrupts
|
||||
// Backup all registers
|
||||
PMMRIE_backup = PMMRIE;
|
||||
PMMRIE &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE | SVSLPE | SVMHVLRIE |
|
||||
SVMHIE | SVSMHDLYIE | SVMLVLRIE | SVMLIE | SVSMLDLYIE);
|
||||
SVSMHCTL_backup = SVSMHCTL;
|
||||
SVSMLCTL_backup = SVSMLCTL;
|
||||
|
||||
// Clear flags
|
||||
PMMIFG &= ~(SVMHIFG | SVSMHDLYIFG | SVMLIFG | SVSMLDLYIFG);
|
||||
|
||||
// Set SVM, SVS high & low side to new settings in normal mode
|
||||
SVSMHCTL = SVMHE | (SVSMHRRL0 * level) | SVSHE | (SVSHRVL0 * level);
|
||||
SVSMLCTL = SVMLE | (SVSMLRRL0 * level) | SVSLE | (SVSLRVL0 * level);
|
||||
|
||||
// Wait until SVM high side and SVM low side is settled
|
||||
while ((PMMIFG & SVSMHDLYIFG) == 0 || (PMMIFG & SVSMLDLYIFG) == 0) ;
|
||||
|
||||
// Clear flags
|
||||
PMMIFG &= ~(SVSMHDLYIFG + SVSMLDLYIFG);
|
||||
// SVS, SVM core and high side are now set to protect for the new core level
|
||||
|
||||
// Set VCore to new level
|
||||
PMMCTL0_L = PMMCOREV0 * level;
|
||||
|
||||
// Restore Low side settings
|
||||
// Clear all other bits _except_ level settings
|
||||
SVSMLCTL &= (SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
|
||||
|
||||
// Clear level settings in the backup register,keep all other bits
|
||||
SVSMLCTL_backup &= ~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
|
||||
|
||||
// Restore low-side SVS monitor settings
|
||||
SVSMLCTL |= SVSMLCTL_backup;
|
||||
|
||||
// Restore High side settings
|
||||
// Clear all other bits except level settings
|
||||
SVSMHCTL &= (SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
|
||||
|
||||
// Clear level settings in the backup register, keep all other bits
|
||||
SVSMHCTL_backup &= ~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
|
||||
|
||||
// Restore backup
|
||||
SVSMHCTL |= SVSMHCTL_backup;
|
||||
|
||||
// Wait until high side, low side settled
|
||||
while (((PMMIFG & SVSMLDLYIFG) == 0) && ((PMMIFG & SVSMHDLYIFG) == 0)) ;
|
||||
|
||||
// Clear all Flags
|
||||
PMMIFG &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG);
|
||||
|
||||
PMMRIE = PMMRIE_backup; // Restore PMM interrupt enable register
|
||||
PMMCTL0_H = 0x00; // Lock PMM registers for write access
|
||||
return PMM_STATUS_OK; // Return: OK
|
||||
}
|
||||
|
||||
uint16_t SetVCore(uint8_t level)
|
||||
{
|
||||
uint16_t actlevel;
|
||||
uint16_t status = 0;
|
||||
|
||||
level &= PMMCOREV_3; // Set Mask for Max. level
|
||||
actlevel = (PMMCTL0 & PMMCOREV_3); // Get actual VCore
|
||||
// step by step increase or decrease
|
||||
while ((level != actlevel) && (status == 0)) {
|
||||
if (level > actlevel){
|
||||
status = SetVCoreUp(++actlevel);
|
||||
}
|
||||
else {
|
||||
status = SetVCoreDown(--actlevel);
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
/*******************************************************************************
|
||||
*
|
||||
* HAL_PMM.h
|
||||
* Power Management Module Library for MSP430F5xx/6xx family
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef HAL_PMM_H
|
||||
#define HAL_PMM_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "HAL_MACROS.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* Macros
|
||||
******************************************************************************/
|
||||
#define ENABLE_SVSL() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVSLE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVSL() st(PMMCTL0_H = 0xA5; SVSMLCTL &= ~SVSLE; PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVMLE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL &= ~SVMLE; PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVSH() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVSHE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVSH() st(PMMCTL0_H = 0xA5; SVSMHCTL &= ~SVSHE; PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVMHE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL &= ~SVMHE; PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVSL_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL |= (SVSLE + SVMLE); PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVSL_SVML() st(PMMCTL0_H = 0xA5; SVSMLCTL &= ~(SVSLE + SVMLE); PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVSH_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL |= (SVSHE + SVMHE); PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVSH_SVMH() st(PMMCTL0_H = 0xA5; SVSMHCTL &= ~(SVSHE + SVMHE); PMMCTL0_H = 0x00; )
|
||||
|
||||
#define ENABLE_SVSL_RESET() st(PMMCTL0_H = 0xA5; PMMRIE |= SVSLPE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVSL_RESET() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVSLPE; PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVML_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE |= SVMLIE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVML_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVMLIE; PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVSH_RESET() st(PMMCTL0_H = 0xA5; PMMRIE |= SVSHPE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVSH_RESET() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVSHPE; PMMCTL0_H = 0x00; )
|
||||
#define ENABLE_SVMH_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE |= SVMHIE; PMMCTL0_H = 0x00; )
|
||||
#define DISABLE_SVMH_INTERRUPT() st(PMMCTL0_H = 0xA5; PMMRIE &= ~SVMHIE; PMMCTL0_H = 0x00; )
|
||||
#define CLEAR_PMM_IFGS() st(PMMCTL0_H = 0xA5; PMMIFG = 0; PMMCTL0_H = 0x00; )
|
||||
|
||||
// These settings use SVSH/LACE = 0
|
||||
#define SVSL_ENABLED_IN_LPM_FAST_WAKE() st( \
|
||||
PMMCTL0_H = 0xA5; SVSMLCTL |= (SVSLFP + SVSLMD); SVSMLCTL &= ~SVSMLACE; PMMCTL0_H = 0x00; )
|
||||
#define SVSL_ENABLED_IN_LPM_SLOW_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVSLMD; SVSMLCTL &= \
|
||||
~(SVSLFP + SVSMLACE); PMMCTL0_H = 0x00; )
|
||||
|
||||
#define SVSL_DISABLED_IN_LPM_FAST_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL |= SVSLFP; SVSMLCTL &= \
|
||||
~(SVSLMD + SVSMLACE); PMMCTL0_H = 0x00; )
|
||||
#define SVSL_DISABLED_IN_LPM_SLOW_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL &= \
|
||||
~(SVSLFP + SVSMLACE + SVSLMD); PMMCTL0_H = 0x00; )
|
||||
|
||||
#define SVSH_ENABLED_IN_LPM_NORM_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVSHMD; SVSMHCTL &= \
|
||||
~(SVSMHACE + SVSHFP); PMMCTL0_H = 0x00; )
|
||||
#define SVSH_ENABLED_IN_LPM_FULL_PERF() st( \
|
||||
PMMCTL0_H = 0xA5; SVSMHCTL |= (SVSHMD + SVSHFP); SVSMHCTL &= ~SVSMHACE; PMMCTL0_H = 0x00; )
|
||||
|
||||
#define SVSH_DISABLED_IN_LPM_NORM_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL &= \
|
||||
~(SVSMHACE + SVSHFP + SVSHMD); PMMCTL0_H = 0x00; )
|
||||
#define SVSH_DISABLED_IN_LPM_FULL_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL |= SVSHFP; SVSMHCTL &= \
|
||||
~(SVSMHACE + SVSHMD); PMMCTL0_H = 0x00; )
|
||||
|
||||
// These setting use SVSH/LACE = 1
|
||||
#define SVSL_OPTIMIZED_IN_LPM_FAST_WAKE() st(PMMCTL0_H = 0xA5; SVSMLCTL |= \
|
||||
(SVSLFP + SVSLMD + SVSMLACE); PMMCTL0_H = 0x00; )
|
||||
#define SVSH_OPTIMIZED_IN_LPM_FULL_PERF() st(PMMCTL0_H = 0xA5; SVSMHCTL |= \
|
||||
(SVSHMD + SVSHFP + SVSMHACE); PMMCTL0_H = 0x00; )
|
||||
|
||||
/*******************************************************************************
|
||||
* Defines
|
||||
******************************************************************************/
|
||||
#define PMM_STATUS_OK 0
|
||||
#define PMM_STATUS_ERROR 1
|
||||
|
||||
/*******************************************************************************
|
||||
* \brief Set Vcore to expected level
|
||||
*
|
||||
* \param level Level to which Vcore needs to be increased/decreased
|
||||
* \return status Success/failure
|
||||
******************************************************************************/
|
||||
extern uint16_t SetVCore(uint8_t level);
|
||||
|
||||
#endif /* HAL_PMM_H */
|
|
@ -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()
|
|
@ -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 <stdint.h>
|
||||
#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 */
|
|
@ -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)
|
168
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/FreeRTOSConfig.h
Normal file
168
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/FreeRTOSConfig.h
Normal file
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and 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 modification 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!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong? *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, training, latest information,
|
||||
license and contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool.
|
||||
|
||||
Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
|
||||
the code with commercial support, indemnification, and middleware, under
|
||||
the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
|
||||
provide a safety engineered and independently SIL3 certified version under
|
||||
the SafeRTOS brand: http://www.SafeRTOS.com.
|
||||
*/
|
||||
|
||||
#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 ( 25000000UL )
|
||||
#define configLFXT_CLOCK_HZ ( 32768L )
|
||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 10 * 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 1
|
||||
#define configCHECK_FOR_STACK_OVERFLOW 2
|
||||
#define configUSE_RECURSIVE_MUTEXES 0
|
||||
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||
#define configUSE_APPLICATION_TASK_TAG 0
|
||||
|
||||
#if __DATA_MODEL__ == __DATA_MODEL_SMALL__
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 110 )
|
||||
#else
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 80 )
|
||||
#endif
|
||||
|
||||
/* 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_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__VECTOR is set to TIMER0_A0_VECTOR. */
|
||||
#define configTICK_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 volatile unsigned long ulStatsOverflowCount;
|
||||
#endif /* __ICCARM__ */
|
||||
|
||||
/* Configure a 16 bit timer to generate the time base for the run time stats.
|
||||
The timer is configured to interrupt each time it overflows so a count of
|
||||
overflows can be kept - that way a 32 bit time value can be constructed from
|
||||
the timers current count value and the number of overflows. */
|
||||
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()
|
||||
|
||||
/* Construct a 32 bit time value for use as the run time stats time base. This
|
||||
comes from the current value of a 16 bit timer combined with the number of times
|
||||
the timer has overflowed. */
|
||||
#define portALT_GET_RUN_TIME_COUNTER_VALUE( ulCountValue ) \
|
||||
{ \
|
||||
/* Stop the counter counting temporarily. */ \
|
||||
TA1CTL &= ~MC__CONTINOUS; \
|
||||
\
|
||||
/* Check to see if any counter overflow interrupts are pending. */ \
|
||||
if( ( TA1CTL & TAIFG ) != 0 ) \
|
||||
{ \
|
||||
/* An overflow has occurred but not yet been processed. */ \
|
||||
ulStatsOverflowCount++; \
|
||||
\
|
||||
/* Clear the interrupt. */ \
|
||||
TA1CTL &= ~TAIFG; \
|
||||
} \
|
||||
\
|
||||
/* Generate a 32 bit counter value by combinging the current peripheral \
|
||||
counter value with the number of overflows. */ \
|
||||
ulCountValue = ( ulStatsOverflowCount << 16UL ); \
|
||||
ulCountValue |= ( unsigned long ) TA1R; \
|
||||
TA1CTL |= MC__CONTINOUS; \
|
||||
}
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
/*******************************************************************************
|
||||
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"
|
||||
#include "hal_pmm.h"
|
||||
|
||||
#endif /* HAL_MSP_EXP430F5438_H */
|
|
@ -0,0 +1,108 @@
|
|||
/**
|
||||
* @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;
|
||||
}
|
||||
|
||||
/**********************************************************************//**
|
||||
* @brief Set function for MCLK frequency.
|
||||
*
|
||||
*
|
||||
* @return none
|
||||
*************************************************************************/
|
||||
void hal430SetSystemClock(unsigned long req_clock_rate, unsigned long ref_clock_rate)
|
||||
{
|
||||
/* Convert a Hz value to a KHz value, as required
|
||||
* by the Init_FLL_Settle() function. */
|
||||
unsigned long ulCPU_Clock_KHz = req_clock_rate / 1000UL;
|
||||
|
||||
//Make sure we aren't overclocking
|
||||
if(ulCPU_Clock_KHz > 25000L)
|
||||
{
|
||||
ulCPU_Clock_KHz = 25000L;
|
||||
}
|
||||
|
||||
//Set VCore to a level sufficient for the requested clock speed.
|
||||
if(ulCPU_Clock_KHz <= 8000L)
|
||||
{
|
||||
SetVCore(PMMCOREV_0);
|
||||
}
|
||||
else if(ulCPU_Clock_KHz <= 12000L)
|
||||
{
|
||||
SetVCore(PMMCOREV_1);
|
||||
}
|
||||
else if(ulCPU_Clock_KHz <= 20000L)
|
||||
{
|
||||
SetVCore(PMMCOREV_2);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVCore(PMMCOREV_3);
|
||||
}
|
||||
|
||||
//Set the DCO
|
||||
Init_FLL_Settle( ( unsigned short )ulCPU_Clock_KHz, req_clock_rate / ref_clock_rate );
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/**********************************************************************//**
|
||||
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);
|
||||
void hal430SetSystemClock(unsigned long req_clock_rate, unsigned long ref_clock_rate);
|
||||
|
||||
#endif /* HAL_BOARD_H */
|
|
@ -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;
|
||||
}
|
|
@ -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 */
|
1122
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.c
Normal file
1122
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/MSP-EXP430F5438_HAL/hal_lcd.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -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 */
|
|
@ -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,
|
||||
} ;
|
|
@ -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 */
|
157
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/ParTest.c
Normal file
157
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/ParTest.c
Normal file
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and 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 modification 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!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong? *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, training, latest information,
|
||||
license and contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool.
|
||||
|
||||
Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
|
||||
the code with commercial support, indemnification, and middleware, under
|
||||
the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
|
||||
provide a safety engineered and independently SIL3 certified version under
|
||||
the SafeRTOS brand: http://www.SafeRTOS.com.
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* 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();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
1471
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewd
Normal file
1471
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewd
Normal file
File diff suppressed because it is too large
Load diff
3883
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewp
Normal file
3883
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.ewp
Normal file
File diff suppressed because it is too large
Load diff
10
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.eww
Normal file
10
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RTOSDemo.eww
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\RTOSDemo.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
210
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RegTest.s43
Normal file
210
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RegTest.s43
Normal file
|
@ -0,0 +1,210 @@
|
|||
/*
|
||||
FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and 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 modification 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!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong? *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, training, latest information,
|
||||
license and contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool.
|
||||
|
||||
Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
|
||||
the code with commercial support, indemnification, and middleware, under
|
||||
the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
|
||||
provide a safety engineered and independently SIL3 certified version under
|
||||
the SafeRTOS brand: http://www.SafeRTOS.com.
|
||||
*/
|
||||
#include "msp430.h"
|
||||
#include "FreeRTOSConfig.h"
|
||||
#include "data_model.h"
|
||||
|
||||
/*
|
||||
* The definition of the "register test" tasks, as described at the top of
|
||||
* main.c
|
||||
*/
|
||||
|
||||
|
||||
|
||||
IMPORT usRegTest1Counter
|
||||
IMPORT usRegTest2Counter
|
||||
IMPORT vPortYield
|
||||
|
||||
EXPORT vRegTest1Task
|
||||
EXPORT vRegTest2Task
|
||||
|
||||
RSEG CODE
|
||||
|
||||
EVEN
|
||||
|
||||
vRegTest1Task:
|
||||
|
||||
/* Fill each general purpose register with a known value. */
|
||||
mov_x #0x4444, r4
|
||||
mov_x #0x5555, r5
|
||||
mov_x #0x6666, r6
|
||||
mov_x #0x7777, r7
|
||||
mov_x #0x8888, r8
|
||||
mov_x #0x9999, r9
|
||||
mov_x #0xaaaa, r10
|
||||
mov_x #0xbbbb, r11
|
||||
mov_x #0xcccc, r12
|
||||
mov_x #0xdddd, r13
|
||||
mov_x #0xeeee, r14
|
||||
mov_x #0xffff, 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. */
|
||||
cmp_x #0x4444, r4
|
||||
jne vRegTest1Error
|
||||
cmp_x #0x5555, r5
|
||||
jne vRegTest1Error
|
||||
cmp_x #0x6666, r6
|
||||
jne vRegTest1Error
|
||||
cmp_x #0x7777, r7
|
||||
jne vRegTest1Error
|
||||
cmp_x #0x8888, r8
|
||||
jne vRegTest1Error
|
||||
cmp_x #0x9999, r9
|
||||
jne vRegTest1Error
|
||||
cmp_x #0xaaaa, r10
|
||||
jne vRegTest1Error
|
||||
cmp_x #0xbbbb, r11
|
||||
jne vRegTest1Error
|
||||
cmp_x #0xcccc, r12
|
||||
jne vRegTest1Error
|
||||
cmp_x #0xdddd, r13
|
||||
jne vRegTest1Error
|
||||
cmp_x #0xeeee, r14
|
||||
jne vRegTest1Error
|
||||
cmp_x #0xffff, 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
|
||||
|
||||
|
||||
EVEN
|
||||
|
||||
vRegTest1Error:
|
||||
jmp vRegTest1Error
|
||||
nop
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* See the comments in vRegTest1Task. This task is the same, it just uses
|
||||
different values in its registers. */
|
||||
vRegTest2Task:
|
||||
|
||||
mov_x #0x4441, r4
|
||||
mov_x #0x5551, r5
|
||||
mov_x #0x6661, r6
|
||||
mov_x #0x7771, r7
|
||||
mov_x #0x8881, r8
|
||||
mov_x #0x9991, r9
|
||||
mov_x #0xaaa1, r10
|
||||
mov_x #0xbbb1, r11
|
||||
mov_x #0xccc1, r12
|
||||
mov_x #0xddd1, r13
|
||||
mov_x #0xeee1, r14
|
||||
mov_x #0xfff1, r15
|
||||
|
||||
prvRegTest2Loop:
|
||||
|
||||
cmp_x #0x4441, r4
|
||||
jne vRegTest2Error
|
||||
cmp_x #0x5551, r5
|
||||
jne vRegTest2Error
|
||||
cmp_x #0x6661, r6
|
||||
jne vRegTest2Error
|
||||
cmp_x #0x7771, r7
|
||||
jne vRegTest2Error
|
||||
cmp_x #0x8881, r8
|
||||
jne vRegTest2Error
|
||||
cmp_x #0x9991, r9
|
||||
jne vRegTest2Error
|
||||
cmp_x #0xaaa1, r10
|
||||
jne vRegTest2Error
|
||||
cmp_x #0xbbb1, r11
|
||||
jne vRegTest2Error
|
||||
cmp_x #0xccc1, r12
|
||||
jne vRegTest2Error
|
||||
cmp_x #0xddd1, r13
|
||||
jne vRegTest2Error
|
||||
cmp_x #0xeee1, r14
|
||||
jne vRegTest2Error
|
||||
cmp_x #0xfff1, 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
|
||||
|
117
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RunTimeStatsConfig.c
Normal file
117
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/RunTimeStatsConfig.c
Normal file
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and 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 modification 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!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong? *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, training, latest information,
|
||||
license and contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool.
|
||||
|
||||
Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
|
||||
the code with commercial support, indemnification, and middleware, under
|
||||
the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
|
||||
provide a safety engineered and independently SIL3 certified version under
|
||||
the SafeRTOS brand: http://www.SafeRTOS.com.
|
||||
*/
|
||||
|
||||
/* 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/2. */
|
||||
TA1CTL = TASSEL_1 | ID__2;
|
||||
|
||||
/* 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++;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
220
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/lnk430F5438A_mod.xcl
Normal file
220
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/lnk430F5438A_mod.xcl
Normal file
|
@ -0,0 +1,220 @@
|
|||
// ************************************************
|
||||
//
|
||||
// XLINK configuration file for MSP430F5438A
|
||||
//
|
||||
// Copyright 1996-2010 IAR Systems AB
|
||||
//
|
||||
// $Revision: $
|
||||
//
|
||||
// ************************************************
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// Description
|
||||
//
|
||||
|
||||
//
|
||||
// Usage:
|
||||
//
|
||||
// xlink [file file ...] -f lnk430f5438a.xcl
|
||||
//
|
||||
// -----------------------------------------------
|
||||
// Device summary
|
||||
//
|
||||
|
||||
//
|
||||
// Core: MSP430X
|
||||
//
|
||||
// Interrupt vectors: 64
|
||||
//
|
||||
// Peripheral units: 0-001FF
|
||||
//
|
||||
// Information memory (FLASH): 01800-019FF
|
||||
//
|
||||
// Read/write memory (RAM): 01C00-05BFF
|
||||
//
|
||||
// Read-only memory (FLASH): 05C00-0FFFF
|
||||
// 10000-45BFF
|
||||
//
|
||||
|
||||
|
||||
// -----------------------------------------------
|
||||
// Segments
|
||||
//
|
||||
|
||||
// -------------------------------------
|
||||
// Data read/write segments (RAM)
|
||||
//
|
||||
|
||||
//
|
||||
// The following segments are available for both
|
||||
// the DATA16 and DATA20 segment groups.
|
||||
//
|
||||
// segment Usage
|
||||
// ------- --------------------------
|
||||
// DATA<nn>_Z Data initialized to zero
|
||||
// DATA<nn>_I Data initialized by copying from DATA<nn>_ID
|
||||
// DATA<nn>_N Data defined using __no_init
|
||||
// DATA<nn>_HEAP The heap used by 'malloc' and 'free'
|
||||
//
|
||||
// segment Usage
|
||||
// ------- --------------------------
|
||||
// CSTACK Runtime stack
|
||||
//
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Program and data read-only segments (FLASH)
|
||||
//
|
||||
|
||||
//
|
||||
// The following segments are available for both
|
||||
// the DATA16 and DATA20 segment groups.
|
||||
//
|
||||
// segment Usage
|
||||
// ------- --------------------------
|
||||
// DATA<nn>_C Constant data, including string literals
|
||||
// DATA<nn>_ID initializers for DATA<nn>_I
|
||||
//
|
||||
// segment Usage
|
||||
// ------- --------------------------
|
||||
// INFO Information memory
|
||||
// INFOA Information memory, bank A
|
||||
// INFOB Information memory, bank B
|
||||
// INFOC Information memory, bank C
|
||||
// INFOD Information memory, bank D
|
||||
// CSTART Program startup code
|
||||
// CODE Program code
|
||||
// ISR_CODE Program code for interrupt service routines
|
||||
// DIFUNCT Dynamic initialization vector used by C++
|
||||
// CHECKSUM Checksum byte(s) generated by the -J option
|
||||
// INTVEC Interrupt vectors
|
||||
// RESET The reset vector
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in
|
||||
// the DATA16 segment group must be placed in in the range 0000-FFFD.
|
||||
//
|
||||
// * The INFOx and INFO segments overlap, this allows data either to be
|
||||
// placed in a specific bank or anywhere in the info memory.
|
||||
//
|
||||
// * The INTVEC and RESET segments overlap. This allows an application to
|
||||
// either use the reset vector provided by the runtime library, or
|
||||
// provide a reset function by defining an interrupt function associated
|
||||
// with the reset vector.
|
||||
//
|
||||
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// Configuation
|
||||
//
|
||||
|
||||
// -----------------------------------------------
|
||||
// Stack and heap sizes
|
||||
//
|
||||
|
||||
// Uncomment for command line use
|
||||
//-D_STACK_SIZE=80
|
||||
//-D_DATA16_HEAP_SIZE=80
|
||||
//-D_DATA20_HEAP_SIZE=80
|
||||
|
||||
|
||||
// -----------------------------------------------
|
||||
// Define cpu
|
||||
//
|
||||
|
||||
-cmsp430
|
||||
|
||||
|
||||
// -----------------------------------------------
|
||||
// Support for placing functions in read/write memory
|
||||
//
|
||||
|
||||
-QCODE_I=CODE_ID
|
||||
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// Placement directives
|
||||
//
|
||||
|
||||
// -----------------------------------------------
|
||||
// Read/write memory
|
||||
//
|
||||
|
||||
/* Commented out and substituted the original memory region definition */
|
||||
/* for RAM to reserve the memory region from 0x2000 to 0x2021 as it is */
|
||||
/* used during active mode Icc tests in "5xx_ACTIVE_test.asm" */
|
||||
-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=1C00-5BFF
|
||||
|
||||
//-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=1C00-2000,2022-5BFF
|
||||
-Z(DATA)CODE_I
|
||||
-Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE
|
||||
-Z(DATA)CSTACK+_STACK_SIZE#
|
||||
|
||||
|
||||
// -----------------------------------------------
|
||||
// Read-only memory
|
||||
//
|
||||
|
||||
// -------------------------------------
|
||||
// Information memory
|
||||
//
|
||||
|
||||
-Z(CONST)INFO=1800-19FF
|
||||
-Z(CONST)INFOA=1980-19FF
|
||||
-Z(CONST)INFOB=1900-197F
|
||||
-Z(CONST)INFOC=1880-18FF
|
||||
-Z(CONST)INFOD=1800-187F
|
||||
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Low memory 0-0FFFF
|
||||
//
|
||||
|
||||
// ---------------------------
|
||||
// Code
|
||||
//
|
||||
|
||||
-Z(CODE)CSTART,ISR_CODE=5C00-FF7F
|
||||
|
||||
// ---------------------------
|
||||
// Constant data
|
||||
//
|
||||
|
||||
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=5C00-FF7F
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// All memory 0-FFFFF
|
||||
//
|
||||
|
||||
// ---------------------------
|
||||
// Code
|
||||
//
|
||||
|
||||
// Can be modified to test the use of high memory.
|
||||
// Original code
|
||||
-P(CODE)CODE=5C00-FF7F,10000-45BFF
|
||||
// Modified code
|
||||
//-P(CODE)CODE=10000-45BFF
|
||||
|
||||
-Z(CODE)CODE_ID
|
||||
|
||||
// ---------------------------
|
||||
// Constant data
|
||||
//
|
||||
|
||||
// *** Modified to place code in high memory and insodoing, testing the port.
|
||||
// Original code
|
||||
-Z(CONST)DATA20_C,DATA20_ID=5C00-FF7F,10000-45BFF
|
||||
// Modified code
|
||||
//-Z(CONST)DATA20_C,DATA20_ID=10000-45BFF
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Interrupt vectors
|
||||
//
|
||||
|
||||
-Z(CODE)INTVEC=FF80-FFFF
|
||||
-Z(CODE)RESET=FFFE-FFFF
|
55
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/low_level_init.c
Normal file
55
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/low_level_init.c
Normal file
|
@ -0,0 +1,55 @@
|
|||
/**************************************************
|
||||
*
|
||||
* This is a template for early application low-level initialization.
|
||||
*
|
||||
* Copyright 1996-2010 IAR Systems AB.
|
||||
*
|
||||
* $Revision: 5993 $
|
||||
*
|
||||
**************************************************/
|
||||
|
||||
/*
|
||||
* The function __low_level_init it called by the start-up code before
|
||||
* "main" is called, and before data segment initialization is
|
||||
* performed.
|
||||
*
|
||||
* This is a template file, modify to perform any initialization that
|
||||
* should take place early.
|
||||
*
|
||||
* The return value of this function controls if data segment
|
||||
* initialization should take place. If 0 is returned, it is bypassed.
|
||||
*
|
||||
* For the MSP430 microcontroller family, please consider disabling
|
||||
* the watchdog timer here, as it could time-out during the data
|
||||
* segment initialization.
|
||||
*/
|
||||
|
||||
/*
|
||||
* To disable the watchdog timer, include a suitable device header
|
||||
* file (or "msp430.h") and add the following line to the function
|
||||
* below:
|
||||
*
|
||||
* WDTCTL = WDTPW+WDTHOLD;
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <intrinsics.h>
|
||||
#include "msp430.h"
|
||||
|
||||
int __low_level_init(void)
|
||||
{
|
||||
/* Insert your low-level initializations here */
|
||||
_DINT();
|
||||
WDTCTL = WDTPW+WDTHOLD;
|
||||
|
||||
|
||||
/*
|
||||
* Return value:
|
||||
*
|
||||
* 1 - Perform data segment initialization.
|
||||
* 0 - Skip data segment initialization.
|
||||
*/
|
||||
|
||||
return 1;
|
||||
}
|
642
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/main.c
Normal file
642
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/main.c
Normal file
|
@ -0,0 +1,642 @@
|
|||
/*
|
||||
FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and 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 modification 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!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong? *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, training, latest information,
|
||||
license and contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool.
|
||||
|
||||
Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
|
||||
the code with commercial support, indemnification, and middleware, under
|
||||
the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
|
||||
provide a safety engineered and independently SIL3 certified version under
|
||||
the SafeRTOS brand: http://www.SafeRTOS.com.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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 1* 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 <stdio.h>
|
||||
|
||||
/* 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 )
|
||||
|
||||
/* Just used to ensure parameters are passed into tasks correctly. */
|
||||
#define mainTASK_PARAMETER_CHECK_VALUE ( ( void * ) 0xDEAD )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* The linker script can be used to test the FreeRTOS ports use of 20bit
|
||||
addresses by locating all code in high memory. The following pragma ensures
|
||||
that main remains in low memory when that is done. The ISR_CODE segment is used
|
||||
for convenience as ISR functions are always placed in low memory. */
|
||||
#pragma location="ISR_CODE"
|
||||
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, "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, mainTASK_PARAMETER_CHECK_VALUE, 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() );
|
||||
|
||||
/* Just as a test of the port, and for no functional reason, check the task
|
||||
parameter contains its expected value. */
|
||||
if( pvParameters != mainTASK_PARAMETER_CHECK_VALUE )
|
||||
{
|
||||
halLcdPrintLine( "Invalid parameter", ucLine, OVERWRITE_TEXT );
|
||||
ucLine++;
|
||||
}
|
||||
|
||||
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*****************************************" );
|
||||
vTaskGetRunTimeStats( ( signed char * ) cBuffer );
|
||||
printf( cBuffer );
|
||||
|
||||
/* 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 )
|
||||
{
|
||||
halBoardInit();
|
||||
|
||||
LFXT_Start( XT1DRIVE_0 );
|
||||
hal430SetSystemClock( configCPU_CLOCK_HZ, configLFXT_CLOCK_HZ );
|
||||
|
||||
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 static 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_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_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 power mode. */
|
||||
__bis_SR_register( LPM3_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( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
223
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/serial.c
Normal file
223
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/serial.c
Normal file
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and 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 modification 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!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong? *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, training, latest information,
|
||||
license and contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool.
|
||||
|
||||
Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
|
||||
the code with commercial support, indemnification, and middleware, under
|
||||
the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
|
||||
provide a safety engineered and independently SIL3 certified version under
|
||||
the SafeRTOS brand: http://www.SafeRTOS.com.
|
||||
*/
|
||||
|
||||
|
||||
/* 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 <stdlib.h>
|
||||
|
||||
/* 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;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* The implementation of this interrupt is provided to demonstrate the use
|
||||
of queues from inside an interrupt service routine. It is *not* intended to
|
||||
be an efficient interrupt implementation. A real application should make use
|
||||
of the DMA. Or, as a minimum, transmission and reception could use a simple
|
||||
RAM ring buffer, and synchronise with a task using a semaphore when a complete
|
||||
message has been received or transmitted. */
|
||||
#pragma vector=USCI_A1_VECTOR
|
||||
static __interrupt void prvUSCI_A1_ISR( void )
|
||||
{
|
||||
signed char cChar;
|
||||
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, &xHigherPriorityTaskWoken ) == 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 );
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<Project>
|
||||
<Desktop>
|
||||
<Static>
|
||||
<Debug-Log>
|
||||
|
||||
|
||||
<PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1622</ColumnWidth1></Debug-Log>
|
||||
<Build>
|
||||
|
||||
|
||||
|
||||
|
||||
<ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1216</ColumnWidth1><ColumnWidth2>324</ColumnWidth2><ColumnWidth3>81</ColumnWidth3><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Build>
|
||||
<Workspace>
|
||||
<ColumnWidths>
|
||||
|
||||
|
||||
|
||||
|
||||
<Column0>185</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
||||
</Workspace>
|
||||
<Disassembly>
|
||||
|
||||
|
||||
|
||||
<PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><MixedMode>1</MixedMode><CodeCovShow>1</CodeCovShow><InstrProfShow>1</InstrProfShow></Disassembly>
|
||||
<Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Watch><Format><struct_types/><watch_formats><Fmt><Key>{W}Watch-0:TA1CTL</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:ulLastReturn</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:ulReturn</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:ulSP_PC_Combined</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:ulReturn</Key><Value>4</Value></Fmt></watch_formats></Format><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>134</Column0><Column1>139</Column1><Column2>124</Column2><Column3>100</Column3></Watch><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Breakpoints><TASKVIEW><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>200</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3><Column4>100</Column4><Column5>100</Column5><Column6>100</Column6><Column7>150</Column7></TASKVIEW><TerminalIO><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><InputSource>1</InputSource><InputMode>10</InputMode><Filename>$PROJ_DIR$\TermIOInput.txt</Filename><InputEcho>1</InputEcho><ShowReset>0</ShowReset></TerminalIO><DeviceInformationWindow><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>150</Column0><Column1>150</Column1></DeviceInformationWindow><StateStorageDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></StateStorageDialog><SequencerDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><SequencerMask>0</SequencerMask><Advanced>0</Advanced></SequencerDialog><CallStack><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ViewArgs>1</ViewArgs></CallStack><QUEUEVIEW><Column0>300</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3><Column4>100</Column4><Column5>100</Column5><Column6>100</Column6></QUEUEVIEW></Static>
|
||||
<Windows>
|
||||
|
||||
|
||||
|
||||
<Wnd0>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-11539-27703</Identity>
|
||||
<TabName>Workspace</TabName>
|
||||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
|
||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS_Source</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS_Source/Portable</ExpandedNode></NodeDict></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd0><Wnd1><Tabs><Tab><Identity>TabID-25774-15685</Identity><TabName>Terminal I/O</TabName><Factory>TerminalIO</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd1><Wnd2><Tabs><Tab><Identity>TabID-408-3295</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd2></Windows>
|
||||
<Editor>
|
||||
|
||||
|
||||
|
||||
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>425</YPos><SelStart>19939</SelStart><SelEnd>19939</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Positions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Top><Row0><Sizes><Toolbar-01349480><key>iaridepm.enu1</key></Toolbar-01349480><Toolbar-053ff260><key>430fet1</key></Toolbar-053ff260></Sizes></Row0><Row1><Sizes><Toolbar-05b3fdc8><key>debuggergui.enu1</key></Toolbar-05b3fdc8></Sizes></Row1></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>716</Bottom><Right>259</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>155357</sizeVertCX><sizeVertCY>731161</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>716</Bottom><Right>514</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>119048</sizeHorzCX><sizeHorzCY>203666</sizeHorzCY><sizeVertCX>307143</sizeVertCX><sizeVertCY>731161</sizeVertCY></Rect></Wnd1></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>200</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>203666</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203666</sizeVertCY></Rect></Wnd2></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
</Desktop>
|
||||
</Project>
|
||||
|
||||
|
82
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/settings/RTOSDemo.dni
Normal file
82
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/settings/RTOSDemo.dni
Normal file
|
@ -0,0 +1,82 @@
|
|||
[DebugChecksum]
|
||||
Checksum=1421140093
|
||||
[DisAssemblyWindow]
|
||||
NumStates=_ 1
|
||||
State 1=_ 1
|
||||
[InstructionProfiling]
|
||||
Enabled=_ 0
|
||||
[CodeCoverage]
|
||||
Enabled=_ 0
|
||||
[State Storage]
|
||||
Control Register=0
|
||||
[Sequencer]
|
||||
Control Register=0
|
||||
NextState0=0
|
||||
NextState1=0
|
||||
[Action Register]
|
||||
Break=1
|
||||
State Storage=0
|
||||
[Profiling]
|
||||
Enabled=0
|
||||
[StackPlugin]
|
||||
Enabled=0
|
||||
OverflowWarningsEnabled=1
|
||||
WarningThreshold=90
|
||||
SpWarningsEnabled=0
|
||||
WarnHow=0
|
||||
UseTrigger=1
|
||||
TriggerName=main
|
||||
LimitSize=0
|
||||
ByteLimit=50
|
||||
[Stack]
|
||||
FillEnabled=0
|
||||
OverflowWarningsEnabled=1
|
||||
WarningThreshold=90
|
||||
SpWarningsEnabled=1
|
||||
WarnLogOnly=1
|
||||
UseTrigger=1
|
||||
TriggerName=main
|
||||
LimitSize=0
|
||||
ByteLimit=50
|
||||
[Log file]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
Category=_ 0
|
||||
[TermIOLog]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
[CallStack]
|
||||
ShowArgs=0
|
||||
[CallStackLog]
|
||||
Enabled=0
|
||||
[DriverProfiling]
|
||||
Enabled=0
|
||||
Mode=0
|
||||
Graph=0
|
||||
Symbiont=0
|
||||
Exclusions=
|
||||
[Breakpoints]
|
||||
Count=0
|
||||
[FET]
|
||||
Clock mode=14
|
||||
Extended Clock mode=4047
|
||||
Secure Password=
|
||||
Extended Clock Control Enable=1
|
||||
Advanced Extended Clock Control=0
|
||||
Emulation mode=0
|
||||
Free running=0
|
||||
Shutting Down=1
|
||||
[Memory Dump]
|
||||
Start address=
|
||||
Lenghth=
|
||||
Address info=0
|
||||
Format=0
|
||||
Dump registers=0
|
||||
PC=0
|
||||
SP=0
|
||||
SR=0
|
||||
all registers=0
|
||||
File name=
|
||||
[Aliases]
|
||||
Count=0
|
||||
SuppressDialog=0
|
57
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/settings/RTOSDemo.wsdt
Normal file
57
FreeRTOS/Demo/MSP430X_MSP430F5438_IAR/settings/RTOSDemo.wsdt
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<Workspace>
|
||||
<ConfigDictionary>
|
||||
|
||||
<CurrentConfigs><Project>RTOSDemo/Debug_Large_Data_Model</Project></CurrentConfigs></ConfigDictionary>
|
||||
<Desktop>
|
||||
<Static>
|
||||
<Workspace>
|
||||
<ColumnWidths>
|
||||
|
||||
|
||||
|
||||
|
||||
<Column0>335</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
||||
</Workspace>
|
||||
<Build>
|
||||
|
||||
|
||||
|
||||
|
||||
<PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Breakpoints</Factory></Window></Windows></PreferedWindows><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1216</ColumnWidth1><ColumnWidth2>324</ColumnWidth2><ColumnWidth3>81</ColumnWidth3></Build>
|
||||
<TerminalIO/>
|
||||
<Debug-Log><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Build</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Breakpoints</Factory></Window></Windows></PreferedWindows><ColumnWidth0>18</ColumnWidth0><ColumnWidth1>1624</ColumnWidth1></Debug-Log><Find-in-Files><ColumnWidth0>580</ColumnWidth0><ColumnWidth1>82</ColumnWidth1><ColumnWidth2>994</ColumnWidth2><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Build</Factory></Window><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Breakpoints</Factory></Window></Windows></PreferedWindows></Find-in-Files><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Breakpoints></Static>
|
||||
<Windows>
|
||||
|
||||
|
||||
<Wnd2>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-18858-27566</Identity>
|
||||
<TabName>Workspace</TabName>
|
||||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
|
||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/Output</ExpandedNode><ExpandedNode>RTOSDemo/UserExperienceDemo</ExpandedNode></NodeDict></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd2><Wnd3><Tabs><Tab><Identity>TabID-15348-8476</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab><Tab><Identity>TabID-12693-9958</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>
|
||||
<Editor>
|
||||
|
||||
|
||||
|
||||
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>50</YPos><SelStart>19236</SelStart><SelEnd>19236</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Positions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Top><Row0><Sizes><Toolbar-01349480><key>iaridepm.enu1</key></Toolbar-01349480></Sizes></Row0><Row1><Sizes/></Row1><Row2><Sizes/></Row2><Row3><Sizes/></Row3></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>610</Bottom><Right>409</Right><x>-2</x><y>-2</y><xscreen>331</xscreen><yscreen>267</yscreen><sizeHorzCX>197024</sizeHorzCX><sizeHorzCY>271894</sizeHorzCY><sizeVertCX>244643</sizeVertCX><sizeVertCY>623218</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>328</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>330</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>336049</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203666</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
</Desktop>
|
||||
</Workspace>
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue