历史上的今天
今天是:2024年12月25日(星期三)
2018年12月25日 | STM32f103 —— 内部flash读写
2018-12-25 来源:eefocus
#ifndef _MCU_FLASH_H_
#define _MCU_FLASH_H_
#include "type.h"
// STM32C8T6 64KB FLASH,20KB RAM,1个扇区1KB,程序起始0x8000000
#define FLASH_START_ADDR ((uint32_t)0x8000000)
#define FLASH_END_ADDR ((uint32_t)(0x8000000 + FLASH_SECTOR_NUM * FLASH_SECTOR_SIZE))
#define FLASH_SECTOR_NUM 128 // 扇区数量
#define FLASH_SECTOR_SIZE 1024 // 扇区大小1KB
typedef enum
{
FLASH_FAILURE = 0,
FLASH_SUCCESS,
} flash_status_t;
//===========================================================================
flash_status_t FlashErase(uint32_t addr, uint8_t count);
uint32_t FlashWrite(uint32_t addr, uint8_t *buffer, uint32_t length);
uint32_t FlashRead(uint32_t addr, uint8_t *buffer, uint32_t length);
#endif /* _MCU_FLASH_H_ */
#include "mcu_flash.h"
#include
#include "stm32f10x_flash.h"
// addr:地址 count:块数量
flash_status_t FlashErase(uint32_t addr, uint8_t count)
{
uint8_t i;
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
for(i = 0; i < count; ++i)
{
if(FLASH_ErasePage(addr + i * FLASH_SECTOR_SIZE) != FLASH_COMPLETE)
{
return FLASH_FAILURE;
}
}
FLASH_Lock();
return FLASH_SUCCESS;
}
uint32_t FlashWrite(uint32_t addr, uint8_t *buffer, uint32_t length)
{
uint16_t i, data = 0;
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
for(i = 0; i < length; i += 2)
{
data = (*(buffer + i + 1) << 8) + (*(buffer + i));
if(FLASH_ProgramHalfWord((uint32_t)(addr + i), data) != FLASH_COMPLETE)
{
return i;
}
}
FLASH_Lock();
return length;
}
uint32_t FlashRead(uint32_t addr, uint8_t *buffer, uint32_t length)
{
memcpy(buffer, (void *)addr, length);
return length;
}
下一篇:STM32读写内部Flash
史海拾趣
|
书中提到的8237A 8259A 8253-PIT 8255A 8250 8251A这些片子总觉得不是很熟,不会编程,大家有什么好的建议,能让我掌握他们。有什么好的资料吗?… 查看全部问答> |
|
驱动使用DDK写的,不是DS+DDK,以前用DS+DDK的时候是应用把一个Event的HANDLE传进去,然后驱动里面用传进来的HANDLE生成一个KEVENT,应用那里启动一个线程,线程里面等待那个Event就行了,这样当发生中断时驱动的DPC就把KEVENT设置,应用的那个线程就 ...… 查看全部问答> |
|
在做430向SD卡写数据时候,SD卡可以,但是用SDHC卡初始化过程中CMD0的响应正确,ACMD41响应总是0x01,是不是argument有问题呢?… 查看全部问答> |
|
2012TI杯山东省大学生电子设计竞赛 基本仪器和主要元器件清单 1、基本仪器清单 数字电桥 直流稳压电源 量角器 米尺 四位半数字万用表 0~200℃温度 ...… 查看全部问答> |
|
请问在main中进入LPM4,在外部中断唤醒后在中断进入LPM3,这时程序是回到main中了... 首先在main吧,我运行了“_BIS_SR(LPM4_bits + GIE); // Enter LPM4” 先外部IO口中断函数中我又运行了“_BIS_SR(LPM3_bits + GIE);”,请问在此之后,程序是继续执行完中断函数后面的内容再进入LPM3,还是 ...… 查看全部问答> |




