加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:29:15 所属栏目:百科 来源:网络整理
导读:由于在对内部Flash进行擦写操作时,不能对Flash进行读操作,否则会造成擦写停止。而正常情况下,中断向量表以及中断处理函数,都是放在Flash内的。因此,对内部Flash进行擦写操作时,一般会将系统的总中断关闭,暂时性不去响应外部中断。这样,系统就仅仅是

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读