由于在对内部Flash进行擦写操作时,不能对Flash进行读操作,否则会造成擦写停止。而正常情况下,中断向量表以及中断处理函数,都是放在Flash内的。因此,对内部Flash进行擦写操作时,一般会将系统的总中断关闭,暂时性不去响应外部中断。这样,系统就仅仅是执行擦写操作,而不会去Flash内进行读取指令等操作,因此保证Flash操作的正常进行。
硬件:TG STK
软件:处于测试目的,在程序中加入了systick产生的1ms定时。作为测试条件。用来测试Flash操作是否正常。
具体的Demo如下:
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include "efm32.h"
#include "efm32_chip.h"
#include "efm32_cmu.h"
#include "efm32_msc.h"
volatile uint32_t msTicks;
const unsigned char ucWriteIn[8] = {'a','b','c','d','e','f','g','h',};
unsigned char ucReadOut[8];
void SysTick_Handler(void)
{
msTicks++;
}
void main(void)
{
CHIP_Init();
/* Ensure core frequency has been updated */
SystemCoreClockUpdate();
//add a timer
if (SysTick_Config(SystemCoreClock / 1000)) while (1) ;
MSC_Init();//初始化MSC,并使能AUXHFRCO
__disable_irq(); //关闭总中断
if(MSC_ErasePage((uint32_t *)0x0fe00000) == mscReturnOk)
{
MSC_WriteWord((uint32_t *)0x0fe00000,ucWriteIn,8);
}
MSC_Deinit();
unsigned char *Point = (unsigned char *)0x0fe00000;
for(unsigned char i = 0; i < 8; i++)
{
if(*(Point + i) == ucWriteIn[i])continue;
else
{
while(1); // error occur
}
}
__enable_irq();//开启总中断
while(1);
}
从下图可以看到,操作已经正常完成。由于擦需要大约20ms的时间,而每写入4个byte,至少需要20uS的时间,因此,如果没有被1ms中断影响到则可以证明这个方法是OK的。