EFM32片内外设--MSC之一般操作

由于在对内部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的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值