|
本帖最后由 Dheevara 于 2023-10-10 16:07 编辑
本例程仅针对HX280025C-ECD本版,
如需移植到28027/28034/28035/280049等平台,需要注意.ld文件(FLASH地址)的地址及FLASH_API差异。
FLASH API可参考官网的gitee。
1:建立280025空白工程;
2:修改xxFlash.ld文件,以下红色内容为修改部分,新增PARA_AREA,其起始地址为0x630000;
OUTPUT_ARCH( "riscv" )
ENTRY(_start)
MEMORY
{
/*PAGE 0:*/
BOOT_RSVD(rwx) : ORIGIN = 0x0 , LENGTH = 0x200
PRAMM0 (rwx) : ORIGIN = 0x200 , LENGTH = 0x600 /* RAM M0*/
PRAMM1 (rwx) : ORIGIN = 0x800 , LENGTH = 0x800 /* RAM M1*/
PRAMLS4567(rwx) : ORIGIN = 0x10000 , LENGTH = 0x8000
RAMGS0(rwx) : ORIGIN = 0x20000 , LENGTH = 0x2000
FlashRegs_FILE (rwx) : ORIGIN = 0x7AF800 , LENGTH = 0x400
BEGIN(rwx) : ORIGIN = 0x600000 , LENGTH = 0x10
FLASH (rwx) : ORIGIN = 0x600010 , LENGTH = 0x30000
PARA_AREA(rwx) : ORIGIN = 0x630000 , LENGTH = 0x0FFF0 /* FLASH*/
USER_OTP_FILE(rw) : ORIGIN = 0x7A0000 , LENGTH = 0x800 /* on-chip UserOTP */
BootRom_FILE (rx) : ORIGIN = 0x7E0000 , LENGTH = 0x20000 /* on-chip Bootrom */
IER_REGISTER_FILE(rw) : ORIGIN = 0x100C10 , LENGTH = 0x04
IFR_REGISTER_FILE(rw) : ORIGIN = 0x100D10 , LENGTH = 0x04
}
新增以下红色部分,指定 .parameters在PARA_AREA区域内。
/* text: test code section */
. = 0x00600000;
.codestart : { *(codestart) } > BEGIN
. = 0x00630000;
.parameters : {KEEP(*(.parameters)) } > PARA_AREA
. = 0x00600010;
.text.init : { *(.text.init) } > FLASH
3:在main.c 指定数组或结构体在需要设定的地址;
1)const CODE_SECTION(".parameters") int Para_array[4]={5,6,3,4};
2)const CODE_SECTION(".parameters") struct paras saved;
以下测试 在 0x630000地址(即扇区96开始的FLASH空间)存放 一些典型参数(整形+浮点+数组 组合),在扇区96的内容被FLASH_API修改后,读出的参数被修改。
在main.c添加结构体
union vars
{
uint32 i_value;
float f_value;
};
union vars test_var;
struct paras
{
int32 para1;
union vars var1;
int32 buff[10];
};
在ROM_Flash_API_test1中修改0x630000起始 区域的内容
void CODE_SECTION("ramfuncs")
ROM_Flash_API_test1()
{
// 初始化Flash API, DSP的运行频率为160MHz
(* Fapi_initializeAPI)(160);
/* 擦除第120扇区
* HXS320F280025C总共有128个Sector,每个Sector的大小是2048 Byte
* Flash Addr的范围为0x600000~0x63FFFF
* */
Erase_result = (* Flash280025_SectorErase)(96,0,NULL);
if(Erase_result != 0)
{
Fail();
}
for(i=0;i<8;i++)
{
program_buffer = i;
}
//修改program_buffer[1]参数
test_var.f_value = 1.2345f;
program_buffer[1] = test_var.i_value;
/* 写Buffer[LEN]到第120扇区,
* Flash280025_Program()写入的时候,地址需要32 Byte对齐,一次写入32个Byte
* 因此,写满一个2k Byte大小的Sector,需要调用64次Flash280025_Program()
* 120扇区的偏移地址是120 * 2048 = 245760(0x3C000)
* Flash280025_Program
* */
for(j=0; j<64; j++)//64x8
{
Program_result = (* Flash280025_Program) \
((uint32 *)(0x630000 + 32*j),program_buffer,8,NULL);
if(Program_result != 0)
{
Fail();
}
}
Success();
}
int main(void)
{
char i;
Device_init();
ROM_Flash_API_test1();
while(1)
{
}
return 0;
}
在Device_init(); 处打断点
下载调试可见:
运行到while(1)
以上已完成了参数的修改与读取,
实际应用中一般在通讯或人机界面中修改参数值,调用ROM_Flash_API_test1()即可。
受上传大小限制,此处只提供 main.c、FlashApi.h、.ld文件,添加到空白工程覆盖同名文件即可:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|