公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

大佬们好,XMC1400的flash功能应该怎么用呢,有没有参考例程借鉴一下?

1 解答
lock attach
Attachments are accessible only for community members.
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

    我们有两种方式可以操作Flash,第一种可以使用ROM中的Flash API,第二种可以使用底层驱动库。

(1)ROM中的Flash API:

    - NVM_STATUS _NvmErase (uint32_t * PageAddr)
    - NVM_STATUS _NvmProgVerify(uint32_t * DataAddr, uint32_t *FlashAddr) 

    _NvmErase()的地址位于0x00000100,功能是擦除一页。

    _NvmProgVerify()的地址位于0x00000104,功能是先擦除(如有必要),再写一页,所以这个函数只能写一页,不能单独写一个Block。

    利用这两个API操作Flash的例程见6_1_XMC1000_Flash_BIROM.zip

(2)利用LLD操作Flash:

    - void XMC_FLASH_ErasePages(uint32_t *address, uint32_t num_pages);
    - void XMC_FLASH_WriteBlocks(uint32_t *address, const uint32_t*data, uint32_t num_blocks, bool verify); 

    XMC_FLASH_ErasePages()用于擦除多个页,XMC_FLASH_WriteBlocks()用于擦除多个Block.

    利用这两个 API 操作 Flash 的例程见 6_2_XMC1000_Flash_LLD.zip

    希望这能帮到您。

BR,

Owen

在原帖中查看解决方案

0 点赞
16 回复数
lock attach
Attachments are accessible only for community members.
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

    我们有两种方式可以操作Flash,第一种可以使用ROM中的Flash API,第二种可以使用底层驱动库。

(1)ROM中的Flash API:

    - NVM_STATUS _NvmErase (uint32_t * PageAddr)
    - NVM_STATUS _NvmProgVerify(uint32_t * DataAddr, uint32_t *FlashAddr) 

    _NvmErase()的地址位于0x00000100,功能是擦除一页。

    _NvmProgVerify()的地址位于0x00000104,功能是先擦除(如有必要),再写一页,所以这个函数只能写一页,不能单独写一个Block。

    利用这两个API操作Flash的例程见6_1_XMC1000_Flash_BIROM.zip

(2)利用LLD操作Flash:

    - void XMC_FLASH_ErasePages(uint32_t *address, uint32_t num_pages);
    - void XMC_FLASH_WriteBlocks(uint32_t *address, const uint32_t*data, uint32_t num_blocks, bool verify); 

    XMC_FLASH_ErasePages()用于擦除多个页,XMC_FLASH_WriteBlocks()用于擦除多个Block.

    利用这两个 API 操作 Flash 的例程见 6_2_XMC1000_Flash_LLD.zip

    希望这能帮到您。

BR,

Owen

0 点赞
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

您好,感谢您的解惑。

请问在使用擦除函数 XMC_FLASH_ErasePages和写入函数 XMC_FLASH_ErasePages时需不需要类似:解锁,关锁,清除标志位这种操作呢?

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

写单个 Block:
1) 把 NVMPROG.ACTION 设为 51H or 91H (51H 不带自动校验,91H 带自动校验)
2) 把 1 个 block 的数据写到对应的物理地址
3) 查询 NVMSTATUS.BUSY 来看写这个过程有没有结束
4) 如果使能校验功能,则查询 NVMSTATUS.VERR 来看校验有没有结束

写多个 Block:
1)把 NVMPROG.ACTION 设为 61H or A1H (61H 不带自动校验,A1H 带自动校验)
2)把 1 个/下一个 block 的数据写到对应的物理地址
3)查询 NVMSTATUS.BUSY 来看写这个过程有没有结束,如果 BUSY 位清 0,则跳到步骤2)
4)等到所有 Block 写完后,停止连续操作(NVMPROG.ACTION 设为 0)

擦除单页:
1)把 NVMPROG.ACTION 设为 92H
2)在要擦除的页地址范围内随意去写 1 个 Block
3)查询 NVMSTATUS.BUSY 来看写这个过程有没有结束

擦除多页:
1)把 NVMPROG.ACTION 设为 A2H
2)在要擦除的页地址范围内随意去写 1 个 Block
3)查询 NVMSTATUS.BUSY 来看写这个过程有没有结束,如果清 0 了,则再跳到步骤 2) 擦
下一页
4)直到要擦完全部需要擦除的页
5)停止连续擦除操作(NVMPROG.ACTION 设为 0)

BR,

Owen

0 点赞
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

感谢您的答复!

现在还想询问您一个小问题,我看到xmc4000系列的flash中有闪存的地址映射:S0到S11。S8开始用户可以使用。

并得知4000系列的flash起始地址:0x0C000000 ;结束地址:0x0C03FFFF

但我在xmc1400系列手册中却没有找到相关的数据知识。

我想询问您一下,xmc1404的flash地址是多少,并且我在哪个区间内使用flash不会影响芯片的正常运行呢?

 

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

    Owen_Su_0-1688545667386.png

Owen_Su_1-1688545708142.png

BR,

Owen

0 点赞
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

您好,在您百忙之中叨扰一下:

我得知了xmc1400系列芯片的Flash(200kb)分为了50个扇区

即:0x10001000 ~ 0x10001FFF  到  0x10032000 ~ 0x10032FFF。

当我使用 XMC_FLASH_ReadWord((uint32_t *)address) 函数准备获取0x10032000扇区的数据时,我的芯片就会死机,最终卡死位置为:

xiphi_0-1689060171031.pngxiphi_1-1689060217164.png

当我将函数内的address更改为0x10001000到0x10010FFF区间时,就不会出现这个问题,函数会返回正常的32位数字。

请问这是怎么回事,xmc1404芯片的0x10011000到0x10032FFF是不允许程序员访问的吗?

那我要使用flash存储功能最好使用第几扇区呢?

 

 

 

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好, 

    您可以查看一下代码中的linker_script.ld文件中MEMORY的地址配置,可能您配置的Flash(Rx)地址范围不包括0x10032000,存储功能的地址大小也是在ld文件中进行设置。希望这能帮到您。

Owen_Su_0-1689062190790.pngOwen_Su_1-1689062277127.png

BR,

Owen    

0 点赞
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

您好,我使用的keil5编译的,在工程里面没有找到linker_script.ld文件,请问keil5里面有类似的文件吗

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

    Keil中对应的文件是.sct文件,参考下图:

Owen_Su_0-1689065258289.png

    你可以对比我上条回复中的ld文件来确认一下对应的参数。

BR,

Owen

0 点赞
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

您好,我的sct文件内容如下

xiphi_0-1689067757592.png

参数应该是一样的,但是还是使用不了,现阶段能使用的flash大小只有64kb

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

    您可以将您的project分享给我,我这边帮您测试一下。

    或者您可以参考下图:

Owen_Su_0-1689129432591.png

BR,

Owen

0 点赞
lock attach
Attachments are accessible only for community members.
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

十分感谢您了

xiphi_0-1689129448075.png

现在的情况就是XMC_FLASH_ReadWord不能读取0x10011000到0x10032FFF这个区间

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

    您是想读取这一整个区间的值嘛?我利用以下两个函数是可以操作0x10032000这个地址的,而按照我上一条回复的方法也是可以直接获取这个地址的值。

Owen_Su_0-1689140863434.png

    用XMC_FLASH_ReadBlocks((uint32_t*)0x10032000, (uint32_t*)block_data1, 16);可以直接获取对应block数的值。您可以参考一下再进行测试。希望这能帮到您。

Owen_Su_1-1689141695391.png

BR,

Owen

0 点赞
xiphi
Level 3
Level 3
First like received 10 questions asked 25 sign-ins

您好,我并不是要获取所有区间的值。

如下图所示:

xiphi_0-1689150072451.pngxiphi_1-1689150097095.png

当我使用XMC_FLASH_ReadWord函数时,只要函数的实参是0x10011000U到0x10032000U这个区间的任何一个值,那么系统就会卡死。

据我了解,xmc1100系列的flash区间为0x10001000到0x10010FFF,我的XMC1404使用xmc1100规定的flash区间就不会出现卡死问题,但是我使用从xmc1300、xmc1400芯片扩展过的flash区间,那就会出现问题,这个区间就是0x10011000U到0x10032000U。

我想要知道这是为什么,该怎么解决。我的工程例程在上个回答中发给您了。

期待您的回复

 

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

您好,

    有几个问题:

    1)附件工程我无法打开,你使用的是哪个版本的KEIL以及编译器呢?我使用的是KEIL5.38,如果使用的是旧版本,可能其中的库没进行更新导致出错。

    2)还是跟刚刚说的一样,我测试之后一切正常,你可以参考一下我的代码。这边建议您新建一个工程先跑一下我这个代码,看看是不是能成功读取然后再将其移植。

#include "xmc_flash.h"
#include "xmc1_flash.h"

uint8_t block_data[256];
uint8_t block_data1[256];
uint32_t address;
uint32_t flag_save_flag[2];
/**

int main(void)
{

  for(uint16_t i=0; i<256; i++)
  {
    block_data[i] = i;
  }

  XMC_FLASH_ErasePages((uint32_t*)0x10032000, 1);
  XMC_FLASH_WriteBlocks((uint32_t*)0x10032000, (uint32_t*)block_data, 16, true);
	XMC_FLASH_ReadBlocks((uint32_t*)0x10032000, (uint32_t*)block_data1, 16);
	address = XMC_FLASH_ReadWord((uint32_t *)0x10032000);
	flag_save_flag[0] = XMC_FLASH_ReadWord((uint32_t *)0x10011000U);
	flag_save_flag[1] = XMC_FLASH_ReadWord((uint32_t *)0x10032000U);
	//address = *((uint32_t*)0x10032000);
	
  /* Placeholder for user application code. The while loop below can be replaced with user application code. */
  while(1U)
  {

  }
}

     3)读取WORD不成功,那其他擦写能否成功,还是先试一下我这个例子。

BR,

Owen

0 点赞
Owen_Su
Moderator
Moderator
Moderator
5 questions asked 750 replies posted 250 solutions authored

Hi,

    This thread will be closed due to long time no reply, you can create a new one if you have any other questions. Thanks for your understanding.

BR,

Owen

0 点赞