[家电应用] 《中颖FLASH、类EEPROM 专用读写库》

[复制链接]
6999|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 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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;                  // 开中断
}
 楼主| 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 允许中断,  *****
goodboy3021 发表于 2011-10-19 16:27 | 显示全部楼层
5# Cortex-M0

谢谢您的帮助!
 楼主| 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

查看全部评分

 楼主| Cortex-M0 发表于 2011-10-21 16:08 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
highgear 发表于 2011-10-21 21:19 | 显示全部楼层
都是好东西啊。
wangkangming 发表于 2012-6-25 08:51 | 显示全部楼层
学习一下
whc1223 发表于 2012-7-10 10:49 | 显示全部楼层
怎么没有定义
linlh11 发表于 2012-11-23 10:25 | 显示全部楼层
楼主,东西很好,就是附件资料里怎么没有C程序代码啊,版面上你给出的也是一些函数原型,没有具体C代码。
 楼主| Cortex-M0 发表于 2012-11-23 15:26 | 显示全部楼层
具体C代码,   在8楼~~~~
linlh11 发表于 2012-11-26 15:08 | 显示全部楼层
具体的C代码,下载了8楼得压缩文件,里面没有原函数的C代码啊
 楼主| Cortex-M0 发表于 2012-11-27 06:35 | 显示全部楼层
原函数大多数是汇编级的,以A51结尾。
zhangjianyu59 发表于 2014-7-16 13:11 | 显示全部楼层
中颖FLASH、类EEPROM 专用读写库在哪里有
zhangjianyu59 发表于 2014-7-16 13:13 | 显示全部楼层

中颖FLASH、类EEPROM 专用读写库,哪位高手有,能发一份给我吗,先谢了!
zhichangxuexi 发表于 2018-12-8 23:19 | 显示全部楼层
希望可以获得资料
alexzhou88 发表于 2019-3-31 13:42 | 显示全部楼层
支持分享精品。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

7

主题

4820

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部