- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2025-05-21 17:18:59
已绑定手机
注册会员
- 积分
- 83
|
#include <STC32G.H>
#include "intrins.h"
#include "Modbus.h"
#include "stdio.h"
unsigned char xdata EEPORM_Byte[10]; // 数据缓存区
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
//读EEPORM一个字节函数
unsigned char IapRead(unsigned int addr)
{
unsigned char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 40; //设置等待参数40MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
//写EEPORM一个字节函数
void IapProgram(unsigned int addr, unsigned char dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 40; //设置等待参数40MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
IapIdle(); //关闭IAP功能
}
//擦除EEPORM函数
void IapErase(unsigned int addr)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 40; //设置等待参数40MHz
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //
IapIdle(); //关闭IAP功能
}
//========================================================================
// 连续读取EEPORM函数
//描述:从指定EEPORM首地址读出N个字节放在指定缓冲区
//参数:EE_addr:读出EEPORM首地址
// *data_addr :缓存区首地址
// len: 读取字节数量
//返回值: 无
//========================================================================
void IAP_ReadString (unsigned int EE_addr,unsigned int len)
{
unsigned int i;
printf("读出EEPORM字节:\r\n");
for(i=0;i<len*2;i++)
{
EEPORM_Byte[i]=IapRead(EE_addr);
EE_addr++;
printf("EEPORM_Byte[%d]:%d\r\n",i,EEPORM_Byte[i]);
}
}
//========================================================================
// 读写EEPORM函数
//描述:从指定EEPORM首地址读出N个字节放在指定缓冲区 然后判断是否和寄存器数据相同 不相同写入
//参数:
// len: 读取字节数量
//返回值: 无
//========================================================================
void EEPORM_writedat (unsigned int len)
{
unsigned int i,j;
unsigned char write =0; // 写入标志位
IAP_ReadString (0x0000,len); //先读出EEPORM数据
printf("判断EEPORM和寄存器是否相等:\r\n");
for (i=0;i<len;i++)
{
if (ModbusReg[i]==(EEPORM_Byte[i*2]|EEPORM_Byte[1+i*2]<<8)) //判断modbus寄存器是否和EEPORM数据相同
{
write=0; //相同置0
printf("相等:\r\n");
printf("ModbusReg[%d]:%d\r\n",i,ModbusReg[i]);
printf("EEPORM_Byte[%d]:%d\r\n",i*2,EEPORM_Byte[i*2]);
printf("EEPORM_Byte[%d]:%d\r\n",1+i*2,EEPORM_Byte[1+i*2]);
}else
{
write=1; // 不相同置1
printf("不相等:\r\n");
printf("ModbusReg[%d]:%d\r\n",i,ModbusReg[i]);
printf("EEPORM_Byte[%d]:%d\r\n",i*2,EEPORM_Byte[i*2]);
printf("EEPORM_Byte[%d]:%d\r\n",1+i*2,EEPORM_Byte[1+i*2]);
break;
}
}
if (write==1) //数据不同,把数据写入EEPORM里
{
IapErase(0x0000); //先擦除一个扇区
printf("扇区擦除已完成:\r\n");
printf("寄存器数据写入EEPORM:\r\n");
for (j=0;j<len;j++) // 读取Moubus寄存器数据
{
EEPORM_Byte[j*2]=ModbusReg[j]; // 低字节在前
EEPORM_Byte[1+j*2]=ModbusReg[j]>>8; // 高字节在后
printf("EEPORM_Byte[%d]=:%d\r\n",j*2,EEPORM_Byte[j*2]);
printf("EEPORM_Byte[%d]=:%d\r\n",1+j*2,EEPORM_Byte[1+j*2]);
printf("ModbusReg[%d]=:%d\r\n",j,ModbusReg[j]);
}
for (i=0;i<len*2;i++) //写入数据到EEPORM
{
IapProgram(0x0000,EEPORM_Byte[i]);
printf("EEPORM数据已写入:\r\n");
}
}
}
//========================================================================
// 上电读取EEPORM数据到寄存器函数
//描述:从指定EEPORM首地址读出N个字节放在指定缓冲区 然后传给modbus寄存器
//参数:
// len: 读取字节数量
//返回值: 无
//========================================================================
void EEPORM_writedat_Program(unsigned int len)
{
unsigned char i;
IAP_ReadString (0x0000,len); //先读出EEPORM数据
printf("将EEPORM字节赋给寄存器:\r\n");
for (i=0;i<len;i++) // 将EEPORM数据传给Modbus寄存器
{
ModbusReg[i]=EEPORM_Byte[i*2]|EEPORM_Byte[1+i*2]<<8;
printf("ModbusReg[%d]:%d\r\n",i,ModbusReg[i]);
}
}
#include <STC32G.H>
#include "mcu_led.h"
#include "modbus.h"
#include "uart.h"
#include "int_out.h"
#include "eeporm.h"
#include "stdio.h"
void main ()
{
WTST=0; //设置程序指令延时参数,幅值0可将CPU执行指令的速度设置为最快
EAXSFR(); //扩展SFR(XFR)访问
CKCON=0; //提高访问XRAM速度
Uart2_Init(9600,0); //串口2初始化
EEPORM_writedat_Program(5); //上电读取EEPORM数据到寄存器
LED_GPIO_lnit(); //GOIO初始化
Timer0_Init(); //定时器0初始化
Timer4_Init();
Uart1_Init(9600,1); //串口1初始化
GPIO_inpt();
EA=1; //打开总中断
|
-
EEPORM文件里手动填充的数据
-
打印出来也是0
|