|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2014-6-6 16:26:04
|
显示全部楼层
有兴趣的哥们帮我验证一下
flash.h
- /*
- ********************************************************************************
- *有限公司
- * 研 发 部
- *
- * All Rights Reserved
- *
- *------------------------------------文件信息-----------------------------------
- * 文 件 名: flash.h
- * 版 本: v0.01
- * 日 期: 2014.03.27
- * 作 者:
- * 描 述: flash操作函数
- ********************************************************************************
- */
- #ifndef __FLASH_H__
- #define __FLASH_H__
- /*
- ********************************************************************************
- * predefinitions
- ********************************************************************************
- */
- // Information Flash
- #define SEGMENT_LENGTH (0x40)
- #define SEGMENT_A_ADDR (0x10C0)
- #define SEGMENT_B_ADDR (0x1080)
- #define SEGMENT_C_ADDR (0x1040)
- #define SEGMENT_D_ADDR (0x1000)
- /*
- ********************************************************************************
- * include files
- ********************************************************************************
- */
- /*
- ********************************************************************************
- * functions declaration
- ********************************************************************************
- */
- extern void flash_read(int16u addr, int16u num, int8u *buf);
- extern void flash_write(int16u addr, int16u num, int8u *buf);
- #endif
复制代码
flash.c
- /*
- ********************************************************************************
- *
- * 有限公司
- * 研 发 部
- *
- * All Rights Reserved
- *
- *------------------------------------文件信息-----------------------------------
- * 文 件 名: flash.c
- * 版 本: v0.01
- * 日 期: 2014.03.27
- * 作 者:
- * 描 述: flash操作函数
- ********************************************************************************
- */
- /*
- ********************************************************************************
- * include files
- ********************************************************************************
- */
- #include "io430.h"
- #include "cpu.h"
- #include "flash.h"
- /*
- ********************************************************************************
- * predefinitions
- ********************************************************************************
- */
- /*
- ********************************************************************************
- * 函数名称: _erase_segment()
- * 输 入: addr 擦除段内的任意地址
- * 输 出:
- * 作 者:
- * 日 期:
- * 功能描述: 擦除段
- ********************************************************************************
- */
- //static void _erase_segment(int16u addr)
- //{
- // char *Flash_ptr; // Flash pointer
- //
- // Flash_ptr = (char *)addr; // Initialize Flash pointer
- // FCTL3 = FWKEY; // Clear Lock bit
- // FCTL1 = FWKEY + ERASE; // Set Erase bit
- //
- // *Flash_ptr = 0; // Dummy write to erase Flash seg
- //
- // FCTL1 = FWKEY; // Clear ERASE bit
- // FCTL3 = FWKEY + LOCK; // Set LOCK bit
- //}
- /*
- ********************************************************************************
- * 函数名称: _read_segment()
- * 输 入: addr 读单个Information Segment内的任意地址
- * buf 读取数据指针,大小为SEGMENT_LENGTH
- * 输 出:
- * 作 者:
- * 日 期:
- * 功能描述: 读取整个Information Segment的内容
- ********************************************************************************
- */
- static void _read_segment(int16u addr, char *buf)
- {
- char *Flash_ptr; // Flash pointer
- int i;
-
- // 赋值段起始地址
- Flash_ptr = (char *)(addr & ~(SEGMENT_LENGTH - 1)); // Initialize Flash pointer
-
- for (i = 0; i < SEGMENT_LENGTH; i++)
- {
- *buf++ = *Flash_ptr++; // read value from flash
- }
- }
- /*
- ********************************************************************************
- * 函数名称: _write_segment()
- * 输 入: addr 写入单个Information Segment内的任意地址
- * buf 写入数据指针,大小为SEGMENT_LENGTH
- * 输 出:
- * 作 者:
- * 日 期:
- * 功能描述: 将buf信息写入整个Information Segment
- ********************************************************************************
- */
- void _write_segment(int16u addr, char *buf)
- {
- char *Flash_ptr; // Flash pointer
- unsigned int i;
-
- // 赋值段起始地址
- Flash_ptr = (char *)(addr & ~(SEGMENT_LENGTH - 1)); // Initialize Flash pointer
- FCTL3 = FWKEY; // Clear Lock bit
- FCTL1 = FWKEY + ERASE; // Set Erase bit
- *Flash_ptr = 0; // Dummy write to erase Flash seg
-
- FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
-
- for (i = 0; i < 64; i++)
- {
- *Flash_ptr++ = *buf++; // Write value to flash
- }
-
- FCTL1 = FWKEY; // Clear WRT bit
- FCTL3 = FWKEY + LOCK; // Set LOCK bit
- }
- /*
- ********************************************************************************
- * 函数名称: flash_write()
- * 输 入: addr 地址
- * num 写入数据数量
- * buf 写入的数据
- * 输 出:
- * 作 者:
- * 日 期: 2014.05.06
- * 功能描述: 写入数据到flash中
- ********************************************************************************
- */
- //int _flash_write(int16u addr, int8u num, int8u *buf)
- //{
- // char *ptr;
- // char *buffer[SEGMENT_LENGTH];
- // int8u i;
- // int16u addr_start;
- //
- // addr_start = addr & (SEGMENT_LENGTH - 1);
- //
- // // 拷贝数据到临时缓存区
- // ptr = (char *)(addr_start);
- // for (i = 0; i < SEGMENT_LENGTH; i++)
- // {
- // buffer[i] = *ptr++;
- // }
- //
- // // 更改缓冲区数据
- // ptr = (char *)(buf + (addr - addr_start));
- // for (i = 0; i < num; i++)
- // {
- // buffer[addr - addr_start + i] = *ptr++;
- // }
- //
- // // 擦除段
- // _erase_segment(addr);
- //
- // // 回写数据到flash
- // _write_segment(addr_start, buffer);
- //}
- /*
- ********************************************************************************
- * 函数名称: flash_read()
- * 输 入: addr 地址
- * num 读取数据数量
- * buf 读取的数据
- * 输 出:
- * 作 者:
- * 日 期: 2014.05.06
- * 功能描述: 读取flash中的数据
- ********************************************************************************
- */
- void flash_read(int16u addr, int16u num, int8u *buf)
- {
- char *Flash_ptr; // Flash pointer
- int i;
-
- Flash_ptr = (char *)addr; // Initialize Flash pointer
-
- for (i = 0; i < num; i++)
- {
- *buf++ = *Flash_ptr++; // read value from flash
- }
- }
- /*
- ********************************************************************************
- * 函数名称: flash_write()
- * 输 入: addr 地址
- * num 写入数据数量最大为SEGMENT_LENGTH
- * buf 写入的数据
- * 输 出:
- * 作 者:
- * 日 期: 2014.05.06
- * 功能描述: 写入数据到flash中
- ********************************************************************************
- */
- void flash_write(int16u addr, int16u num, int8u *buf)
- {
- char *ptr;
- char buffer[SEGMENT_LENGTH];
- unsigned int i;
- unsigned char offset; // 偏移
- unsigned int first_segment; // 第一段地址
- unsigned int second_segment; // 第二段地址
-
- // MCLK/3 for Flash Timing Generator
- FCTL2 = FWKEY + FSSEL0 + FN1;
-
- offset = addr & (SEGMENT_LENGTH - 1);
- first_segment = addr & ~(SEGMENT_LENGTH - 1);
- second_segment = first_segment + SEGMENT_LENGTH;
-
- if (addr + num <= second_segment) // 操作处于单个段内
- {
- // 读数据到缓存
- _read_segment(first_segment, buffer);
-
- // 更改缓存数据
- ptr = buffer + offset; // offset
- for (i = 0; i < num; i++)
- {
- *ptr++ = *buf++;
- }
-
- // 回写数据到缓存
- _write_segment(first_segment, buffer);
- }
- else // 操作处于两个段内
- {
- //------操作第一段----------------
- // 读数据到缓存
- _read_segment(first_segment, buffer);
-
- // 更改缓存数据
- ptr = buffer + offset; // offset
- for (i = 0; i < SEGMENT_LENGTH - offset; i++)
- {
- *ptr++ = *buf++;
- }
-
- // 回写数据到缓存
- _write_segment(first_segment, buffer);
- //------操作第二段---------------
- // 读数据到缓存
- _read_segment(second_segment, buffer);
-
- // 更改缓存数据
- ptr = buffer; // offset = 0
- for (i = 0; i < num - (SEGMENT_LENGTH - offset); i++)
- {
- *ptr++ = *buf++;
- }
-
- // 回写数据到缓存
- _write_segment(second_segment, buffer);
- }
- }
复制代码 |
|