4037|0

565

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【GD32L233C-START评测】5、Flash读写——使用内部Flash存储数据 [复制链接]

相关文章:

【GD32L233C-START评测】1、优点与缺点都很明显的GD32L233C-START(开箱)

【GD32L233C-START评测】2、非阻塞方式点灯,blink,blink,blink……

【GD32L233C-START评测】3、pwm实现呼吸灯

【GD32L233C-START评测】4、串口不定长数据接收

 

1、关于GD32 Flash

GD32 flash官方称为FMC。

 

2、关于GD32L233CCT6 flash

本次使用的GD32L233CCT6 flash大小为256k;
 可以看出,分为64页,从0-63页,每页大小为4kb;

手册上说,支持32位整字和16位半字编程,但是库函数只有整字编程。

 

3、代码实现

#define FLASH_PAGE_SIZE  		   		 	0x1000 //4k

void FlashWrite(uint16_t len,uint8_t  *data,uint32_t addr_start)
{	
	uint16_t i=0;
	uint32_t temp=0;
	uint32_t addr=addr_start;
	
	fmc_state_enum  fmc_state=FMC_READY;
	
	fmc_unlock();

	for(i=0;i<len/4;i++) 
	{		
		temp = (data[0]<<0)+(data[1]<<8)+(data[2]<<16)+(data[3]<<24);

		fmc_state=fmc_word_program(addr, temp);
		
		if(fmc_state!=FMC_READY)
		{
			return;
		}
		
		fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);
		
		data += 4;
		addr += 4;
	}
	
	if((len % 4)==3)
	{
		temp = (data[0]<<0)+(data[1]<<8)+(data[2]<<16);
		temp = temp | 0xff000000;
		fmc_state=fmc_word_program(addr,temp);
		
		fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);
	}
	else
	{
		if((len % 4)==2)
		{
			temp = (data[0]<<0)+(data[1]<<8);
			temp = temp | 0xffff0000;
		    fmc_state=fmc_word_program(addr,temp);
			
			fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);

		}
		else
		{
			if((len % 4)==1)
			{
				temp = (data[0]<<0);
				temp = temp |  0xffffff00 ;
				fmc_state=fmc_word_program(addr,temp);
				
				fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);
			}
		}
	}

	fmc_lock();
}


void FlashRead(uint16_t len,uint8_t *outdata,uint32_t addr_start)
{	
	uint32_t addr;
	uint16_t i;
	
	addr = addr_start;
	
	for(i=0;i<len;i++) 
	{
		*outdata = *(uint8_t*) addr;
		addr = addr + 1;
		outdata++;
	}
}


void FlashErase(uint32_t start, uint32_t end)
{
	uint32_t EraseCounter;
	
	fmc_state_enum fmc_state=FMC_READY;

	  /* unlock the flash program/erase controller */
    fmc_unlock();

    /* clear all pending flags */
	fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);

    /* erase the flash pages */
    while(start < end)
	{
		EraseCounter = start/FLASH_PAGE_SIZE;
        fmc_state=fmc_page_erase(EraseCounter*FLASH_PAGE_SIZE);
		if(fmc_state!=FMC_READY)
		{
			return;
		}
		
		fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR);

		start += FLASH_PAGE_SIZE;
    }

    /* lock the main FMC after the erase operation */
    fmc_lock();
}

 

4、读写测试

使用最后一页(0x0803E000-0x0803 FFFF),测试读写。

#define APP_DATA_SATRT_ADDR  		   		 	0x0803E000 //4k

#define TEST_DATA_LEN    11
uint8_t WriteData[TEST_DATA_LEN]={1,2,3,4,5,6,7,8,9,10,11};
uint8_t  ReadData[TEST_DATA_LEN]={0,0,0,0,0,0,0,0,0,0 ,0};

void FlashTest(void)
{
	FlashErase(APP_DATA_SATRT_ADDR, APP_DATA_SATRT_ADDR+FLASH_PAGE_SIZE);
	FlashWrite(TEST_DATA_LEN,WriteData,APP_DATA_SATRT_ADDR);
	FlashRead(TEST_DATA_LEN,ReadData, APP_DATA_SATRT_ADDR);
	
	printf("Write Data[");
	for(uint8_t i=0;i<TEST_DATA_LEN;i++)
	{
		printf(" %d",WriteData[i]);
	}
	printf("]\r\n");

	
	printf("Read Data[");
	for(uint8_t i=0;i<TEST_DATA_LEN;i++)
	{
		printf(" %d",ReadData[i]);
	}
	printf("]\r\n");
}

 

5、实验现象

 可以发现,写入的和读出的数据是一样的。

 

 

此帖出自GD32 MCU论坛
点赞 关注
个人签名stm32/LoRa物联网:304350312
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
常用网络命令

常用网络命令 计算机网络的主要优点是能够实 ...

各大公司IC类免费样品申请

TPS2000系列数字存储示波器 详细资料申请 http://digital.ni.com/worldwide/china.nsf/sb/Download?OpenDocument&node=162000_zh ...

ucosii在STM32中的移植

10740

液晶1602 显示汉字研究

液晶1602显示字符研究 1602是一款最常用也是最便宜的液晶显示屏。最多可以显示两行标准字符,每行最多可以显示16个字符。 1602 ...

电容的安秒积和电感的伏秒积

  《电工学》或者《电路分析》教材中,对电容的定义是这样的,如图(01),满足图(01)式的电路元件,就是电容。式中i和u都是时间 ...

邀您参加Microchip在线研讨会——为您的IoT传感器设计节能型解决方案

Microchip将于6月29日(周二)举办题为《为您的IoT传感器设计节能型解决方案》的在线研讨会。 543966 在设计电池供电 ...

浅谈驱动芯片的绝缘安规标准

众所周知,各个行业各个领域都有其需要遵循的标准规范,一般会对其产品需要达到的使用条件提出各方面的要求。诸如电机驱动、光伏 ...

【HC32F4A0开发板测评】+I2S语音播放测试

本帖最后由 jinglixixi 于 2023-2-22 09:20 编辑 在HC32F4A0开发板上,为进行音频播放配置了I2S音频电路,所用的芯片为WM8731 ...

超声片/超声换能器/压电陶瓷片驱动波形

超声片/超声换能器/压电陶瓷片驱动波形必须用正弦波 才有良好的效果,比如电声转换效率、波形失真度、功率衰减等;很多负载必须 ...

MicroPython ESP32S3 蓝牙 每包字节大小问题求助

求助各位大佬 我用2块ESP32S3开发板(MicroPython 1.22),1块服务端1块客户端,蓝牙通信已经成功,也交换了MTU,但服务端每 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表