单片机学习小组
直播中

刘艳

7年用户 2299经验值
私信 关注

nuc505芯片的内部FLASH的怎么用作保存参数?

新塘nuc505芯片的内部FLASH的怎么用作保存参数,有例程吗

bsp包下 samplecode\stdDriver\SPIM_IO例程

回帖(1)

郭中

2024-5-14 16:49:04
可以使用 NUC505 芯片的内部 FLASH 来保存参数,以下是一个简单的实现示例:

1. 首先,在 BSP 包的 samplecodestdDriver 目录下,找到 SPIM_IO 例程。

2. 在该例程的主文件 main.c 中,添加以下代码段:

```
#include "NUC505Series.h"

#define PARAM_ADDR  (0x000F8000)    // 参数保存到内部 FLASH 的地址
#define PARAM_SIZE  (64)            // 参数大小为 64 字节

// 从内部 FLASH 中读取参数
void read_param(void *param_buf)
{
    uint32_t u32Data;
    uint8_t *pu8Param = (uint8_t *)param_buf;
    int i;
   
    FMC_ENABLE_ISP();      // 使能 ISP
    FMC_Read(PARAM_ADDR, &u32Data);  // 从 FLASH 中读取一个字
    for (i = 0; i < PARAM_SIZE; i++)
    {
        if (i % 4 == 0)
        {
            FMC_Read(PARAM_ADDR + i, &u32Data);   // 每 4 字节读取一次
        }
        pu8Param[i] = (u32Data >> ((i % 4) * 8)) & 0xFF;    // 将读取到的字节转换为参数数据
    }
    FMC_DISABLE_ISP();     // 关闭 ISP
}

// 将参数保存到内部 FLASH 中
void save_param(void *param_buf)
{
    uint32_t u32Data;
    uint8_t *pu8Param = (uint8_t *)param_buf;
    int i;
   
    FMC_ENABLE_ISP();      // 使能 ISP
    FMC_Erase(PARAM_ADDR);  // 擦除内部 FLASH
    for (i = 0; i < PARAM_SIZE; i++)
    {
        if (i % 4 == 0 && i > 0)
        {
            FMC_Write(PARAM_ADDR + i - 4, u32Data);    // 每 4 字节写入一次
        }
        u32Data &= ~(0xFF << ((i % 4) * 8));
        u32Data |= (pu8Param[i] << ((i % 4) * 8));   // 将参数数据转换为字节并写入
    }
    FMC_Write(PARAM_ADDR + i - 4, u32Data);    // 写入最后 4 个字节
    FMC_DISABLE_ISP();     // 关闭 ISP
}

// 主函数
int main()
{
    uint8_t param_buf[PARAM_SIZE];
   
    // 从内部 FLASH 中读取参数
    read_param(param_buf);
   
    // 在此处修改参数值
   
    // 将参数保存到内部 FLASH 中
    save_param(param_buf);
   
    // ...
    return 0;
}
```

3. 这里的 `PARAM_ADDR` 宏定义为参数保存到内部 FLASH 的起始地址,可以根据需要自行设置。`PARAM_SIZE` 宏定义为参数的大小,也可以根据实际情况进行设置。

4. `read_param()` 函数用于从内部 FLASH 中读取参数,`save_param()` 函数用于将参数保存到内部 FLASH 中。在调用这两个函数时,必须先使能 ISP(通过调用 `FMC_ENABLE_ISP()` 函数实现),操作完成后再关闭 ISP(通过调用 `FMC_DISABLE_ISP()` 函数实现)。

5. 在主函数中,首先调用 `read_param()` 函数从内部 FLASH 中读取参数,然后可以修改参数值。最后调用 `save_param()` 函数将修改后的参数保存到内部 FLASH 中。

注意:在使用内部 FLASH 保存参数时,要考虑到内部 FLASH 的寿命问题。频繁地擦写或写入操作会影响内部 FLASH 的使用寿命,因此应该尽量避免频繁修改参数值。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分