#技术资源# #申请原创# #有奖活动# 我们操作单片机的片内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卡死。
|