|
发表于 2014-8-26 08:53:44
|
显示全部楼层
给你发个可以正常使用的Flash代码,希望对你有所帮助
- /*
- * flash.c
- *
- * Created on: 2013年10月23日
- * Author: keinYe<keinYe@foxmail.com>
- * Version: v1.0
- * Description: 内部flash擦除、写驱动。
- */
- #include "stm32f4xx.h"
- #include "flash.h"
- #include "global.h"
- #define MIN_SECTOR_SIZE 0x4000
- const uint32_t sector_addr[] =
- {
- 0x08000000, //16K
- 0x08004000, //16K
- 0x08008000, //16K
- 0x0800C000, //16K
- 0x08010000, //64K
- 0x08020000, //128K
- 0x08040000, //128K
- 0x08060000, //128K
- 0x08080000, //128K
- 0x080A0000, //128K
- 0x080C0000, //128K
- 0x080E0000 //128K
- };
- /*
- * Function: __inline void flash_unlock(void)
- * Parameter: none
- * Return: none
- */
- __inline void flash_unlock(void)
- {
- if (FLASH->CR & (1 << 31)) {
- FLASH->KEYR = FLASH_KEY1;
- FLASH->KEYR = FLASH_KEY2;
- }
- }
- /*
- * Function: __inline void flash_lock(void)
- * Parameter: none
- * Return: none
- */
- __inline void flash_lock(void)
- {
- FLASH->CR |= FLASH_CR_LOCK;
- }
- /*
- * Function: void flash_erase(uint32_t sector)
- * Parameter: sector: 擦除flash段号。
- * Return: none
- */
- void flash_erase(uint32_t sector)
- {
- flash_unlock();
- /* wait busy flag */
- while(BIT_TST(FLASH->SR, FLASH_SR_BUSY));
- FLASH->SR |= FLASH_SR_ERROR_MASK;
- FLASH->CR &= ~FLASH_CR_PSIZE_MASK;
- FLASH->CR |= FLASH_CR_PSIZE_32BIT;
- FLASH->CR &= ~FLASH_CR_SECTOR_MASK;
- FLASH->CR |= (sector << 3) | FLASH_CR_SER;
- FLASH->CR |= FLASH_CR_STRT;
- /* wait busy flag */
- while(BIT_TST(FLASH->SR, FLASH_SR_BUSY));
- FLASH->SR |= FLASH_SR_ERROR_MASK;
- FLASH->CR &= ~FLASH_CR_PSIZE_MASK;
- FLASH->CR &= ~(FLASH_CR_SECTOR_MASK | FLASH_CR_SER);
- }
- /*
- * Function: inline void flash_lock(void)
- * Parameter: none
- * Return: none
- */
- int32_t get_sector(uint32_t addr)
- {
- uint32_t i;
- for (i = 0; i < (sizeof(sector_addr)/sizeof(uint32_t)); i++)
- {
- if (addr == sector_addr[i])break;
- }
- if (i >= (sizeof(sector_addr)/sizeof(uint32_t)))return (-1);
- return i;
- }
- /*
- * Function: uint32_t flash_program(uint32_t addr, uint8_t *buf, uint32_t len)
- * Parameter: addr: 写flash 32位地址。
- * *buf: 写flash数据缓冲区。
- * len: 写flash数据长度。
- * Return: 0: 写flash完成。
- * 1: 写flash错误。
- */
- uint32_t flash_program(uint32_t addr, uint8_t *buf, uint32_t len)
- {
- flash_unlock();
- /* wait busy flag */
- while(BIT_TST(FLASH->SR, FLASH_SR_BUSY));
- FLASH->SR |= FLASH_SR_ERROR_MASK;
- BIT_SET(FLASH->CR, 0);
- while(len--)
- {
- if ((addr % MIN_SECTOR_SIZE) == 0)
- {
- if (get_sector(addr) >= 0)
- {
- BIT_CLR(FLASH->CR, 0);
- flash_erase(get_sector(addr));
- BIT_SET(FLASH->CR, 0);
- }
- }
- *(uint8_t*)addr = *buf;
- /* wait busy flag */
- while(BIT_TST(FLASH->SR, FLASH_SR_BUSY));
- FLASH->SR |= FLASH_SR_ERROR_MASK;
- if (*buf != *(uint8_t*)addr)return 1;
- addr++;buf++;
- }
- BIT_CLR(FLASH->CR, 0);
- flash_lock();
- return 0;
- }
复制代码
- /*
- * flash.h
- *
- * Created on: 2013年10月23日
- * Author: keinYe<keinYe@foxmail.com>
- * Version: v1.0
- * Description:
- */
- #ifndef __FLASH_H__
- #define __FLASH_H__
- #define FLASH_KEY1 ((uint32_t)0x45670123)
- #define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
- /* flash status register */
- #define FLASH_SR_BUSY 16
- #define FLASH_SR_ERROR_MASK 0xF3
- /* flash control flash */
- #define FLASH_CR_PSIZE_MASK (0x03 << 8)
- #define FLASH_CR_PSIZE_8BIT (0x00 << 8)
- #define FLASH_CR_PSIZE_16BIT (0x01 << 8)
- #define FLASH_CR_PSIZE_32BIT (0x02 << 8)
- #define FLASH_CR_PSIZE_64BIT (0x03 << 8)
- #define FLASH_CR_SECTOR_MASK (0xF8)
- #endif /* __FLASH_H__ */
复制代码 |
|