当前位置: 首页 > article >正文

国民技术N32G430开发笔记(8)- 内部Flash的读写操作

N32G430 内部Flash的读写操作

1、主存储区最大为 64KB,也称作主闪存存储器,包含 32 个 Page,用于用户程序的存放和运行,以及数 据存储。
在这里插入图片描述
每一页的大小为2K字节

2、IAP 升级我们将64K的flash分区如下:
Boot 0x8000000 – 0x8004000 16KB
Settings 0x8004000 – 0x8006000 8KB
App 0x8006000 – 0x800B000 20KB
Download 0x800B000 – 0x800FFFF 20KB

3、我们在程序里从0x8004000地址往flash写入一行字符串,然后再从flash读出。

新增flash.c flash.h文件

代码如下:

#include "flash.h"

// 擦除函数
void n32_flash_erase(uint32_t start_addr, uint32_t end_addr)
{
    int page_num = 0; 
    FLASH_Unlock();
    /* erase the flash pages */

    while(start_addr < end_addr)
    {
        page_num = (start_addr - N32_FLASH_BASE) / FLASH_PAGE_SIZE;
        if (FLASH_EOP != FLASH_One_Page_Erase(page_num * FLASH_PAGE_SIZE))
        {
            Max_Info("Flash EraseOnePage Error. Please Deal With This Error Promptly\r\n");
            FLASH_Lock();
            return;
        }
        start_addr += FLASH_PAGE_SIZE;
    }

    FLASH_Lock();
}

// 写函数
MI_BOOL n32_flash_write(MI_U32 dest_addr, MI_U8 *src, MI_U32 Len)
{
    MI_U32 i = 0;

    FLASH_Unlock();

    for(i = 0; i < Len; i += 4)
    {
        /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
        be done by byte */
        if(FLASH_EOP == FLASH_Word_Program((MI_U32)(dest_addr+i), *(uint32_t*)(src+i)))
        {
            /* Check the written value */
            if(*(uint32_t *)(src + i) != *(uint32_t*)(dest_addr+i))
            {
                /* Flash content doesn't match SRAM content */
                FLASH_Lock();            
                return -1;
            }
        }
        else
        {
            FLASH_Lock();            
            /* Error occurred while writing data in Flash memory */
            return -1;
        }
    }
    FLASH_Lock();            

    return 0;
}

// 读函数
MI_BOOL n32_flash_read(MI_U32 dest_addr, MI_U8* buff, MI_U32 Len)
{

    MI_U32 i;
    for(i = 0; i < Len; i++)
    {
        buff[i] = *(__IO MI_U8*)(dest_addr + i);
    }
    /* Return a valid address to avoid HardFault */
    return 0;
}

flash.h

#ifndef __FLASH_H__
#define __FLASH_H__

#include "type.h"
#include "main.h"

#define BOOT_START_ADDRESS      0x08000000U
#define BOOT_END_ADDRESS        0x08004000U
#define BOOT_SIZE = BOOT_END_ADDRESS - BOOT_START_ADDRESS

#define SETTINGS_START_ADDRESS  0x08004000U
#define SETTINGS_END_ADDRESS    0x08006000U
#define SETTINGS_SIZE = SETTINGS_END_ADDRESS - SETTINGS_START_ADDRESS

#define APP_START_ADDRESS       0x08006000U
#define APP_END_ADDRESS         0x0800B000U
#define APP_SIZE = APP_END_ADDRESS - APP_START_ADDRESS

#define DOWNLOAD_START_ADDRESS  0x0800B000U
#define DOWNLOAD_END_ADDRESS    0x0800FFFFU
#define DOWNLOAD_SIZE DOWNLOAD_END_ADDRESS - DOWNLOAD_START_ADDRESS



/* FLASH大小 : 64K */
#define N32_FLASH_SIZE         0x00010000UL
/* FLASH起始地址 */
#define N32_FLASH_BASE         0x08000000UL
/* FLASH结束地址 */
#define N32_FLASH_END          (STM32_FLASH_BASE | STM32_FLASH_SIZE)

#define FLASH_PAGE_SIZE          ((uint32_t)0x800)

#define STM32_FLASH_PAGE_NUM     (STM32_FLASH_SIZE / FLASH_PAGE_SIZE)



void n32_flash_erase(uint32_t start_addr, uint32_t end_addr) ;
MI_BOOL n32_flash_read(MI_U32 dest_addr, MI_U8* buff, MI_U32 Len);
MI_BOOL n32_flash_write(MI_U32 dest_addr, MI_U8 *src, MI_U32 Len);
#endif // __FLASH_H__

main.c

#include <string.h>
#include "main.h"
#include "bsp_led.h"
#include "bsp_delay.h"
#include "usart.h"
#include "timer.h"
#include "pwm.h"
#include "key_input.h"
#include "flash.h"
/**
 *\*\name   main.
 *\*\fun    main function.
 *\*\param  none.
 *\*\return none.
**/
int main(void)
{
	led_init();

	usart1_init();

	usart2_init();

	timer6_init();

	tim2_pwm_init();

	key_input_init();
	/* Delay 1s */
	SysTick_Delay_Ms(1000);

	n32_flash_erase(SETTINGS_START_ADDRESS,SETTINGS_END_ADDRESS);

	MI_CHAR  *data = "hello n32g430c8l7";
	MI_U8 r_data[24]= {0};
	SysTick_Delay_Ms(1000);

	n32_flash_write(SETTINGS_START_ADDRESS,(MI_U8 * )data,strlen(data));

	SysTick_Delay_Ms(1000);

	n32_flash_read(SETTINGS_START_ADDRESS,r_data,strlen(data));

	Max_Info("n32_flash_read  == %s\r\n",r_data);
	
	while(1)
	{
	
	}
}

烧入程序后打印如下:
在这里插入图片描述

擦除4页8k大小,
读出我们写入的字符串。


http://www.kler.cn/a/15900.html

相关文章:

  • 树状数组+概率论,ABC380G - Another Shuffle Window
  • MySQL缓存使用率超过80%的解决方法
  • 英伟达基于Mistral 7B开发新一代Embedding模型——NV-Embed-v2
  • js像循环数组那样循环一个数字,Array.from()
  • 路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受
  • FingerprintSimilarity和BulkTanimotoSimilarity的区别
  • Python程序员如何写简历容易找到好工作?分享4个制作简历的细节
  • API接口安全—webservice、Swagger、WEBpack
  • 【Hello Network】网络编程套接字(三)
  • 颜色空间转换RGB-YCbCr
  • 软考(中/高级)高频考点——进度管理
  • 【五一创作】mongoDB的应用场景以及Spring和mongodb的整合
  • 【LLM】离线部署ChatGLM-6B模型
  • 深度学习笔记之稀疏自编码器
  • MongoDB安装
  • [大家的项目] 获取主机IP地址
  • PAT A1019 General Palindromic Number
  • 阿里云国际版ACE与国内版ACE区别
  • 百万赞同:网络安全为什么缺人? 缺什么样的人?
  • 计算机视觉毕业后找不到工作怎么办?怒刷leetcode,还是另寻他路?
  • 界面控件DevExpress WinForm的垂直网格,让数据展示更灵活(二)
  • EBS R12.1 注册客户化应用的步骤
  • AlgoC++第八课:手写BP
  • “华为杯”第十七届中国研究生 数学建模竞赛-【华为杯】D题:无人机集群协同对抗(附优秀论文及python代码实现)
  • Redis常见问题/应用场景/面试题总结(含答案)
  • seurat -- 关于DE gene的讨论