blob: 0c2cc8f71b3d99178f7d961f604c38aa004f5f90 [file] [log] [blame]
/*
* -------------------------------------------
* MSP432 DriverLib - v3_10_00_09
* -------------------------------------------
*
* --COPYRIGHT--,BSD,BSD
* Copyright (c) 2014, Texas Instruments Incorporated
* All rights reserved.
*
* 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.
* --/COPYRIGHT--*/
#ifndef __FLASH_H__
#define __FLASH_H__
//*****************************************************************************
//
//! \addtogroup flash_api
//! @{
//
//*****************************************************************************
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
#include <msp.h>
#include <stdbool.h>
//*****************************************************************************
//
// Control specific variables
//
//*****************************************************************************
#define FLASH_BURST_PRG_BIT 0x03
/* Interrupts */
#define FLASH_PROGRAM_ERROR FLCTL_IFG_PRG_ERR
#define FLASH_BENCHMARK_INT FLCTL_IFG_BMRK
#define FLASH_ERASE_COMPLETE FLCTL_IFG_ERASE
#define FLASH_BRSTPRGM_COMPLETE FLCTL_IFG_PRGB
#define FLASH_WRDPRGM_COMPLETE FLCTL_IFG_PRG
#define FLASH_POSTVERIFY_FAILED FLCTL_IFG_AVPST
#define FLASH_PREVERIFY_FAILED FLCTL_IFG_AVPRE
#define FLASH_BRSTRDCMP_COMPLETE FLCTL_IFG_RDBRST
#define FLASH_NORMAL_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_0
#define FLASH_MARGIN0_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_1
#define FLASH_MARGIN1_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_2
#define FLASH_PROGRAM_VERIFY_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_3
#define FLASH_ERASE_VERIFY_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_4
#define FLASH_LEAKAGE_VERIFY_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_5
#define FLASH_MARGIN0B_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_9
#define FLASH_MARGIN1B_READ_MODE FLCTL_BANK0_RDCTL_RD_MODE_10
#define FLASH_PRGBRSTCTLSTAT_BURSTSTATUS_COMPLETE FLCTL_PRGBRST_CTLSTAT_BURST_STATUS_7
#define FLASH_BANK0 0x00
#define FLASH_BANK1 0x01
#define FLASH_DATA_READ 0x00
#define FLASH_INSTRUCTION_FETCH 0x01
#define FLASH_MAIN_MEMORY_SPACE_BANK0 0x01
#define FLASH_MAIN_MEMORY_SPACE_BANK1 0x02
#define FLASH_INFO_MEMORY_SPACE_BANK0 0x03
#define FLASH_INFO_MEMORY_SPACE_BANK1 0x04
#define FLASH_MAIN_SPACE FLCTL_RDBRST_CTLSTAT_MEM_TYPE_0
#define FLASH_INFO_SPACE FLCTL_RDBRST_CTLSTAT_MEM_TYPE_1
#define FLASH_1_PATTERN FLCTL_RDBRST_CTLSTAT_DATA_CMP
#define FLASH_0_PATTERN 0x00
#define FLASH_SECTOR0 FLCTL_BANK0_MAIN_WEPROT_PROT0
#define FLASH_SECTOR1 FLCTL_BANK0_MAIN_WEPROT_PROT1
#define FLASH_SECTOR2 FLCTL_BANK0_MAIN_WEPROT_PROT2
#define FLASH_SECTOR3 FLCTL_BANK0_MAIN_WEPROT_PROT3
#define FLASH_SECTOR4 FLCTL_BANK0_MAIN_WEPROT_PROT4
#define FLASH_SECTOR5 FLCTL_BANK0_MAIN_WEPROT_PROT5
#define FLASH_SECTOR6 FLCTL_BANK0_MAIN_WEPROT_PROT6
#define FLASH_SECTOR7 FLCTL_BANK0_MAIN_WEPROT_PROT7
#define FLASH_SECTOR8 FLCTL_BANK0_MAIN_WEPROT_PROT8
#define FLASH_SECTOR9 FLCTL_BANK0_MAIN_WEPROT_PROT9
#define FLASH_SECTOR10 FLCTL_BANK0_MAIN_WEPROT_PROT10
#define FLASH_SECTOR11 FLCTL_BANK0_MAIN_WEPROT_PROT11
#define FLASH_SECTOR12 FLCTL_BANK0_MAIN_WEPROT_PROT12
#define FLASH_SECTOR13 FLCTL_BANK0_MAIN_WEPROT_PROT13
#define FLASH_SECTOR14 FLCTL_BANK0_MAIN_WEPROT_PROT14
#define FLASH_SECTOR15 FLCTL_BANK0_MAIN_WEPROT_PROT15
#define FLASH_SECTOR16 FLCTL_BANK0_MAIN_WEPROT_PROT16
#define FLASH_SECTOR17 FLCTL_BANK0_MAIN_WEPROT_PROT17
#define FLASH_SECTOR18 FLCTL_BANK0_MAIN_WEPROT_PROT18
#define FLASH_SECTOR19 FLCTL_BANK0_MAIN_WEPROT_PROT19
#define FLASH_SECTOR20 FLCTL_BANK0_MAIN_WEPROT_PROT20
#define FLASH_SECTOR21 FLCTL_BANK0_MAIN_WEPROT_PROT21
#define FLASH_SECTOR22 FLCTL_BANK0_MAIN_WEPROT_PROT22
#define FLASH_SECTOR23 FLCTL_BANK0_MAIN_WEPROT_PROT23
#define FLASH_SECTOR24 FLCTL_BANK0_MAIN_WEPROT_PROT24
#define FLASH_SECTOR25 FLCTL_BANK0_MAIN_WEPROT_PROT25
#define FLASH_SECTOR26 FLCTL_BANK0_MAIN_WEPROT_PROT26
#define FLASH_SECTOR27 FLCTL_BANK0_MAIN_WEPROT_PROT27
#define FLASH_SECTOR28 FLCTL_BANK0_MAIN_WEPROT_PROT28
#define FLASH_SECTOR29 FLCTL_BANK0_MAIN_WEPROT_PROT29
#define FLASH_SECTOR30 FLCTL_BANK0_MAIN_WEPROT_PROT30
#define FLASH_SECTOR31 FLCTL_BANK0_MAIN_WEPROT_PROT31
#define FLASH_NOVER 0
#define FLASH_BURSTPOST FLCTL_PRGBRST_CTLSTAT_AUTO_PST
#define FLASH_BURSTPRE FLCTL_PRGBRST_CTLSTAT_AUTO_PRE
#define FLASH_REGPRE FLCTL_PRG_CTLSTAT_VER_PRE
#define FLASH_REGPOST FLCTL_PRG_CTLSTAT_VER_PST
#define FLASH_FULLVER (FLCTL_PRGBRST_CTLSTAT_AUTO_PST | \
FLCTL_PRGBRST_CTLSTAT_AUTO_PRE | FLCTL_PRG_CTLSTAT_VER_PRE \
| FLCTL_PRG_CTLSTAT_VER_PST)
#define FLASH_COLLATED_WRITE_MODE 0x01
#define FLASH_IMMEDIATE_WRITE_MODE 0x02
#define __INFO_FLASH_TECH_START__ 0x00200000
#define __INFO_FLASH_TECH_MIDDLE__ 0x00202000
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Calculates the flash bank and sector number given an address. Stores the
//! results into the two pointers given as parameters. The user must provide
//! a valid memory address (an address in SRAM for example will give an invalid
//! result).
//!
//! \param addr Address to calculate the bank/sector information for
//!
//! \param sectorNum The sector number will be stored in here after the function
//! completes.
//!
//! \param sectorNum The bank number will be stored in here after the function
//! completes.
//!
//! \note For simplicity, this API only works with address in MAIN flash memory.
//! For calculating the sector/bank number of an address in info memory,
//! please refer to your device datasheet/
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_getMemoryInfo(uint32_t addr, uint32_t *sectorNum,
uint32_t *bankNum);
//*****************************************************************************
//
//! Enables read buffering on accesses to a specified bank of flash memory
//!
//! \param memoryBank is the value of the memory bank to enable read
//! buffering. Must be only one of the following values:
//! - \b FLASH_BANK0,
//! - \b FLASH_BANK1
//!
//! \param accessMethod is the value of the access type to enable read
//! buffering. Must be only one of the following values:
//! - \b FLASH_DATA_READ,
//! - \b FLASH_INSTRUCTION_FETCH
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_enableReadBuffering(uint_fast8_t memoryBank,
uint_fast8_t accessMethod);
//*****************************************************************************
//
//! Disables read buffering on accesses to a specified bank of flash memory
//!
//! \param memoryBank is the value of the memory bank to disable read
//! buffering. Must be only one of the following values:
//! - \b FLASH_BANK0,
//! - \b FLASH_BANK1
//!
//! \param accessMethod is the value of the access type to disable read
//! buffering. Must ne only one of the following values:
//! - \b FLASH_DATA_READ,
//! - \b FLASH_INSTRUCTION_FETCH
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_disableReadBuffering(uint_fast8_t memoryBank,
uint_fast8_t accessMethod);
//*****************************************************************************
//
//! Disables program protection on the given sector mask. This setting can be
//! applied on a sector-wise bases on a given memory space (INFO or MAIN).
//!
//! \param memorySpace is the value of the memory bank to disable program
//! protection. Must be only one of the following values:
//! - \b FLASH_MAIN_MEMORY_SPACE_BANK0,
//! - \b FLASH_MAIN_MEMORY_SPACE_BANK1,
//! - \b FLASH_INFO_MEMORY_SPACE_BANK0,
//! - \b FLASH_INFO_MEMORY_SPACE_BANK1
//!
//! \param sectorMask is a bit mask of the sectors to disable program
//! protection. Must be a bitfield of the following values:
//! - \b FLASH_SECTOR0,
//! - \b FLASH_SECTOR1,
//! - \b FLASH_SECTOR2,
//! - \b FLASH_SECTOR3,
//! - \b FLASH_SECTOR4,
//! - \b FLASH_SECTOR5,
//! - \b FLASH_SECTOR6,
//! - \b FLASH_SECTOR7,
//! - \b FLASH_SECTOR8,
//! - \b FLASH_SECTOR9,
//! - \b FLASH_SECTOR10,
//! - \b FLASH_SECTOR11,
//! - \b FLASH_SECTOR12,
//! - \b FLASH_SECTOR13,
//! - \b FLASH_SECTOR14,
//! - \b FLASH_SECTOR15,
//! - \b FLASH_SECTOR16,
//! - \b FLASH_SECTOR17,
//! - \b FLASH_SECTOR18,
//! - \b FLASH_SECTOR19,
//! - \b FLASH_SECTOR20,
//! - \b FLASH_SECTOR21,
//! - \b FLASH_SECTOR22,
//! - \b FLASH_SECTOR23,
//! - \b FLASH_SECTOR24,
//! - \b FLASH_SECTOR25,
//! - \b FLASH_SECTOR26,
//! - \b FLASH_SECTOR27,
//! - \b FLASH_SECTOR28,
//! - \b FLASH_SECTOR29,
//! - \b FLASH_SECTOR30,
//! - \b FLASH_SECTOR31
//!
//! \note Flash sector sizes are 4KB and the number of sectors may vary
//! depending on the specific device. Also, for INFO memory space, only sectors
//! \b FLASH_SECTOR0 and \b FLASH_SECTOR1 will exist.
//!
//! \note Not all devices will contain a dedicated INFO memory. Please check the
//! device datasheet to see if your device has INFO memory available for use.
//! For devices without INFO memory, any operation related to the INFO memory
//! will be ignored by the hardware.
//!
//! \return true if sector protection disabled false otherwise.
//
//*****************************************************************************
extern bool FlashCtl_unprotectSector(uint_fast8_t memorySpace,
uint32_t sectorMask);
//*****************************************************************************
//
//! Enables program protection on the given sector mask. This setting can be
//! applied on a sector-wise bases on a given memory space (INFO or MAIN).
//!
//! \param memorySpace is the value of the memory bank to enable program
//! protection. Must be only one of the following values:
//! - \b FLASH_MAIN_MEMORY_SPACE_BANK0,
//! - \b FLASH_MAIN_MEMORY_SPACE_BANK1,
//! - \b FLASH_INFO_MEMORY_SPACE_BANK0,
//! - \b FLASH_INFO_MEMORY_SPACE_BANK1
//!
//! \param sectorMask is a bit mask of the sectors to enable program
//! protection. Must be a bitfield of the following values:
//! - \b FLASH_SECTOR0,
//! - \b FLASH_SECTOR1,
//! - \b FLASH_SECTOR2,
//! - \b FLASH_SECTOR3,
//! - \b FLASH_SECTOR4,
//! - \b FLASH_SECTOR5,
//! - \b FLASH_SECTOR6,
//! - \b FLASH_SECTOR7,
//! - \b FLASH_SECTOR8,
//! - \b FLASH_SECTOR9,
//! - \b FLASH_SECTOR10,
//! - \b FLASH_SECTOR11,
//! - \b FLASH_SECTOR12,
//! - \b FLASH_SECTOR13,
//! - \b FLASH_SECTOR14,
//! - \b FLASH_SECTOR15,
//! - \b FLASH_SECTOR16,
//! - \b FLASH_SECTOR17,
//! - \b FLASH_SECTOR18,
//! - \b FLASH_SECTOR19,
//! - \b FLASH_SECTOR20,
//! - \b FLASH_SECTOR21,
//! - \b FLASH_SECTOR22,
//! - \b FLASH_SECTOR23,
//! - \b FLASH_SECTOR24,
//! - \b FLASH_SECTOR25,
//! - \b FLASH_SECTOR26,
//! - \b FLASH_SECTOR27,
//! - \b FLASH_SECTOR28,
//! - \b FLASH_SECTOR29,
//! - \b FLASH_SECTOR30,
//! - \b FLASH_SECTOR31
//!
//! \note Flash sector sizes are 4KB and the number of sectors may vary
//! depending on the specific device. Also, for INFO memory space, only sectors
//! \b FLASH_SECTOR0 and \b FLASH_SECTOR1 will exist.
//!
//! \note Not all devices will contain a dedicated INFO memory. Please check the
//! device datasheet to see if your device has INFO memory available for use.
//! For devices without INFO memory, any operation related to the INFO memory
//! will be ignored by the hardware.
//!
//! \return true if sector protection enabled false otherwise.
//
//*****************************************************************************
extern bool FlashCtl_protectSector(uint_fast8_t memorySpace,
uint32_t sectorMask);
//*****************************************************************************
//
//! Returns the sector protection for given sector mask and memory space
//!
//! \param memorySpace is the value of the memory bank to check for program
//! protection. Must be only one of the following values:
//! - \b FLASH_MAIN_MEMORY_SPACE_BANK0,
//! - \b FLASH_MAIN_MEMORY_SPACE_BANK1,
//! - \b FLASH_INFO_MEMORY_SPACE_BANK0,
//! - \b FLASH_INFO_MEMORY_SPACE_BANK1
//!
//! \param sector is the sector to check for program protection.
//! Must be one of the following values:
//! - \b FLASH_SECTOR0,
//! - \b FLASH_SECTOR1,
//! - \b FLASH_SECTOR2,
//! - \b FLASH_SECTOR3,
//! - \b FLASH_SECTOR4,
//! - \b FLASH_SECTOR5,
//! - \b FLASH_SECTOR6,
//! - \b FLASH_SECTOR7,
//! - \b FLASH_SECTOR8,
//! - \b FLASH_SECTOR9,
//! - \b FLASH_SECTOR10,
//! - \b FLASH_SECTOR11,
//! - \b FLASH_SECTOR12,
//! - \b FLASH_SECTOR13,
//! - \b FLASH_SECTOR14,
//! - \b FLASH_SECTOR15,
//! - \b FLASH_SECTOR16,
//! - \b FLASH_SECTOR17,
//! - \b FLASH_SECTOR18,
//! - \b FLASH_SECTOR19,
//! - \b FLASH_SECTOR20,
//! - \b FLASH_SECTOR21,
//! - \b FLASH_SECTOR22,
//! - \b FLASH_SECTOR23,
//! - \b FLASH_SECTOR24,
//! - \b FLASH_SECTOR25,
//! - \b FLASH_SECTOR26,
//! - \b FLASH_SECTOR27,
//! - \b FLASH_SECTOR28,
//! - \b FLASH_SECTOR29,
//! - \b FLASH_SECTOR30,
//! - \b FLASH_SECTOR31
//!
//! Note that flash sector sizes are 4KB and the number of sectors may vary
//! depending on the specific device. Also, for INFO memory space, only sectors
//! FLASH_SECTOR0 and FLASH_SECTOR1 will exist.
//!
//! \note Not all devices will contain a dedicated INFO memory. Please check the
//! device datasheet to see if your device has INFO memory available for use.
//! For devices without INFO memory, any operation related to the INFO memory
//! will be ignored by the hardware.
//!
//! \return true if sector protection enabled false otherwise.
//
//*****************************************************************************
extern bool FlashCtl_isSectorProtected(uint_fast8_t memorySpace,
uint32_t sector);
//*****************************************************************************
//
//! Verifies a given segment of memory based off either a high (1) or low (0)
//! state.
//!
//! \param verifyAddr Start address where verification will begin
//!
//! \param length Length in bytes to verify based off the pattern
//!
//! \param pattern The pattern which verification will check versus. This can
//! either be a low pattern (each register will be checked versus a pattern
//! of 32 zeros, or a high pattern (each register will be checked versus a
//! pattern of 32 ones). Valid values are: FLASH_0_PATTERN, FLASH_1_PATTERN
//!
//! \note There are no sector/boundary restrictions for this function,
//! however it is encouraged to proved a start address aligned on 32-bit
//! boundaries. Providing an unaligned address will result in unaligned data
//! accesses and detriment efficiency.
//!
//! \note This function is blocking and will not exit until operation has
//! either completed or failed due to an error. Furthermore, given the
//! complex verification requirements of the flash controller, master
//! interrupts are disabled throughout execution of this function. The original
//! interrupt context is saved at the start of execution and restored prior
//! to exit of the API.
//!
//! \note Due to the hardware limitations of the flash controller, this
//! function cannot verify a memory adress in the same flash bank that it
//! is executing from. If using the ROM version of this API (by using the
//! (ROM_ or MAP_ prefixes) this is a don't care, however if this API resides
//! in flash then special care needs to be taken to ensure no code execution
//! or reads happen in the flash bank being programmed while this API is
//! being executed.
//!
//! \return true if memory verification is successful, false otherwise.
//
//*****************************************************************************
extern bool FlashCtl_verifyMemory(void* verifyAddr, uint32_t length,
uint_fast8_t pattern);
//*****************************************************************************
//
//! Performs a mass erase on all unprotected flash sectors. Protected sectors
//! are ignored.
//!
//! \note This function is blocking and will not exit until operation has
//! either completed or failed due to an error. Furthermore, given the
//! complex verification requirements of the flash controller, master
//! interrupts are disabled throughout execution of this function. The original
//! interrupt context is saved at the start of execution and restored prior
//! to exit of the API.
//!
//! \note Due to the hardware limitations of the flash controller, this
//! function cannot erase a memory adress in the same flash bank that it
//! is executing from. If using the ROM version of this API (by using the
//! (ROM_ or MAP_ prefixes) this is a don't care, however if this API resides
//! in flash then special care needs to be taken to ensure no code execution
//! or reads happen in the flash bank being programmed while this API is
//! being executed.
//!
//! \return true if mass erase completes successfully, false otherwise
//
//*****************************************************************************
extern bool FlashCtl_performMassErase(void);
//*****************************************************************************
//
//! Initiates a mass erase and returns control back to the program. This is a
//! non-blocking function, however it is the user's responsibility to perform
//! the necessary verification requirements after the interrupt is set to
//! signify completion.
//!
//! \return None
//
//*****************************************************************************
extern void FlashCtl_initiateMassErase(void);
//*****************************************************************************
//
//! Erases a sector of MAIN or INFO flash memory.
//!
//! \param addr The start of the sector to erase. Note that with flash,
//! the minimum allowed size that can be erased is a flash sector
//! (which is 4KB on the MSP432 family). If an address is provided to
//! this function which is not on a 4KB boundary, the entire sector
//! will still be erased.
//!
//! \note This function is blocking and will not exit until operation has
//! either completed or failed due to an error. Furthermore, given the
//! complex verification requirements of the flash controller, master
//! interrupts are disabled throughout execution of this function. The original
//! interrupt context is saved at the start of execution and restored prior
//! to exit of the API.
//!
//! \note Due to the hardware limitations of the flash controller, this
//! function cannot erase a memory adress in the same flash bank that it
//! is executing from. If using the ROM version of this API (by using the
//! (ROM_ or MAP_ prefixes) this is a don't care, however if this API resides
//! in flash then special care needs to be taken to ensure no code execution
//! or reads happen in the flash bank being programmed while this API is
//! being executed.
//!
//! \return true if sector erase is successful, false otherwise.
//
//*****************************************************************************
extern bool FlashCtl_eraseSector(uint32_t addr);
//*****************************************************************************
//
//! Program a portion of flash memory with the provided data
//!
//! \param src Pointer to the data source to program into flash
//!
//! \param dest Pointer to the destination in flash to program
//!
//! \param length Length in bytes to program
//!
//! \note There are no sector/boundary restrictions for this function,
//! however it is encouraged to proved a start address aligned on 32-bit
//! boundaries. Providing an unaligned address will result in unaligned data
//! accesses and detriment efficiency.
//!
//! \note This function is blocking and will not exit until operation has
//! either completed or failed due to an error. Furthermore, given the
//! complex verification requirements of the flash controller, master
//! interrupts are disabled throughout execution of this function. The original
//! interrupt context is saved at the start of execution and restored prior
//! to exit of the API.
//!
//! \note Due to the hardware limitations of the flash controller, this
//! function cannot program a memory adress in the same flash bank that it
//! is executing from. If using the ROM version of this API (by using the
//! (ROM_ or MAP_ prefixes) this is a don't care, however if this API resides
//! in flash then special care needs to be taken to ensure no code execution
//! or reads happen in the flash bank being programmed while this API is
//! being executed.
//!
//! \return Whether or not the program succeeded
//
//*****************************************************************************
extern bool FlashCtl_programMemory(void* src, void* dest, uint32_t length);
//*****************************************************************************
//
//! Setups pre/post verification of burst and regular flash programming
//! instructions. Note that this API is for advanced users that are programming
//! their own flash drivers. The program/erase APIs are not affected by this
//! setting and take care of the verification requirements.
//!
//! \param verificationSetting Verification setting to set. This value can
//! be a bitwise OR of the following values:
//! - \b FLASH_BURSTPOST,
//! - \b FLASH_BURSTPRE,
//! - \b FLASH_REGPRE,
//! - \b FLASH_REGPOST
//! - \b FLASH_NOVER No verification enabled
//! - \b FLASH_FULLVER Full verification enabled
//!
//! \return none
//
//*****************************************************************************
extern void FlashCtl_setProgramVerification(uint32_t verificationSetting);
//*****************************************************************************
//
//! Clears pre/post verification of burst and regular flash programming
//! instructions. Note that this API is for advanced users that are programming
//! their own flash drivers. The program/erase APIs are not affected by this
//! setting and take care of the verification requirements.
//!
//! \param verificationSetting Verification setting to clear. This value can
//! be a bitwise OR of the following values:
//! - \b FLASH_BURSTPOST,
//! - \b FLASH_BURSTPRE,
//! - \b FLASH_REGPRE,
//! - \b FLASH_REGPOST
//! - \b FLASH_NOVER No verification enabled
//! - \b FLASH_FULLVER Full verification enabled
//!
//! \return none
//
//*****************************************************************************
extern void FlashCtl_clearProgramVerification(uint32_t verificationSetting);
//*****************************************************************************
//
//! Enables word programming of flash memory.
//!
//! This function will enable word programming of the flash memory and set the
//! mode of behavior when the flash write occurs.
//!
//! \param mode The mode specifies the behavior of the flash controller when
//! programming words to flash. In \b FLASH_IMMEDIATE_WRITE_MODE, the
//! program operation happens immediately on the write to flash while
//! in \b FLASH_COLLATED_WRITE_MODE the write will be delayed until a full
//! 128-bits have been collated. Possible values include:
//! - \b FLASH_IMMEDIATE_WRITE_MODE
//! - \b FLASH_COLLATED_WRITE_MODE
//!
//!
//! Refer to the user's guide for further documentation.
//!
//! \return none
//
//*****************************************************************************
extern void FlashCtl_enableWordProgramming(uint32_t mode);
//*****************************************************************************
//
//! Disables word programming of flash memory.
//!
//! Refer to FlashCtl_enableWordProgramming and the user's guide for description
//! on the difference between full word and immediate programming
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_disableWordProgramming(void);
//*****************************************************************************
//
//! Returns if word programming mode is enabled (and if it is, the specific mode)
//!
//! Refer to FlashCtl_enableWordProgramming and the user's guide for description
//! on the difference between full word and immediate programming
//!
//! \return a zero value if word programming is disabled,
//! - \b FLASH_IMMEDIATE_WRITE_MODE
//! - \b FLASH_COLLATED_WRITE_MODE
//!
//
//*****************************************************************************
extern uint32_t FlashCtl_isWordProgrammingEnabled(void);
//*****************************************************************************
//
//! Sets the flash read mode to be used by default flash read operations.
//! Note that the proper wait states must be set prior to entering this
//! function.
//!
//! \param flashBank Flash bank to set read mode for. Valid values are:
//! - \b FLASH_BANK0
//! - \b FLASH_BANK1
//!
//! \param readMode The read mode to set. Valid values are:
//! - \b FLASH_NORMAL_READ_MODE,
//! - \b FLASH_MARGIN0_READ_MODE,
//! - \b FLASH_MARGIN1_READ_MODE,
//! - \b FLASH_PROGRAM_VERIFY_READ_MODE,
//! - \b FLASH_ERASE_VERIFY_READ_MODE,
//! - \b FLASH_LEAKAGE_VERIFY_READ_MODE,
//! - \b FLASH_MARGIN0B_READ_MODE,
//! - \b FLASH_MARGIN1B_READ_MODE
//!
//! \return None.
//
//*****************************************************************************
extern bool FlashCtl_setReadMode(uint32_t flashBank, uint32_t readMode);
//*****************************************************************************
//
//! Gets the flash read mode to be used by default flash read operations.
//!
//! \param flashBank Flash bank to set read mode for. Valid values are:
//! - \b FLASH_BANK0
//! - \b FLASH_BANK1
//!
//! \return Returns the read mode to set. Valid values are:
//! - \b FLASH_NORMAL_READ_MODE,
//! - \b FLASH_MARGIN0_READ_MODE,
//! - \b FLASH_MARGIN1_READ_MODE,
//! - \b FLASH_PROGRAM_VERIFY_READ_MODE,
//! - \b FLASH_ERASE_VERIFY_READ_MODE,
//! - \b FLASH_LEAKAGE_VERIFY_READ_MODE,
//! - \b FLASH_MARGIN0B_READ_MODE,
//! - \b FLASH_MARGIN1B_READ_MODE
//!
//
//*****************************************************************************
extern uint32_t FlashCtl_getReadMode(uint32_t flashBank);
//*****************************************************************************
//
//! Changes the number of wait states that are used by the flash controller
//! for read operations. When changing frequency ranges of the clock, this
//! functions must be used in order to allow for readable flash memory.
//!
//! \param waitState The number of wait states to set. Note that only
//! bits 0-3 are used.
//!
//! \param flashBank Flash bank to set wait state for. Valid values are:
//! - \b FLASH_BANK0
//! - \b FLASH_BANK1
//!
//
//*****************************************************************************
extern void FlashCtl_setWaitState(uint32_t bank, uint32_t waitState);
//*****************************************************************************
//
//! Returns the set number of flash wait states for the given flash bank.
//!
//! \param flashBank Flash bank to set wait state for. Valid values are:
//! - \b FLASH_BANK0
//! - \b FLASH_BANK1
//!
//! \return The wait state setting for the specified flash bank
//
//*****************************************************************************
extern uint32_t FlashCtl_getWaitState(uint32_t bank);
//*****************************************************************************
//
//! Enables individual flash control interrupt sources.
//!
//! \param flags is a bit mask of the interrupt sources to be enabled. Must
//! be a logical OR of:
//! - \b FLASH_PROGRAM_ERROR,
//! - \b FLASH_BENCHMARK_INT,
//! - \b FLASH_ERASE_COMPLETE,
//! - \b FLASH_BRSTPRGM_COMPLETE,
//! - \b FLASH_WRDPRGM_COMPLETE,
//! - \b FLASH_POSTVERIFY_FAILED,
//! - \b FLASH_PREVERIFY_FAILED,
//! - \b FLASH_BRSTRDCMP_COMPLETE
//!
//! This function enables the indicated flash system interrupt sources. Only
//! the sources that are enabled can be reflected to the processor interrupt;
//! disabled sources have no effect on the processor.
//!
//! \note The interrupt sources vary based on the part in use.
//! Please consult the data sheet for the part you are using to determine
//! which interrupt sources are available.
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_enableInterrupt(uint32_t flags);
//*****************************************************************************
//
//! Disables individual flash system interrupt sources.
//!
//! \param flags is a bit mask of the interrupt sources to be disabled. Must
//! be a logical OR of:
//! - \b FLASH_PROGRAM_ERROR,
//! - \b FLASH_BENCHMARK_INT,
//! - \b FLASH_ERASE_COMPLETE,
//! - \b FLASH_BRSTPRGM_COMPLETE,
//! - \b FLASH_WRDPRGM_COMPLETE,
//! - \b FLASH_POSTVERIFY_FAILED,
//! - \b FLASH_PREVERIFY_FAILED,
//! - \b FLASH_BRSTRDCMP_COMPLETE
//!
//! This function disables the indicated flash system interrupt sources.
//! Only the sources that are enabled can be reflected to the processor
//! interrupt; disabled sources have no effect on the processor.
//!
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_disableInterrupt(uint32_t flags);
//*****************************************************************************
//
//! Gets the current interrupt status masked with the enabled interrupts.
//! This function is useful to call in ISRs to get a list
//! of pending interrupts that are actually enabled and could have caused the
//! ISR.
//!
//! \return The current interrupt status, enumerated as a bit field of
//! - \b FLASH_PROGRAM_ERROR,
//! - \b FLASH_BENCHMARK_INT,
//! - \b FLASH_ERASE_COMPLETE,
//! - \b FLASH_BRSTPRGM_COMPLETE,
//! - \b FLASH_WRDPRGM_COMPLETE,
//! - \b FLASH_POSTVERIFY_FAILED,
//! - \b FLASH_PREVERIFY_FAILED,
//! - \b FLASH_BRSTRDCMP_COMPLETE
//!
//! \note The interrupt sources vary based on the part in use.
//! Please consult the data sheet for the part you are using to determine
//! which interrupt sources are available.
//
//*****************************************************************************
extern uint32_t FlashCtl_getEnabledInterruptStatus(void);
//*****************************************************************************
//
//! Gets the current interrupt status.
//!
//! \return The current interrupt status, enumerated as a bit field of:
//! - \b FLASH_PROGRAM_ERROR,
//! - \b FLASH_BENCHMARK_INT,
//! - \b FLASH_ERASE_COMPLETE,
//! - \b FLASH_BRSTPRGM_COMPLETE,
//! - \b FLASH_WRDPRGM_COMPLETE,
//! - \b FLASH_POSTVERIFY_FAILED,
//! - \b FLASH_PREVERIFY_FAILED,
//! - \b FLASH_BRSTRDCMP_COMPLETE
//!
//! \note The interrupt sources vary based on the part in use.
//! Please consult the data sheet for the part you are using to determine
//! which interrupt sources are available.
//
//*****************************************************************************
extern uint32_t FlashCtl_getInterruptStatus(void);
//*****************************************************************************
//
//! Clears flash system interrupt sources.
//!
//! \param flags is a bit mask of the interrupt sources to be cleared. Must
//! be a logical OR of:
//! - \b FLASH_PROGRAM_ERROR,
//! - \b FLASH_BENCHMARK_INT,
//! - \b FLASH_ERASE_COMPLETE,
//! - \b FLASH_BRSTPRGM_COMPLETE,
//! - \b FLASH_WRDPRGM_COMPLETE,
//! - \b FLASH_POSTVERIFY_FAILED,
//! - \b FLASH_PREVERIFY_FAILED,
//! - \b FLASH_BRSTRDCMP_COMPLETE
//!
//! The specified flash system interrupt sources are cleared, so that they no
//! longer assert. This function must be called in the interrupt handler to
//! keep it from being called again immediately upon exit.
//!
//! \note Because there is a write buffer in the Cortex-M processor, it may
//! take several clock cycles before the interrupt source is actually cleared.
//! Therefore, it is recommended that the interrupt source be cleared early in
//! the interrupt handler (as opposed to the very last action) to avoid
//! returning from the interrupt handler before the interrupt source is
//! actually cleared. Failure to do so may result in the interrupt handler
//! being immediately reentered (because the interrupt controller still sees
//! the interrupt source asserted).
//!
//! \note The interrupt sources vary based on the part in use.
//! Please consult the data sheet for the part you are using to determine
//! which interrupt sources are available.
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_clearInterruptFlag(uint32_t flags);
//*****************************************************************************
//
//! Registers an interrupt handler for flash clock system interrupt.
//!
//! \param intHandler is a pointer to the function to be called when the clock
//! system interrupt occurs.
//!
//! This function registers the handler to be called when a clock system
//! interrupt occurs. This function enables the global interrupt in the
//! interrupt controller; specific flash controller interrupts must be enabled
//! via FlashCtl_enableInterrupt(). It is the interrupt handler's
//! responsibility to clear the interrupt source via
//! FlashCtl_clearInterruptFlag().
//!
//! \sa Interrupt_registerInterrupt() for important information about
//! registering interrupt handlers.
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_registerInterrupt(void (*intHandler)(void));
//*****************************************************************************
//
//! Unregisters the interrupt handler for the flash system.
//!
//! This function unregisters the handler to be called when a clock system
//! interrupt occurs. This function also masks off the interrupt in the
//! interrupt controller so that the interrupt handler no longer is called.
//!
//! \sa Interrupt_registerInterrupt() for important information about
//! registering interrupt handlers.
//!
//! \return None.
//
//*****************************************************************************
extern void FlashCtl_unregisterInterrupt(void);
//*****************************************************************************
//
//! Initiates a sector erase of MAIN or INFO flash memory. Note that this
//! function simply initaites the sector erase, but does no verification
//! which is required by the flash controller. The user must manually set
//! and enable interrupts on the flash controller to fire on erase completion
//! and then use the FlashCtl_verifyMemory function to verify that the sector
//! was actually erased
//!
//! \param addr The start of the sector to erase. Note that with flash,
//! the minimum allowed size that can be erased is a flash sector
//! (which is 4KB on the MSP432 family). If an address is provided to
//! this function which is not on a 4KB boundary, the entire sector
//! will still be erased.
//!
//! \return None
//
//*****************************************************************************
extern void FlashCtl_initiateSectorErase(uint32_t addr);
/* The following functions are advanced functions that are used by the flash
* driver to remask a failed bit in the event of a post or pre verification
* failure. They are meant to be advanced functions and should not be used
* by the majority of users (unless you are writing your own flash driver).
*/
extern uint8_t __FlashCtl_remaskData8Post(uint8_t data, uint32_t addr);
extern uint8_t __FlashCtl_remaskData8Pre(uint8_t data, uint32_t addr);
extern uint32_t __FlashCtl_remaskData32Post(uint32_t data, uint32_t addr);
extern uint32_t __FlashCtl_remaskData32Pre(uint32_t data, uint32_t addr);
extern void __FlashCtl_remaskBurstDataPost(uint32_t addr, uint32_t size);
extern void __FlashCtl_remaskBurstDataPre(uint32_t addr, uint32_t size);
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
#endif // __FLASH_H__