打印
[APM32F0]

操作APM32F030片内FLASH,提高自己的LEVEL。

[复制链接]
994|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
BDW杜兰特|  楼主 | 2022-8-2 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#技术资源# #申请原创# #有奖活动# 我们操作单片机的片内FLASH,我们需要首先要知道FLASH是什么。FLASH闪存 闪存的英文名称是"Flash Memory",一般简称为"Flash",它属于内存器件的一种,是一种不挥发性( Non-Volatile )内存。闪存的物理特性与常见的内存有根本性的差异:目前各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存;闪存在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。
操作flash步骤如下:先将FLASH解锁-->清除相关标志位-->擦除页地址-->清除相关标志位-->写入数据-->清除相关标志位-->flash上锁
相关代码如下:
#include "Board.h"
#include "stdio.h"
#include "apm32f0xx_fmc.h"

/** printf function configs to USART2*/
#define DEBUG_USART  USART2
uint32_t testValue_ROM __attribute__((at(0x8001800)))=10;//定义了32位的变量在ROM当中
uint32_t temp;

/** Delay */
void Delay(void);

/*!
* [url=home.php?mod=space&uid=247401]@brief[/url]       Main program
*
* @param       None
*
* @retval      None
*
* @note
*/
int main(void)
{
          testValue_ROM++;
    uint32_t addr ;//定义32位的地址数据
   
    APM_MINI_COMInit(COM2);

    /** Unlock Flash for Clear or Write*/
    FMC_Unlock();//解锁FLASH
         
     temp=0x08001800;
           temp++;
   
        FMC_ClearStatusFlag(FMC_FLAG_OC);//清除这些标志位
        FMC_ClearStatusFlag(FMC_FLAG_WPE);
        FMC_ClearStatusFlag(FMC_FLAG_PE);
    addr = 0x08001850;

   
    while(FMC_STATE_BUSY==FMC_ErasePage(addr));//擦除页地址,返回BUSY,等待擦除完成
           FMC_ClearStatusFlag(FMC_FLAG_OC);//再次清理相关标志位
           FMC_ClearStatusFlag(FMC_FLAG_WPE);
           FMC_ClearStatusFlag(FMC_FLAG_PE);

   
    while(FMC_STATE_BUSY==FMC_ProgramWord(0x08001800, temp));//写入32位地址数据,返回BUSY,等待操作完成
                FMC_ClearStatusFlag(FMC_FLAG_OC);//清除标志位
          FMC_ClearStatusFlag(FMC_FLAG_WPE);
           FMC_ClearStatusFlag(FMC_FLAG_PE);
   
    FMC_Lock();//锁上FLASH

    for (;;)
    {

    }
}

/*!
* @brief       Delay
*
* @param       None
*
* @retval      None
*
* @note
*/
void Delay(void)
{
    volatile uint32_t delay = 0xff5;

    while (delay--);
}
/*!
* @brief       Redirect C Library function printf to serial port.
*              After Redirection, you can use printf function.
*
* @param       ch:  The characters that need to be send.
*
* @param       *f:  pointer to a FILE that can recording all information
*              needed to control a stream
*
* @retval      The characters that need to be send.
*
* @note
*/
int fputc(int ch, FILE* f)
{
    /** send a byte of data to the serial port */
    USART_TxData(DEBUG_USART, (uint8_t)ch);

    /** wait for the data to be send  */
    while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);

    return (ch);
}

该代码是我改写官方提供的DEMO写的。大家可以参考一下。
最后可以用DEBUG进行调试查找上面代码中0x08001800的地址可以找到,该地址的值已经变为了11,这说明我们已经操作FLASH成功
友情提示一下各位:有些小伙伴会碰见写入FLASH字节出现卡死的现象,单字节写入正常,双字节写入和多字节写入导致MCU死机,复位也没有效果,需要重新上电才会恢复正常。导致这种问题的原因是写入的地址没有对齐,导致FLASH卡死。

使用特权

评论回复
沙发
caigang13| | 2022-8-2 19:29 | 只看该作者
学习了,谢谢分享经验。

使用特权

评论回复
板凳
daichaodai| | 2022-8-4 19:41 | 只看该作者
这个算不算提高呢?

使用特权

评论回复
地板
chenqianqian| | 2022-8-5 08:09 | 只看该作者
能不能提高不知道

使用特权

评论回复
5
麻花油条| | 2022-8-5 11:31 | 只看该作者
提没提高自己的level不知道

使用特权

评论回复
6
MessageRing| | 2022-10-4 20:51 | 只看该作者
不知道算不算提高

使用特权

评论回复
7
jackcat| | 2022-11-1 09:42 | 只看该作者
换APM32的另一个型号的芯片 APM32E103VCT6

使用特权

评论回复
8
wangdezhi| | 2022-11-1 16:59 | 只看该作者
如何将APM32F072变量存储到片内flash的指定位置

使用特权

评论回复
9
alvpeg| | 2022-11-1 17:44 | 只看该作者
会触发HardFault,怎么解决   

使用特权

评论回复
10
bartonalfred| | 2022-11-1 18:12 | 只看该作者
https://download.csdn.net/download/wenjie2017/85911120

使用特权

评论回复
11
ccook11| | 2022-11-1 20:12 | 只看该作者
改写芯片内部Flash函数:写前关闭总中断,写后再打开总中断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

0

粉丝