This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
问题一:EALLOW;EDIS;何时用何时不用呢?有文档吗?
问题二:EALLOW;解除受保护的寄存器后,如果我操作擦除FLASH过程中会不会因为被中断影响我的擦除FLASH?因为我再调试的过程中,通过以下函数方式去执行,会出现进入非法中断如图片。
void main()
{
DINT;//关闭中断
EALLOW;
//以下是执行擦除FLASH的操作函数
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 100);
if(oReturnCheck != Fapi_Status_Success)
{
// Check Flash API documentation for possible errors
Example_Error(oReturnCheck);//cs
}
oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
oReturnCheck = Fapi_Status_Success;
// Check Flash API documentation for possible errors
if(oReturnCheck == Fapi_Status_Success)
{
for(i = 0; i < EraseSectorNum; i++)
{
SysCtl_serviceWatchdog();
// Erase Flash Bank0 sector6
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
(uint32 *)(Bzero_Sector5_start + 0x1000 * i));
// Wait until FSM is done with erase sector operation
while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
// Read FMSTAT register contents to know the status of FSM after
// erase command to see if there are any erase operation related errors
oFlashStatus = Fapi_getFsmStatus();
if(oFlashStatus != 0)
{
FMSTAT_Fail();
}
EDIS;
EINT; // 开中断
}
void Example_Error(Fapi_StatusType status)
{
// Error code will be in the status parameter
__asm(" ESTOP0");
}
user6394966 说:问题一:EALLOW;EDIS;何时用何时不用呢?有文档吗?
该指令都是一个内联汇编指令,允许用户从C代码设置或清除ST1状态寄存器中的位。它们的定义如下(一般在设备头文件内):
#define EINT __asm(" clrc INTM")
#define DINT __asm(" setc INTM")
#define ERTM __asm(" clrc DBGM")
#define DRTM __asm(" setc DBGM")
#define EALLOW __asm(" EALLOW")
#define EDIS __asm(" EDIS")
更多信息您可以参考
https://www.ti.com/lit/ug/spru430f/spru430f.pdf 的
EDIS —Disable Write Access to Protected Registers ......................................................................... 191
EINT —Enable Maskable Interrupts (Clear INTM Bit) ......................................................................... 192
user6394966 说:问题二:EALLOW;解除受保护的寄存器后,如果我操作擦除FLASH过程中会不会因为被中断影响我的擦除FLASH?
关于该问题,建议您看一下TI例程的用法。 FLASH API在执行擦除和写入动作时要避免被打断(如:中断服务程序(ISRs)、掉电停止等)。
//########################################################################### // // FILE: flash_programming_dcsm_cpu01.c // // TITLE: Flash Programming with DCSM. // //! \addtogroup cpu01_example_list //! <h1> Flash Programming with DCSM </h1> //! //! This example programs secure memory //! // //########################################################################### // $TI Release: F2837xD Support Library v3.10.00.00 $ // $Release Date: Tue May 26 17:13:46 IST 2020 $ // $Copyright: // Copyright (C) 2013-2020 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 "F28x_Project.h" #include <string.h> #include "flash_programming_dcsm_c28.h" #include "F021_F2837xD_C28x.h" // // Defines // #define WORDS_IN_FLASH_BUFFER 0xFF #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 15009000 #define ramFuncSection ".TI.ramfunc" #else #define ramFuncSection "ramfuncs" #endif #endif // // Globals // #pragma DATA_SECTION(Buffer,"BufferDataSection"); uint16 Buffer[WORDS_IN_FLASH_BUFFER + 1]; uint32 *Buffer32 = (uint32 *)Buffer; // // Function Prototypes // void Example_Error(Fapi_StatusType status); void Example_Done(void); void Example_CallFlashAPI(void); // // Main // void main(void) { // // Initialize System Control. Enable Peripheral Clocks. // InitSysCtrl(); // // Disable CPU interrupts. // DINT; // // Initialize PIE control registers to default state. // InitPieCtrl(); // // Disable CPU interrupts and clear all CPU interrupt flags. // IER = 0x0000; IFR = 0x0000; // // Initialize PIE vector table with pointers to the default // Interrupt Service Routines (ISR). // InitPieVectTable(); // // Call the Flash API functions for this example. // Example_CallFlashAPI(); } // // Example_CallFlashAPI - This function will interface to the flash API. // Flash API functions used in this function are // executed from RAM. // #pragma CODE_SECTION(Example_CallFlashAPI, ramFuncSection); void Example_CallFlashAPI(void) { uint32 u32Index = 0UL; uint16 i = 0U; Fapi_StatusType oReturnCheck; volatile Fapi_FlashStatusType oFlashStatus; Fapi_FlashStatusWordType oFlashStatusWord; // // Grab flash semaphore for Zone1 to enable access to flash registers. // EALLOW; DcsmCommonRegs.FLSEM.all = 0xA501; EDIS; // // Call flash initialization to setup flash waitstates. // This function must reside in RAM. // InitFlash(); // // Disable ECC. // EALLOW; Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0; // // This function is required to initialize the Flash API based on system // frequency before any other Flash API operation can be performed. // oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 120); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // Example_Error(oReturnCheck); } // // Fapi_setActiveFlashBank function sets the flash bank and FMC for further // flash operations to be performed on the bank. // oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // Example_Error(oReturnCheck); } // // Erase Sector C. // oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *)Bzero_SectorC_start); // // Wait until FSM is done with erase sector operation. // while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) { } // // Verify that Sector C is erased. The erase step itself does verification // as it goes. This verify is a second verification that can be done. // oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorC_start, Bzero_16KSector_u32length, &oFlashStatusWord); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // If erase command fails, use Fapi_getFsmStatus() function to get the // FMSTAT register contents to see if any of the EV bit, ESUSP bit, // CSTAT bit or VOLTSTAT bit is set. Refer to API documentation for // more details. // Example_Error(oReturnCheck); } // // Erase Sector B. // oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *)Bzero_SectorB_start); // // Wait until FSM is done with erase sector operation. // while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) { } // // Verify that Sector B is erased. The erase step itself does verification // as it goes. This verify is a second verification that can be done. // oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorB_start, Bzero_16KSector_u32length, &oFlashStatusWord); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // If erase command fails, use Fapi_getFsmStatus() function to get the // FMSTAT register contents to see if any of the EV bit, ESUSP bit, // CSTAT bit or VOLTSTAT bit is set. Refer to API documentation for // more details. // Example_Error(oReturnCheck); } // // A data buffer of max 8 words can be supplied to the program function. // Each word is programmed until the whole buffer is programmed or a // problem is found. However, to program a buffer that has more than 8 // words, program function can be called in a loop to program 8 words for // each loop iteration until the whole buffer is programmed. // // For example, program 0xFF bytes in flash Sector C along with auto- // generated ECC. // // // For example fill a buffer with data to program into the flash. // for(i=0;i<=WORDS_IN_FLASH_BUFFER;i++) { Buffer[i] = i; } // // Program buffer into Sector C with ECC. // for(i=0, u32Index = Bzero_SectorC_start; (u32Index < (Bzero_SectorC_start + WORDS_IN_FLASH_BUFFER)) && (oReturnCheck == Fapi_Status_Success); i+= 8, u32Index+= 8) { oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index,Buffer+i, 8, 0, 0, Fapi_AutoEccGeneration); // // Wait until FSM is done with program operation. // while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy) { } if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // Example_Error(oReturnCheck); } // // Read FMSTAT register contents to know the status of FSM after // program command for any debug. // oFlashStatus = Fapi_getFsmStatus(); // // Verify the values programmed. The program step itself does // verification as it goes. This verify is a second verification that // can be done. // oReturnCheck = Fapi_doVerify((uint32 *)u32Index, 4, Buffer32+(i/2), &oFlashStatusWord); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // Example_Error(oReturnCheck); } } // // Program buffer into Sector B with out ECC. // Disable ECC so that an error is not generated when reading flash contents // without ECC programmed. // Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0; for(i=0, u32Index = Bzero_SectorB_start; (u32Index < (Bzero_SectorB_start + WORDS_IN_FLASH_BUFFER)) && (oReturnCheck == Fapi_Status_Success); i+= 8, u32Index+= 8) { oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index, Buffer+i, 8, 0, 0, Fapi_DataOnly); // // Wait until FSM is done with program operation. // while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy) { } if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // Example_Error(oReturnCheck); } // // Read FMSTAT register contents to know the status of FSM // after program command for any debug. // oFlashStatus = Fapi_getFsmStatus(); // // Verify the values programmed. The program step itself does // verification as it goes. This verify is a second verification that // can be done. // oReturnCheck = Fapi_doVerify((uint32 *)u32Index, 4, Buffer32+(i/2), &oFlashStatusWord); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // Example_Error(oReturnCheck); } } // // Erase the sectors that we have programmed above. // Erase Sector C. // oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *)Bzero_SectorC_start); // // Wait until FSM is done with erase sector operation. // while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) { } // // Verify that Sector C is erased. The erase step itself does verification // as it goes. This verify is a second verification that can be done. // oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorC_start, Bzero_16KSector_u32length, &oFlashStatusWord); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // If erase command fails, use Fapi_getFsmStatus() function to get the // FMSTAT register contents to see if any of the EV bit, ESUSP bit, // CSTAT bit or VOLTSTAT bit is set. Refer to API documentation for // more details. // Example_Error(oReturnCheck); } // // Erase Sector B. // oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *)Bzero_SectorB_start); // // Wait until FSM is done with erase sector operation. // while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) { } // // Verify that Sector B is erased. The erase step itself does verification // as it goes. This verify is a second verification that can be done. // oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorB_start, Bzero_16KSector_u32length, &oFlashStatusWord); if(oReturnCheck != Fapi_Status_Success) { // // Check Flash API documentation for possible errors. // If erase command fails, use Fapi_getFsmStatus() function to get the // FMSTAT register contents to see if any of the EV bit, ESUSP bit, // CSTAT bit or VOLTSTAT bit is set. Refer to API documentation for // more details. // Example_Error(oReturnCheck); } // // Enable ECC. // Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0xA; // // Release flash semaphore. // DcsmCommonRegs.FLSEM.all = 0xA500; EDIS; // // Example is done here. // Example_Done(); } // // Example_Error - For this example, if an error is found just stop here // #pragma CODE_SECTION(Example_Error,ramFuncSection); void Example_Error(Fapi_StatusType status) { // // Error code will be in the status parameter. // ESTOP0. // __asm(" ESTOP0"); } // // Example_Done - For this example, once we are done just stop here // #pragma CODE_SECTION(Example_Error,ramFuncSection); void Example_Done(void) { // // ESTOP0. // __asm(" ESTOP0"); for(;;) { } } // // End of file //
Flash API不会配置(启用/禁用)任何中断。另外Flash API执行是可中断的。但是,不应从正在进行擦除/编程操作的闪存存储区进行任何读/取访问。
Flash API execution is interruptible. However, there should not be any read/fetch access from the Flash bank on which an erase/program operation is in progress. I
请参见 Flash API指南(http://www.ti.com/lit/pdf/spnu628)中的2.3.3 Key Facts For Flash API Usage
In single-bank devices, the Flash API functions, the user application functions that call the Flash API functions, and any ISRs (Interrupt service routines,) must be executed from RAM.