打印
[家电应用]

《中颖FLASH、类EEPROM 专用读写库》

[复制链接]
4920|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Cortex-M0|  楼主 | 2011-10-19 06:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Cortex-M0 于 2011-10-19 06:49 编辑

一、简介
自从上次编写了中颖单片机C51定点库、浮点库专用运算库函数,再接再励,完善中颖单片机通用库函数,特编写了《中颖FLASH、类EEPROM 专用读写库》,适于于中颖SH79/88/89系列对片内FLASH、类EEPROM 的读出和写入,完善对中颖单片机的技术支持。


二、中颖FLASH、类EEPROM 专用读写库 清单

/***************************************************************************************
Model  : flash-sh88f51.h
Description : Head file of defining global variable.
Author  : CLR
Create Time : 2011-10-19
Version ID  : 1.5
用  途      :中颖SH79/88/89F51系列MCU
作  者      :许意义
21ic  ID    :LAOXU
中颖论坛    : bbs.21ic.com   
****************************************************************************************/

#ifndef  _FLASH_SH88F51_H
#define  _FLASH_SH88F51_H

#pragma  MODDP2     // 打开中颖单片机双DPTR功能,加速数据传送
//#pragma  NOMODDP2    // 关闭中颖单片机双DPTR功能

/*--------------------------------------------------------------------------------------*/
/*      Resource - FLASH_SH88F51.asm            */
/*--------------------------------------------------------------------------------------*/

extern  uint8  read_eeprom_u8 (uint16 u16_addr, uint8 u8_FAC);     // 从指定的eeprom/flash地址中读出char型变量  
extern  uint16 read_eeprom_u16(uint16 u16_addr, uint8 u8_FAC);     // 从指定的eeprom/flash地址中读出int型变量  
extern  uint32 read_eeprom_u32(uint16 u16_addr, uint8 u8_FAC);     // 从指定的eeprom/flash地址中读出long型变量  
extern void read_eeprom_str(uint16 u16_addr, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从eeprom/flash中读出字符串, 存储在char*指向的RAM中
extern void erase_eeprom(uint8 u8_XPAGE, uint8 u8_FAC);           // 擦除eeprom/flash的指定页
extern bit write_eeprom_u8 (uint8  u8_data,  uint16 u16_addr, uint8 u8_FAC);  // 将char型变量写入指定的eeprom/flash中  
extern bit write_eeprom_u16(uint16 u16_data, uint16 u16_addr, uint8 u8_FAC);  // 将int型变量写入指定的eeprom/flash中
extern  bit write_eeprom_u32(uint32 u32_data, uint16 u16_addr, uint8 u8_FAC);  // 将long型变量写入指定的eeprom/flash中  
extern  bit write_eeprom_str(uint16 u16_addr, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 将char*指向的字符串写入指定的eeprom/flash中  
extern bit  read_eeprom_like(uint8 u8_XPAGE, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从指定页循环使用的eeprom/flash空间内,读出长度为u8_LEN的字符串  
extern bit write_eeprom_like(uint8 u8_XPAGE, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从指定页循环使用的eeprom/flash空间内,读出长度为u8_LEN的字符串  
                                                // 入口要求: u8_FAC=1 指定eeprom时,u8_len > 1;u8_FAC=0 指定flash时,u8_len > 4
                                               // 返回:  C=0 --> 读写成功,C=1 --> u8_len长度不符规定或末成功写入

/* 中颖单片机EEPROM或FLASH数据读出/写入库内部调用函数
extern void read_rom_dptr1(int16 u16_DPTR1);        // 从@DPTR1中读出1byte EEPROM或FLASH数据(其FAC位已预设定)送ACC, DPTR1++
extern bit  cmp_eeprom_1(uint8  u8_data);            // 将@DPTR1指定的EEPROM或FLASH中内容读出, 和char型变量相比较,DPTR1++
extern bit  cmp_eeprom_2(uint16 u16_data);           // 将@DPTR1指定的EEPROM或FLASH中内容读出, 和 int型变量相比较,DPTR1++
extern bit  cmp_eeprom_4(uint32 u32_data);           // 将@DPTR1指定的EEPROM或FLASH中内容读出, 和long型变量相比较,DPTR1++
extern void write_rom_dptr1(int8 u8_ACC);          // 将ACC中数据写入@DPTR1指定的EEPROM或FLASH中(其FAC位已预设定),DPTR1++
extern void write_eeprom_1(uint8  u8_data)           // 将char型变量写入指定的eeprom/flash中
extern void write_eeprom_2(uint16 u16_data)          // 将 int型变量写入指定的eeprom/flash中
extern void write_eeprom_4(uint32 u32_data)          // 将long型变量写入指定的eeprom/flash中
extern bit check_eeprom_null(uint8 u8_len);          // 检查当前写入页中,len长度的空间是否为空 null
extern bit locate_eeprom(uint8 u8_eeprom_count_len); // 寻找index当前写入页中,是否有len长度的空间充许写入
*/

#endif


三、便用说明
只需要在编译程序过程中,加入《中颖FLASH、类EEPROM 专用读写库》----FLASH-SH88F51.LIB,其他什么事都不用干!在编译过程中实现自动插入,无缝嵌入。


四、友情提示
本《中颖FLASH、类EEPROM 专用读写库》,仅适用于中颖SH79/88/89系列单片机,其他51单片机并不适用,由于Keil C51不支持中颖51单片机的软件仿真,所以必须要用中颖51单片机的硬件仿真或依靠中颖51单片机的实时运行,读写结果才能正确。
沙发
Cortex-M0|  楼主 | 2011-10-19 06:50 | 只看该作者
FLASH-SH88F51.rar (5.2 KB)

使用特权

评论回复
板凳
goodboy3021| | 2011-10-19 06:54 | 只看该作者
1# Cortex-M0

谢谢分享,手头sh88f4051上的INT2用不起来,按手册设置就是不行?:Q

使用特权

评论回复
地板
Cortex-M0|  楼主 | 2011-10-19 07:11 | 只看该作者
给个中断初始化程序

void init(void)
{ TCON1 |= Bin(00000100);    // 设置系统时钟不分频作为T0的时钟源
  TMOD  |= Bin(00000001);      // 设定T0的工作模式为1, 16位向上计数计数器/定时器,
  TL0    = LO_BYTE(Tsmp_T0);   // 装入T0定时器的初值, T0 16位向上计数计数器/定时器,
  TH0    = HI_BYTE(Tsmp_T0);   // 使用片内16.6MHz片内RC振荡器, 不分频,自由运行,延时约3.95ms  
#if(BaudRate_Tx == 0)
  T2MOD  = Bin(00000000);    // 设置系统时钟12分频作为T2的时钟源   
  T2CON  = Bin(00000000);    // 设置T2为16位带重载功能的定时器
  TL2 = RCAP2L = LO_BYTE(Tsmp_T2);   // 装入T2定时器的初值, 延时100us
  TH2 = RCAP2H = HI_BYTE(Tsmp_T2);   // 16位自动重装入, 使用片内16.6MHz片内RC振荡器, 12分频
#else
//TCON1  = Bin(00000000);    // 设置系统时钟12分频作为T1的时钟源
  TMOD  |= Bin(00100000);      // 设定T1的工作模式为2, 8位自动重载向上计数定时器
  TL1    = Tsmp_T1;            // 装入T1定时器的初值, 延时100us
  TH1    = Tsmp_T1;            // 8位自动重装入, 使用片内16.6MHz片内RC振荡器, 12分频
#endif

  ADCH   = Bin(11111011);      // 配置通道CH[7:0]为ADC输入口,(INT2为中断口)
  ADT    = Bin(11000000);      // TADC[2:0]=111:ADC时钟周期tAD = 32 tSYS,
                               // TS[3:0]=0111; 采样时间= (TS [3:0]+1) * tAD = 8 * tAD
           // 总共转换时间= 12tAD + 采样时间 = 20 * tAD = 38.6us
  ADCON  = Bin(10000000);      // 允许ADC模块
  PWMD   = 0x00;
  PWMP   = 0xff;
  PWMCON = Bin(10110001);      // 设置 PWM 输出
  IT0    = 1;                  // INT0 下降沿触发方式
  IT1    = 1;                  // INT1 下降沿触发方式
  EXF0   = Bin(00000100);    // INT2 下降沿触发方式
//PSL    = 0;       // 设置 串口 为低级中断
//PT0L   = 0;       // 设置 T0定时器为低级中断
  PX0L   = 1;       // 设置 INT0为高级中断
  PX1L   = 1;                  // 设置 INT1为高级中断
  IPL1 |= Bin(00100100);    // 设置 PPWML为高级中断, 设置 INT2为高级中断   
  IEN1  |= Bin(00100100);      // PWM 允许中断, INT2 允许中断,  *****
  EX0    = 1;                  // INT0 充许中断
  EX1    = 1;                  // INT1 充许中断
  ET0    = 1;                  // 定时器0 允许中断
  TR0    = 1;       // 启动定时器0
  EADC   = 1;       // ADC 允许中断
   
#if(BaudRate_Tx == 0)
  PT2L  = 1;       // 设置 T2定时器为高级中断
  ET2    = 1;                  // 定时器2 允许中断
  TR2    = 1;                  // 启动定时器2
#else
  PT1L   = 1;       // 设置 T1定时器为高级中断
  ET1    = 1;                  // 定时器1 允许中断
  TR1    = 1;                  // 启动定时器1
#endif
  EA     = 1;                  // 开中断
}

使用特权

评论回复
5
Cortex-M0|  楼主 | 2011-10-19 07:14 | 只看该作者
INT2关键几个REG 设置如下,还有一点,用INT2 时不能用JTAG仿真!因为端口有冲突。

EXF0   = Bin(00000100);    // INT2 下降沿触发方式
IPL1 |= Bin(00100100);    // 设置 PPWML为高级中断, 设置 INT2为高级中断   
IEN1  |= Bin(00100100);      // PWM 允许中断, INT2 允许中断,  *****

使用特权

评论回复
6
goodboy3021| | 2011-10-19 16:27 | 只看该作者
5# Cortex-M0

谢谢您的帮助!

使用特权

评论回复
7
Cortex-M0|  楼主 | 2011-10-21 16:08 | 只看该作者
最新更新,带全部源程序~~~

/***************************************************************************************
        Model                : flash-sh88f51.h
        Description        : Head file of defining global variable.
        Author                : CLR
        Create Time        : 2011-10-19
        Version ID  : 1.5

        用  途      :中颖SH79/88/89F51系列MCU
        作  者      :许意义
        21ic  ID    :LAOXU
        中颖论坛    : bbs.21ic.com   
****************************************************************************************/
#ifndef                _FLASH_SH88F51_H
#define                _FLASH_SH88F51_H

#pragma  MODDP2                          // 打开中颖单片机双DPTR功能,加速数据传送
//#pragma  NOMODDP2                  // 关闭中颖单片机双DPTR功能

/*--------------------------------------------------------------------------------------*/
/*                                                Resource - FLASH_SH88F51.asm                                                                        */
/*--------------------------------------------------------------------------------------*/

extern  uint8  read_eeprom_u8 (uint16 u16_addr, uint8 u8_FAC);     // 从指定的eeprom/flash地址中读出char型变量  
extern  uint16 read_eeprom_u16(uint16 u16_addr, uint8 u8_FAC);     // 从指定的eeprom/flash地址中读出int型变量  
extern  uint32 read_eeprom_u32(uint16 u16_addr, uint8 u8_FAC);     // 从指定的eeprom/flash地址中读出long型变量  
extern        bit write_eeprom_u8 (uint8  u8_data,  uint16 u16_addr, uint8 u8_FAC);  // 将char型变量写入指定的eeprom/flash中  
extern        bit write_eeprom_u16(uint16 u16_data, uint16 u16_addr, uint8 u8_FAC);  // 将int型变量写入指定的eeprom/flash中
extern  bit write_eeprom_u32(uint32 u32_data, uint16 u16_addr, uint8 u8_FAC);  // 将long型变量写入指定的eeprom/flash中  
extern  bit write_eeprom_str(uint16 u16_addr, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 将char*指向的字符串写入指定的eeprom/flash中  
extern        void read_eeprom_str(uint16 u16_addr, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从eeprom/flash中读出字符串, 存储在char*指向的RAM中

/*--------------------------------------------------------------------------------------*/
/*                                        下面为中颖标准型号FLASH(page=1k)读写专用                                                        */
/*--------------------------------------------------------------------------------------*/

extern        void erase_eeprom(uint8 u8_XPAGE, uint8 u8_XPAGE, uint8 u8_FAC);  // 擦除eeprom/flash的指定页,要求page连续送两遍,以提高抗干扰性(注:适用标准型号flash page=1k)

extern        bit  read_eeprom_like(uint8 u8_XPAGE, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从指定页循环使用的eeprom/flash空间内,读出长度为u8_LEN的字符串  
extern        bit write_eeprom_like(uint8 u8_XPAGE, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从指定页循环使用的eeprom/flash空间内,读出长度为u8_LEN的字符串  
                                                // 入口要求: u8_FAC=1 指定eeprom时,u8_len > 1;u8_FAC=0 指定flash时,u8_len > 4 (注:适用标准型号flash page=1k)
                                                                                        // 返回:  C=0 --> 读写成功,C=1 --> u8_len长度不符规定或末成功写入

/*--------------------------------------------------------------------------------------*/
/*                                        下面为中颖老型号FLASH(page=2k)读写专用                                                            */
/*--------------------------------------------------------------------------------------*/

extern        void erase_eeprom2(uint8 u8_XPAGE, uint8 u8_XPAGE, uint8 u8_FAC); // 擦除eeprom/flash的指定页,要求page连续送两遍,以提高抗干扰性(注:适用老型号flash page=2k)
extern        bit  read_eeprom_like2(uint8 u8_XPAGE, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从指定页循环使用的eeprom/flash空间内,读出长度为u8_LEN的字符串  
extern        bit write_eeprom_like2(uint8 u8_XPAGE, uint8 u8_len, uint8 *u8_data, uint8 u8_FAC); // 从指定页循环使用的eeprom/flash空间内,读出长度为u8_LEN的字符串  
                                                // 入口要求: u8_FAC=1 指定eeprom时,u8_len > 1;u8_FAC=0 指定flash时,u8_len > 8 (注:适用老型号flash page=2k)
                                                                                        // 返回:  C=0 --> 读写成功,C=1 --> u8_len长度不符规定或末成功写入

/*        中颖单片机EEPROM或FLASH数据读出/写入库内部调用函数       
extern        void read_rom_dptr1(int16 u16_DPTR1);               // 从@DPTR1中读出1byte EEPROM或FLASH数据(其FAC位已预设定)送ACC, DPTR1++
extern        bit  cmp_eeprom_1(uint8  u8_data);            // 将@DPTR1指定的EEPROM或FLASH中内容读出, 和char型变量相比较,DPTR1++
extern        bit  cmp_eeprom_2(uint16 u16_data);           // 将@DPTR1指定的EEPROM或FLASH中内容读出, 和 int型变量相比较,DPTR1++
extern        bit  cmp_eeprom_4(uint32 u32_data);           // 将@DPTR1指定的EEPROM或FLASH中内容读出, 和long型变量相比较,DPTR1++
extern        void write_rom_dptr1(int8 u8_ACC);                 // 将ACC中数据写入@DPTR1指定的EEPROM或FLASH中(其FAC位已预设定),DPTR1++
extern        void write_eeprom_1(uint8  u8_data)           // 将char型变量写入指定的eeprom/flash中
extern        void write_eeprom_2(uint16 u16_data)          // 将 int型变量写入指定的eeprom/flash中
extern        void write_eeprom_4(uint32 u32_data)          // 将long型变量写入指定的eeprom/flash中
extern        bit check_eeprom_null(uint8 u8_len);          // 检查当前写入页中,len长度的空间是否为空 null
extern        bit locate_eeprom(uint8 u8_eeprom_count_len); // 寻找index当前写入页中,是否有len长度的空间充许写入
*/


#endif

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
8
Cortex-M0|  楼主 | 2011-10-21 16:08 | 只看该作者
FLASH-SH88F51.rar (62.64 KB)

使用特权

评论回复
9
highgear| | 2011-10-21 21:19 | 只看该作者
都是好东西啊。

使用特权

评论回复
10
wangkangming| | 2012-6-25 08:51 | 只看该作者
学习一下

使用特权

评论回复
11
whc1223| | 2012-7-10 10:49 | 只看该作者
怎么没有定义

使用特权

评论回复
12
linlh11| | 2012-11-23 10:25 | 只看该作者
楼主,东西很好,就是附件资料里怎么没有C程序代码啊,版面上你给出的也是一些函数原型,没有具体C代码。

使用特权

评论回复
13
Cortex-M0|  楼主 | 2012-11-23 15:26 | 只看该作者
具体C代码,   在8楼~~~~

使用特权

评论回复
14
linlh11| | 2012-11-26 15:08 | 只看该作者
具体的C代码,下载了8楼得压缩文件,里面没有原函数的C代码啊

使用特权

评论回复
15
Cortex-M0|  楼主 | 2012-11-27 06:35 | 只看该作者
原函数大多数是汇编级的,以A51结尾。

使用特权

评论回复
16
zhangjianyu59| | 2014-7-16 13:11 | 只看该作者
中颖FLASH、类EEPROM 专用读写库在哪里有

使用特权

评论回复
17
zhangjianyu59| | 2014-7-16 13:13 | 只看该作者

中颖FLASH、类EEPROM 专用读写库,哪位高手有,能发一份给我吗,先谢了!

使用特权

评论回复
18
zhichangxuexi| | 2018-12-8 23:19 | 只看该作者
希望可以获得资料

使用特权

评论回复
19
alexzhou88| | 2019-3-31 13:42 | 只看该作者
支持分享精品。

使用特权

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

本版积分规则

个人签名:学习chunyang和maychang两位老师,努力练好基本功。 学习HOT大叔,学好“Cortex-M0”,做“Cortex-M0”之菜鸟。

7

主题

4820

帖子

12

粉丝