OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13218|回复: 46

内存泄露调试心得

[复制链接]

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
发表于 2014-1-16 10:18:57 | 显示全部楼层 |阅读模式
    平常是懒得去写点东西,但是今天,决定写点调试心得,主要是因为这个问题正真用了一周时间才得以解决,记得这几年在我调程序的过程里,因为一个问题,最长的解决周期也就是四天,但是今天这个问题却是打破了自己的记录。
    内存泄露在程序设计中是较难的一个问题,如果在平常的应用程序设计中(PC机),内存泄露相对来说容易点,至少是可以通过一些工具去查找问题,解决问题。但是,在相对低端的嵌入式系统里,可是无法查找,虽说是有硬件仿真工具,可是面对,大量的数据和一些复杂的系统也是很难去仿真的,那么只有一点一点去分析代码,一点点去理解,假设最终找出问题,解决问题。
        在嵌入式内存泄露的问题里,我个人以为,又有一些区别,一种是:因为一次内存泄露导致程序无法运行,这类问题是相对容易解决的;另一种是:一次内存泄露,不太影响整个程序,甚至可以得出正确数据,两次也可以,三次、、、、、,但是达到一定程序时,问题就会出现,那么要解决,必须把每个问题都解决了才能从根本上解决问题,所以首先必须要找到每个问题。对于这个问题也是最难的,因为或许从最开始就不知道是什么引起的问题。很蛋疼的是,第二种情况就是我遇到的。
    下面将详细介绍整个过程,整个系统如下:


硬件系统(第一次做板见笑了)





问题描述:
1、能和上位机链接,可以执行上位机给下位机的命令,在读写时钟过程中很正常(20个字节左右)
2、一些较实时的数据,需要经常更新,自然频率很高,读取出现个别错误;
3、从485里读出的数据有140个字节,通过以太网,向上位机发送,最终封装打包后的数据是212个字节,发送时出现out of memory的错误。
解决问题过程:起初还以为给以太网的内存不够,于是扩大之90多K(总128K),但是很奇怪的是依然不能解决。
因此怀疑是在移植的过程中出现问题。所以倒腾了几天还是没解决。
    项目的另一个人说是我的底层驱动出了错,因为从485读的数据,全是零,这点我从一开始就就否定了,因为我单独测试时也是0,指令正确,数据格式,校验都正确,数据就是零,那么必然正确(一定要坚持自己的观点),可是为什么全是0呢?当然是控制器的问题了(我心想),事实证明我说的正确,确实是控制器的问题,当然质量是没问题,是少插了测试模块,这点我不知道,因为刚来公司,对控制器不熟悉,我很惊讶,很大的 一个东西,竟然没发现,在我的提心下也没发现。后来换了一个带模块的控制器,他才发现。
   也因此,我坚持我的看法,对协议栈进行测试,同事继续去研究驱动。
后来经过多次测试发现,在发送212个字节,开辟内存时,used为121,本来used只是内存的标记,只有1和0,怎么会出现这种问题呢?
想到肯定是内存问题于是对协议栈的配置更改,除了内存有所增加,used的还是121.所以认为或许是在初始化时影响到了。
    果不其然,原来在初始化协议栈之前,初始化了一个6K的空表,而且前面有许多无用的全局变量,(这部分代码是同事编写,写了三百多行代码,一行注释都没,纠结的看了2天才弄明白,主要是链表和定义过多,里面又有状态机什么的,所以注释很重要,尤其项目合作中,更重要是后期的维护,时间久了,代码又多就是自己写的,也搞不清,切记)代码如下:
 int16_t AddCmd(char* rev,int len)
{
int16_t i;
//   int16_t j;
if(rev[0]==0&&rev[1]==0xff&&rev[2]==0&&rev[3]==0xff)
{
for(i=0;i<CMD_QUE;i++)
{
 if(CmdQue[0].used == 0)
 {
 break;
 }
 else if(i==CMD_QUE-1)
 {
 return -1;
 }
}
CmdQue[0].used = 1;
CmdQue[0].state = 1;
CmdQue[0].pid = rev[4];
CmdQue[0].nCode = rev[7];
CmdQue[0].nFunction = rev[8];
memcpy(CmdQue[0].data,rev+7,len-7);
//  for(j=0;j<64;j++)
//  {
//  printf("CCAA%2X \n",CmdQue[0].data[j]);  //  测试使用
//  }
return 0;
}
else
{
return -1;
  }

}

int16_t FindACmd(int8_t* num, int8_t state)
{
  int i;
for(i=0;i<CMD_QUE;i++)
{
if(CmdQue[0].state == state)
{
*num = i;
return state;
}
}
return 0;  
}
    把这些搞完,下载程序查看,used虽不是1或0,但是变为30,121,55等等一些数据,有希望了,必然是内存的原因。
     就这样纠结了几天依旧没解决,有种无能为力的感觉。
    所以看底层的代码, 突然发现定义了这样一个sbuf[ ],起初在没有联机时,以为接收的数据是不定长的,所以没给具体的值,现在至少可以确定其最大值,因此将sbuf[ ]改为sbuf[256 ],同样的其他几个也改正。(C语言仍需加强)
    下载程序,一看,很神奇的问题终于没了 ,呜呼,终于解决了!真的很激动!



写到这里,不知道再写点什么了,平常感觉在技术上有许多想写的,可是正真要写时,感觉很难下笔,可是当真正写下整个过程时,发现对其理解更深了一层,所以做技术,写博客是很好的一种学习途径!
     行百里者半九十,需要做的还很多,尤其项目的完善还需要一个过程!
    写的有点乱,想等项目结了好好的写点整个项目由电路图的设计,PCB板的设计,驱动代码的设计,以及整个系统的调试过程,以此来对整个项目有个更深的了解。
   特别感谢在这个过程中鼓励和技术上帮助我的朋友和网友!
   最后,附小诗一首,以表在整个程序调试过程中的心境!
    路 
2014.1.10夜,梦醒,偶感,
同时赠与一朋友

远望一边天,近观两重山;
只是云深处,崎狞自有路。 



不足之处仍有许多,希望大家多多指正!








纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-16 10:30:12 | 显示全部楼层
附MODBUS协议
#include "modbus.h"
#include "usart.h"
#include "delay.h"

//********************************************************************************/  
//modbus协议支持485总线
//修改日期:2013/12/9
//版本:V1.0
//Copyright(C) 象牙塔 All rights reserved
//Email:cronus_skl@163.com QQ:374199080
//********************************************************************************/
u8 MODBUS_SEND_SBUF[64];
u8 MODBUS_RECEIVE_SBUF[256];

 u8 Defaultspec=0;
 u8 baseAddress=0;




//字地址 0 - 255 (只取低8位)
//位地址 0 - 255 (只取低8位)

/* CRC 高位字节值表 */ 
const u8  auchCRCHi[] = { 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 
}; 
/* CRC低位字节值表*/ 
const u8  auchCRCLo[] = { 
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/, 
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,  
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 
0x43, 0x83, 0x41, 0x81, 0x80, 0x40 
};

/***************************CRC校验码生成函数 ********************************
*函数功能:生成CRC校验码
*本代码中使用查表法,以提高运算速度
****************************************************************************/
u16 crc16(u8 *puchMsg, u16 usDataLen) 
u8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ 
u8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ 
u16 uIndex ; /* CRC循环中的索引 */ 
while (usDataLen--) /* 传输消息缓冲区 */ 
  uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */ 
  uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; 
  uchCRCLo = auchCRCLo[uIndex] ; 
return (uchCRCLo << 8 | uchCRCHi) ; 
}

/********************************读写线圈*********************************/
/***************主要功能码:读线圈,写单个线圈,写多个线圈****************/
/*************************************************************************
*SendReadCoilCommand();读线圈(0X01):最多读256个线圈
*SD:地址(1)+功能码(1)+起始地址(2)+线圈数量(2)+CRC 发送读线圈命令
*RD:地址(1)+功能码(1)+字节数N(1)+状态(N)+CRC 接受读线圈数据
*输入:StartingAddress:起始地址;CoilNumber:线圈数量
*输出:无
**************************************************************************/

//发送命令
//最多可读256个线圈
void SendReadCoilCommand(u8 StartingAddress,u8 CoilNumber)
{
u16 crcData;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X01;//功能码
MODBUS_SEND_SBUF[2] = 0X00;//读地址只有48个0X2C,远小于0XFF个
MODBUS_SEND_SBUF[3] = StartingAddress;
MODBUS_SEND_SBUF[4] = 0X00;
MODBUS_SEND_SBUF[5] = CoilNumber;
crcData = crc16(MODBUS_SEND_SBUF,6);
  MODBUS_SEND_SBUF[6] = crcData & 0xff;   // CRC代码低位在前
  MODBUS_SEND_SBUF[7] = crcData >> 8;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,8);
// MODBUS_SEND_SBUF[]=0; 需不需要清零
}
//返回数据
u8 ReceiveReadCoilData(void)
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("读线圈出错!");
result=0X01;
return result;
}

}


/***************************************************************************
*写单个线圈(0X05):  可写线圈地址0~31
*SD: 地址(1)+功能码(1)+输出地址(2)+输出值(2)+CRC
*RD: 地址(1)+功能码(1)+输出地址(2)+输出值(2)+CRC
*输入:ExportAddress:输出地址;ExportData:输出值
*
***************************************************************************/
//发送命令
//ExportData 只能是0XFF 或 0X00
//地址范围0-31个
void SendWriteSingleCommand(u8 ExportAddress,u8 ExportData)
{
u16 crcData;
u8 i;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X05;//功能码
MODBUS_SEND_SBUF[2] = 0X00;//读地址只有48个0X2C,远小于0XFF个
MODBUS_SEND_SBUF[3] = ExportAddress;
MODBUS_SEND_SBUF[4]  = ExportData;
MODBUS_SEND_SBUF[5] = 0X00;
crcData = crc16(MODBUS_SEND_SBUF,6);
  MODBUS_SEND_SBUF[6] = crcData & 0xff;   // CRC代码低位在前
  MODBUS_SEND_SBUF[7] = crcData >> 8 ;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,8);
for(i=0;i<8;i++)
{
printf("\n%2X\n\r",MODBUS_SEND_SBUF);
}
// MODBUS_SEND_SBUF[]=0; 需不需要清零
}
//返回数据
u8 ReceiveWriteSingleData(void)
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("写单个线圈出错!");
result=0X05;
return result;
}

}
/***************************************************************************
*写多个线圈(0X0F):  可写线圈地址0~31
*SD:地址(1)+功能码(1)+起始地址(2)+输出数量(2)+字节数量N(1)+输出值(N字节)+CRC
*RD: 地址(1)+功能码(1)+起始地址(2)+输出数量(2)+CRC
*查询——0X11 0X0F 0X00 0X13 0X00 0X0A 0X02 0XCD 0X01 0XBF 0X0B
*从机地址-功能码-寄存器地址高字节-寄存器地址低字节-寄存器数量高字节-寄存器数量
*低字节-字节数-数据1-数据2-CRC校验高字节-CRC校验低字节
*  001AH  0019H  0018H  0017H  0016H  0015H  0014H 0013H
*    1      1      0      0      1      1      0     1
*  0022H  0021H  0020H  001FH  001EH  001DH  001CH 001BH
*    0      0      0      0      0      0     0     1
*传输的第一个字节CDH对应线圈为0013H到001AH,LSB(最低位)对应0013H
*输入:StartAddress:起始地址 ExportNumber:输出数量 ByteNumber:字节数量
*      ExportData:输出值(本代码里,最多4个字节)
***************************************************************************/
//发送命令
//地址范围0-31个,即最多32个地址,因此字节数是4Bit
void SendWriteMulCoilCommand(u8 StartAddress,u8 ExportNumber,u8 ByteNumber,u32 ExportData)
{
u16 crcData;
u8 i;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X0F;//功能码
MODBUS_SEND_SBUF[2] = 0X00;//起始地址高,写地址只有32个0X2C,远小于0XFF个
MODBUS_SEND_SBUF[3] = StartAddress;//起始地址低位
MODBUS_SEND_SBUF[4] = 0X00;  //输出数量高位
MODBUS_SEND_SBUF[5] = ExportNumber;//输出数量低位
MODBUS_SEND_SBUF[6] = ByteNumber;//字节数
// if((ByteNumber>=0)&&(ByteNumber<8)){i=1;}
// else if((8<=ByteNumber)&&(ByteNumber<16)){i=2;}
// else if((16<=ByteNumber)&&(ByteNumber<24)){i=3;}
// else if((24<=ByteNumber)&&(ByteNumber<32)){i=4;}
// else{i=5;}
switch(ByteNumber)
  {
case 1:
MODBUS_SEND_SBUF[7]=ExportData&0XFF;
crcData = crc16(MODBUS_SEND_SBUF,8);
MODBUS_SEND_SBUF[8] = crcData & 0xff;   // CRC代码低位在前
MODBUS_SEND_SBUF[9] = crcData >> 8 ;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,10);
for(i=0;i<10;i++)
{
printf("\n%2X\n\r",MODBUS_SEND_SBUF);
}
break;
case 2: 
MODBUS_SEND_SBUF[7]=ExportData&0XFF;
MODBUS_SEND_SBUF[8]=(ExportData&0XFFFF)>>8;
crcData = crc16(MODBUS_SEND_SBUF,9);
MODBUS_SEND_SBUF[9] = crcData & 0xff;   // CRC代码低位在前
MODBUS_SEND_SBUF[10] = crcData >> 8 ;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,11);
for(i=0;i<11;i++)
{
printf("\n%2X\n\r",MODBUS_SEND_SBUF);
}
break;
case 3: 
MODBUS_SEND_SBUF[7]=ExportData&0XFF;
MODBUS_SEND_SBUF[8]=(ExportData&0XFFFF)>>8;
MODBUS_SEND_SBUF[9]=(ExportData&0XFFFFFF)>>16;
crcData = crc16(MODBUS_SEND_SBUF,10);
MODBUS_SEND_SBUF[10] = crcData & 0xff;   // CRC代码低位在前
MODBUS_SEND_SBUF[11] = crcData >> 8 ;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,12);
for(i=0;i<12;i++)
{
printf("\n%2X\n\r",MODBUS_SEND_SBUF);
}
break;
case 4: 
MODBUS_SEND_SBUF[7]=ExportData&0XFF;
MODBUS_SEND_SBUF[8]=(ExportData&0XFFFF)>>8;
MODBUS_SEND_SBUF[9]=(ExportData&0XFFFFFF)>>16;
MODBUS_SEND_SBUF[10]=ExportData>>24;
crcData = crc16(MODBUS_SEND_SBUF,11);
MODBUS_SEND_SBUF[11] = crcData & 0xff;   // CRC代码低位在前
MODBUS_SEND_SBUF[12] = crcData >> 8 ;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,13);
for(i=0;i<13;i++)
{
printf("\n%2X\n\r",MODBUS_SEND_SBUF);
}
break;
case 5:
/***********************/
break;
}
// MODBUS_SEND_SBUF[]=0; 需不需要清零
}
//返回数据
u8 ReceiveWriteMulCoilData(void)
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("写多线圈出错!");
result=0X0F;
return result;
}

}
/*****************************读写保持寄存器*********************************/
/*********主要功能码:读保持寄存器,写单个寄存器,写多个寄存器***************/
/****************************************************************************
*256套规范,每套规范预留256个寄存器,现有128个参数,每个参数2个字节。
*保持寄存器偏移量=规范号*256+参数号。
*规范号:0~255         参数号:0~127
*0<=保持寄存器偏移量<=255*256+127=65407=0XFF7F
*0XFF7F=65535
*get_MN(),动态定义规范
*****************************************************************************/
//取值范围是0~255
u8 get_MN()
{
/***********测试使用************/
// printf("\n%2X\n\r",Defaultspec);
return Defaultspec;
}
/*****************************************************************************
*读保持寄存器(0X03): 每次最多读取125个
*SD:地址(1)+功能码(1)+起始地址(2)+寄存器数量(2)+CRC
*RD:地址(1)+功能码(1)+字节数N(1)+寄存器值(N*2)+CRC
*输入:ParameterNum  参数号  RegNumber 寄存器数量
*****************************************************************************/
void SendReadRegCommand(u8 ParameterNum,u8 RegNumber)
{
u16 crcData,StartAddress;
u8 i;
StartAddress=256*mn+ParameterNum;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X03;//功能码
MODBUS_SEND_SBUF[2] = StartAddress>>8;
MODBUS_SEND_SBUF[3] = StartAddress&0XFF;
MODBUS_SEND_SBUF[4] = 0X00;
MODBUS_SEND_SBUF[5] = RegNumber;//不超过 7D(125)
crcData = crc16(MODBUS_SEND_SBUF,6);
  MODBUS_SEND_SBUF[6] = crcData & 0xff;   // CRC代码低位在前
  MODBUS_SEND_SBUF[7] = crcData >> 8;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,8);
//   MODBUS_SEND_SBUF[]=0; // 需不需要清零
// for(i=0;i<8;i++)
// {
// printf("\n%2X\n\r",MODBUS_SEND_SBUF);
// }
}
u8 ReceiveReadRegData(void)
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("读寄存器出错!");
result=0X03;
return result;
}

}

/*************************************************************************
*SendWriteRegisterCommand();写单个寄存器(0X06): 
*SD:地址(1)+功能码(1)+寄存器地址(2)+寄存器值(2)+CRC
*RD:地址(1)+功能码(1)+寄存器地址(2)+寄存器值(2)+CRC
*输入:ParameterNum:寄存器地址;SinRegswitch:ON或OFF
*输出:无
**************************************************************************/

//发送命令
void SendWriteSinRegCommand(u8 ParameterNum,u8 SinRegswitch)
{
u16 crcData,RegisterAddress;
u8 i;
RegisterAddress=256*mn+ParameterNum;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X06;//功能码
MODBUS_SEND_SBUF[2] = RegisterAddress>>8;
MODBUS_SEND_SBUF[3] = RegisterAddress&0XFF;
MODBUS_SEND_SBUF[4] = 0X00;
MODBUS_SEND_SBUF[5] = SinRegswitch;
crcData = crc16(MODBUS_SEND_SBUF,6);
  MODBUS_SEND_SBUF[6] = crcData & 0xff;   // CRC代码低位在前
  MODBUS_SEND_SBUF[7] = crcData >> 8;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,8);
// MODBUS_SEND_SBUF[]=0; 需不需要清零
for(i=0;i<8;i++)
{
printf("\n%2X\n\r",MODBUS_SEND_SBUF);
}
}
u8 ReceiveWriteSinRegData(void)
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("写单个寄存器出错!");
result=0X06;
return result;
}

}
/*************************************************************************
*写多个寄存器(0X10): 每次最多写123个
*SD:地址(1)+功能码(1)+起始地址(2)+寄存器数量(2)+字节数N(1)+寄存器值(2*N)+CRC
*RD:地址(1)+功能码(1)+起始地址(2)+寄存器数量(2)+CRC
*输入:StartAddress:寄存器地址;SinRegswitch:ON或OFF
*输出:无
**************************************************************************/
// void SendWriteMulRegCommand( u8 ParameterNum, )
// {
// u16 crcData,StartAddress;
// u8 i;
// StartAddress=256*mn+ParameterNum;
// MODBUS_SEND_SBUF[0] = baseAddress;//地址
// MODBUS_SEND_SBUF[1] = 0X10;//功能码
// MODBUS_SEND_SBUF[2] = StartAddress>>8;
// MODBUS_SEND_SBUF[3] = StartAddress&0XFF;
// }
/*************************************************************************
*读输入寄存器(0X04):读内存
*SD:地址(2)+命令(2)+起始地(2)址+寄存器数量(2)
*RD:地址(2)+命令(2)+字节数N(2)+数据内容(N*2)
*输入:StartAddress:起始地址0X0000~0XFFFF 
*输入:RegisterNum:0X0001~0X007D(125)
*输出:无
**************************************************************************/
void SendReadEnterRegCommand( u16 StartAddress,u8 RegisterNum )
{
u16 crcData;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X04;//功能码
MODBUS_SEND_SBUF[2] = StartAddress>>8;
MODBUS_SEND_SBUF[3] = StartAddress&0XFF;
MODBUS_SEND_SBUF[4] = 0X00;
MODBUS_SEND_SBUF[5] = RegisterNum;
crcData = crc16(MODBUS_SEND_SBUF,6);
  MODBUS_SEND_SBUF[6] = crcData & 0xff;   // CRC代码低位在前
  MODBUS_SEND_SBUF[7] = crcData >> 8;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,8);
}
u8 ReceiveReadEnterRegData(void)
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("读输入寄存器出错!");
result=0X04;
return result;
}
}
/*************************************************************************
*读焊接历史记录(功能码:0X41)
*焊接记录,最多960条记录;记录读取方式只有0和1,1代表读记录( 从最早的记录
*开始读),0代表重读记录。每次最多读取3条记录。每个记录体包含64个字节(低
*字节在先)。
*SD: 地址(1)+功能码(1)+读取方式(1)+CRC
*RD: 地址(1)+功能码(1)+读取方式(1)+回复的记录个数(1)+记录体(64)+CRC 
**************************************************************************/
void SendReadWeldingHistoryCommand( u8 ReadMode )
{
u16 crcData;
// u8 i;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X41;//功能码
MODBUS_SEND_SBUF[2] = ReadMode;
crcData = crc16(MODBUS_SEND_SBUF,3);
  MODBUS_SEND_SBUF[3] = crcData & 0xff;   // CRC代码低位在前
  MODBUS_SEND_SBUF[4] = crcData >> 8;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,5);
// for(i=0;i<5;i++)
// {
// printf("\n%d\r",MODBUS_SEND_SBUF);
// }
}

u8 ReceiveWeldingHistoryData(void)
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("读焊接历史记录错误!");
result=0X41;
return result;
}
}


void SendReadWriteTimeCommand(u8 TimeCommand , u8 TimeNumber[7] )
{
u16 crcData;
u8 i;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X44;//功能码
  MODBUS_SEND_SBUF[2] = TimeCommand;
if(TimeCommand==0)
{
crcData = crc16(MODBUS_SEND_SBUF,3);
    MODBUS_SEND_SBUF[3] = crcData & 0xff;   // CRC代码低位在前
    MODBUS_SEND_SBUF[4] = crcData >> 8;   //高位在后
 RS485_Send_Data(MODBUS_SEND_SBUF,5);
}
else
{

delay_ms(5);
for(i=0;i<7;i++)
{
MODBUS_SEND_SBUF[3+i] = TimeNumber;
// printf("\n\r%d\n\r",TimeNumber);
}
crcData = crc16(MODBUS_SEND_SBUF,10);
    MODBUS_SEND_SBUF[10] = crcData & 0xff;   // CRC代码低位在前
    MODBUS_SEND_SBUF[11] = crcData >> 8;   //高位在后
 RS485_Send_Data(MODBUS_SEND_SBUF,12);
}
// MODBUS_SEND_SBUF[3] = RecordPointer&0XFF;
// MODBUS_SEND_SBUF[4] = RecordNumber;
//
}

u8 ReceiveReadWriteTimeData( void )
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("读写时钟错误!");
result=0X44;
return result;
}
}
/*************************************************************************
* 读设备标识(0X2B)
* 表:10:设备标识
* 对象ID 对象名称 类型  
* 0X00 厂商名称 ASCII字符串  只读
* 0X01 产品代码 ASCII字符串  只读
* 0X02 主次版本号 ASCII字符串  只读
* SD:地址(1)+功能码(1)+MEI类型(1)+读设备ID码(1)+对象ID(1)
  SD:  **+2B+0E+01+00+CRC
* RD:地址(1)+功能码(1)+MEI类型(1)+设备ID码(1)+一致性等级[conformity
* level](1)+00(1)+下一个设备ID码(1)+对象数量n (1)+对象1 ID(1)+对象1
* 长度N(1)+对象内容(N)+… … +对象n ID(1)+对象n长度M(1)+对象内容(M)+CRC 
*************************************************************************/
void SendReadDeviceIdentifineCommand( void )
{
u16 crcData;
MODBUS_SEND_SBUF[0] = baseAddress;//地址
MODBUS_SEND_SBUF[1] = 0X2B;//功能码
  MODBUS_SEND_SBUF[2] = 0X0E;
MODBUS_SEND_SBUF[3] = 0X01;
MODBUS_SEND_SBUF[4] = 0X00;
crcData = crc16(MODBUS_SEND_SBUF,5);
MODBUS_SEND_SBUF[5] = crcData & 0xff;   // CRC代码低位在前
MODBUS_SEND_SBUF[6] = crcData >> 8;   //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,7);
}

u8 ReceiveDeviceIdentifineData( void )
{
u8 result=0;
u16 crcData;
RS485_Receive_Data(MODBUS_RECEIVE_SBUF,&RS485_RX_CNT);
crcData = crc16(MODBUS_RECEIVE_SBUF,RS485_RX_CNT-1);
if(MODBUS_RECEIVE_SBUF[RS485_RX_CNT-1] == ( crcData&0xff ) || MODBUS_RECEIVE_SBUF[RS485_RX_CNT] == ( crcData >> 8 ))
{
RS485_RX_CNT=0; //长度清零
return result=0;
}
else
{
RS485_RX_CNT=0; //长度清零
printf("读设备标识错误!");
result=0X2B;
return result;
}
}







纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

27

主题

308

帖子

1

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2012-6-19
在线时间
19 小时
发表于 2014-1-16 10:33:58 | 显示全部楼层
顶楼主!
回复 支持 反对

使用道具 举报

27

主题

774

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1473
金钱
1473
注册时间
2013-4-12
在线时间
77 小时
发表于 2014-1-16 10:53:17 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-16 11:46:20 | 显示全部楼层
好贴,赞一个!楼主其实还是很能写的,应该多写写
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-16 11:47:03 | 显示全部楼层
回复【楼主位】象牙塔:
---------------------------------
第一次画板就画成这样已经很厉害了。。
回复 支持 反对

使用道具 举报

19

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-7-23
在线时间
0 小时
发表于 2014-1-16 12:16:43 | 显示全部楼层
学习了!!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-16 12:32:56 | 显示全部楼层
回复【5楼】hechao3225:
---------------------------------
呵呵,感谢鼓励,就是平时懒!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-16 12:38:46 | 显示全部楼层
回复【6楼】hechao3225:
---------------------------------
因为是自己毕业的第一个项目,而且我专业是软件,所以能进现在的公司以及刚上手就做这个项目,非常幸运了。所以自己就很珍惜这个机会,我还是个新手
希望多多指教!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2014-1-15
在线时间
6 小时
发表于 2014-1-16 12:59:12 | 显示全部楼层
楼主好有才,小小菜鸟膜拜!
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2012-4-27
在线时间
4 小时
发表于 2014-1-16 13:12:12 | 显示全部楼层
学习学习!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-16 13:40:53 | 显示全部楼层
回复【10楼】Intel:
---------------------------------
互相学习!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-16 13:41:10 | 显示全部楼层
回复【11楼】oppking:
---------------------------------
一起进步!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-16 16:48:24 | 显示全部楼层
回复【9楼】象牙塔:
---------------------------------
我也是新手,互相学习
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-1-16 20:10:00 | 显示全部楼层
据说泄漏和越界不是一个事。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-1-16 20:25:53 | 显示全部楼层
回复【楼主位】象牙塔:
---------------------------------
谢谢分享,做技术的压力大,尤其是问题长时间得不到解决的时候,容易心浮气躁,所以我们要努力保持一颗平常心,有时候问题就在不经意中解决了。
这种心境巨大的落差,也正是设计的魅力所在!共勉~
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2014-1-16 23:07:05 | 显示全部楼层
回复【楼主位】象牙塔:
---------------------------------
楼主能分享一下SRAM和Flash布线的心得吗?谢谢啦。
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-17 08:10:56 | 显示全部楼层
回复【17楼】jikaishihuaidan:
---------------------------------
等项目完了吧,马上过年了,时间有点紧啊!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-17 08:14:42 | 显示全部楼层
回复【17楼】jikaishihuaidan:
---------------------------------
确实,公司工程师指导的,板子感觉就是很稳定,因为与主板配套,所以有几个接口位置比较固定,线只能内聚,没法扩散,右边的线比较密集,部了好几次才成功。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-17 08:15:08 | 显示全部楼层
回复【16楼】xiaoyan:
---------------------------------
是啊,共勉!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2014-1-17 08:55:10 | 显示全部楼层
回复【18楼】象牙塔:
---------------------------------
好的好的,楼主可别忘了,呵呵。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-18 19:31:02 | 显示全部楼层
顶,cool
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-19 11:03:00 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
谢谢原子哥,在程序调试阶段帮了不少忙!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-1-18
在线时间
0 小时
发表于 2014-1-19 12:07:14 | 显示全部楼层
顶楼主~~
回复 支持 反对

使用道具 举报

41

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2013-8-1
在线时间
0 小时
发表于 2014-1-19 12:08:22 | 显示全部楼层
牛逼啊!兄弟的modbus可以用吗?可以用就带走保存了
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-19 13:41:03 | 显示全部楼层
回复【25楼】yongyooh:
---------------------------------
没问题,和主板做的测试,现在这部分代码在我的工程里用不到了,直接从上位机透传的!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-19 21:08:17 | 显示全部楼层
回复【21楼】jikaishihuaidan:
---------------------------------
呵呵,论坛里高手如云,我也是刚刚学会画板子!@^@,无论如何都要自己画一块板,自己调试,完成一个小项目,至于经验,网上一大片,但那都是别人的,只有亲自走过这个流程,你才会明白,有些东西是无法教的,有什么问题可以放论坛里,大家讨论一下,还有就是请个有经验的工程师,帮忙指导指导。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

7

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-4-9
在线时间
26 小时
发表于 2014-1-19 22:38:10 | 显示全部楼层
MARK~~~
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-1-20 08:37:00 | 显示全部楼层
没看太懂,但是谢谢楼主,多看几遍吧
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2014-1-20 10:37:08 | 显示全部楼层
回复【27楼】象牙塔:
---------------------------------
楼主谦虚了,我也是刚学画板子,先向你学习。
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-20 11:24:48 | 显示全部楼层
回复【30楼】jikaishihuaidan:
---------------------------------
呵呵,互相进步!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2014-1-20 17:33:25 | 显示全部楼层
回复【31楼】象牙塔:
---------------------------------
先请教下,布局时一般模拟部分是不是要离电源部分最远?
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-1-20 20:41:01 | 显示全部楼层
最好分开,但布局还是以你板子的整个板子为主,不能依着某点而不顾大局,推荐两篇文章,
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

1

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-9-8
在线时间
2 小时
发表于 2014-2-12 16:11:39 | 显示全部楼层
GO.OD
回复 支持 反对

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2014-2-12 17:56:49 | 显示全部楼层
不知道LZ,在这个项目中有木有使用操作系统,如果没有的话,对于落跑来说,有一个方法,可以很好的防治内存泄漏的问题
比如某块MCU 的内存为8K,
那么在定义变量和缓冲区的时候,
采取的方法是,首先开辟一个7K的大型缓冲区,
u8 g_porjectbuffer[7168];
然后用软件的方式,将这个缓冲区给分割给其他应用
比如,显示区域,我要用1K的空间 
播放数据缓冲要用1K的空间的话,那么在定义的时候采取以下方法

#define g_DisplayBuffer  g_porjectbuffer
#define g_PlayBuffer  (g_porjectbuffer+1024)

这个是对于缓冲区的做法,
针对变量的话,也可以这么做
比如 定义如下变量,一般的做法是这样的
U8 g_Vriabe1;
U16 g_Vriabe2;
U32 g_Vriabe3;

但是可以用软件的方法给固定在那个大型的缓冲区

#define g_Vriabe1 (g_porjectbuffer+512)
#define g_Vriabe2 (g_porjectbuffer+513)
#define g_Vriabe3 (g_porjectbuffer+515)

#define rw_g_Vriabe1 g_Vriabe1
#define rw_g_Vriabe2 (((u16*)(&g_Vriabe2))[0])
#define rw_g_Vriabe3 (((u32*)(&g_Vriabe3))[0])


那么在读写g_Vriabe1,g_Vriabe2,g_Vriabe3的时候
可以用
rw_g_Vriabe1 = 1;
rw_g_Vriabe2 = 2;
rw_g_Vriabe3 = 0xfffff2;
这样的方式访问,虽然在定义的时候,麻烦了,点,但是在对内存的控制是比较好

当然这种做法,还有个好处就是,对暂时不用的缓冲区,可以相互之间合并给一个需要大型缓冲的应用
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-2-12 20:00:25 | 显示全部楼层
回复【35楼】lxj19901115:
---------------------------------
谢谢指教,目前项目在做两方面的测试,具体还的看实际情况!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
发表于 2014-2-12 20:38:49 | 显示全部楼层
支持一下啊。
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-8
在线时间
0 小时
发表于 2014-2-13 08:53:19 | 显示全部楼层
楼主搞过stm32f407吗?我想外扩一片sram,但是修改了启动文件和选项之后程序,程序执行到延时的时候就进入硬件故障中断了(延时是系统定时器延时),这个程序在没有外扩SRAM以前是可以用的,修改之后就出现这样的问题了,我是按照网上给的103的启动文件改的,不知道哪里除了问题
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-2-13 09:11:41 | 显示全部楼层
回复【38楼】追风过后:
---------------------------------
你这么说不好确定,我也没搞过F407,可以把修改的代码贴出来
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-2-13 11:45:32 | 显示全部楼层
只想说第一次做板子比我做了多次的都好看

最终是想告知大家在定义数组时候一定要小心是么?问题出在数组定义上对吧
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-2-13 11:48:24 | 显示全部楼层
回复【35楼】lxj19901115:
---------------------------------
这种用法在实际产品中用的效果如何啊?思路很赞啊
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-2-13 13:14:12 | 显示全部楼层
回复【40楼】wwjdwy:
---------------------------------
是的,其实觉得还是细节,细节决定成败!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-8
在线时间
0 小时
发表于 2014-2-13 13:52:32 | 显示全部楼层
回复【39楼】象牙塔:
---------------------------------
;******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
;* File Name       : startup_stm32f4xx.s
;* Author          : MCD Application Team
;* Version         : V1.0.2
;* Date            : 05-March-2012
;* Description     : STM32F4xx devices vector table for MDK-ARM toolchain. 
;*                      This module performs:
;*                      - Set the initial SP
;*                      - Set the initial C == Reset_Handler
;*                      - Set the vector table entries with the exceptions ISR address
;*                      - Configure the system clock and the external SRAM mounted on 
;*                        STM324xG-EVAL board to be used as data memory (optional, 
;*                        to be enabled by user)
;*                      - Branches to __main in the C library (which eventually
;*                        calls main()).
;*                      After Reset the CortexM4 processor is in Thread mode,
;*                      priority is rivileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>   
;*******************************************************************************

; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
; You may not use this file except in compliance with the License.
; You may obtain a copy of the License at:

;        http://www.st.com/software_license_agreement_liberty_v2

; Unless required by applicable law or agreed to in writing, software 
; distributed under the License is distributed on an "AS IS" BASIS, 
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.

;*******************************************************************************

; If you need to use external SRAM mounted on STM3210E-EVAL board as data memory,
; change the following define value to '1' (or choose ENABLE in Configuration Wizard window)
;// <o> External SRAM Configuration <0=> DISABLE <1=> ENABLE

DATA_IN_ExtSRAM EQU 1

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size

;__initial_sp
; If you need to use external SRAM mounted on STM3210E-EVAL board as data memory
; and internal SRAM for Stack, uncomment the following line and comment the line above
__initial_sp EQU 0x20000000 + Stack_Size ;

; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000400

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                THUMB
                RESERVE8
                ;THUMB


; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     endSV_Handler             ; endSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
                DCD     VD_IRQHandler                    ; VD through EXTI Line detection                        
                DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
                DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
                DCD     FLASH_IRQHandler                  ; FLASH                                           
                DCD     RCC_IRQHandler                    ; RCC                                             
                DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
                DCD     EXTI1_IRQHandler                  ; EXTI Line1                                             
                DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
                DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
                DCD     EXTI4_IRQHandler                  ; EXTI Line4                                             
                DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0                                   
                DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1                                   
                DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2                                   
                DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3                                   
                DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4                                   
                DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5                                   
                DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6                                   
                DCD     ADC_IRQHandler                    ; ADC1, ADC2 and ADC3s                            
                DCD     CAN1_TX_IRQHandler                ; CAN1 TX                                                
                DCD     CAN1_RX0_IRQHandler               ; CAN1 RX0                                               
                DCD     CAN1_RX1_IRQHandler               ; CAN1 RX1                                               
                DCD     CAN1_SCE_IRQHandler               ; CAN1 SCE                                               
                DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s                                    
                DCD     TIM1_BRK_TIM9_IRQHandler          ; TIM1 Break and TIM9                   
                DCD     TIM1_UP_TIM10_IRQHandler          ; TIM1 Update and TIM10                 
                DCD     TIM1_TRG_COM_TIM11_IRQHandler     ; TIM1 Trigger and Commutation and TIM11
                DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare                                   
                DCD     TIM2_IRQHandler                   ; TIM2                                            
                DCD     TIM3_IRQHandler                   ; TIM3                                            
                DCD     TIM4_IRQHandler                   ; TIM4                                            
                DCD     I2C1_EV_IRQHandler                ; I2C1 Event                                             
                DCD     I2C1_ER_IRQHandler                ; I2C1 Error                                             
                DCD     I2C2_EV_IRQHandler                ; I2C2 Event                                             
                DCD     I2C2_ER_IRQHandler                ; I2C2 Error                                               
                DCD     SPI1_IRQHandler                   ; SPI1                                            
                DCD     SPI2_IRQHandler                   ; SPI2                                            
                DCD     USART1_IRQHandler                 ; USART1                                          
                DCD     USART2_IRQHandler                 ; USART2                                          
                DCD     USART3_IRQHandler                 ; USART3                                          
                DCD     EXTI15_10_IRQHandler              ; External Line[15:10]s                                  
                DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line                  
                DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI line                        
                DCD     TIM8_BRK_TIM12_IRQHandler         ; TIM8 Break and TIM12                  
                DCD     TIM8_UP_TIM13_IRQHandler          ; TIM8 Update and TIM13                 
                DCD     TIM8_TRG_COM_TIM14_IRQHandler     ; TIM8 Trigger and Commutation and TIM14
                DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare                                   
                DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7                                           
                DCD     FSMC_IRQHandler                   ; FSMC                                            
                DCD     SDIO_IRQHandler                   ; SDIO                                            
                DCD     TIM5_IRQHandler                   ; TIM5                                            
                DCD     SPI3_IRQHandler                   ; SPI3                                            
                DCD     UART4_IRQHandler                  ; UART4                                           
                DCD     UART5_IRQHandler                  ; UART5                                           
                DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors                   
                DCD     TIM7_IRQHandler                   ; TIM7                   
                DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                                   
                DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                                   
                DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                                   
                DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                                   
                DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4                                   
                DCD     ETH_IRQHandler                    ; Ethernet                                        
                DCD     ETH_WKUP_IRQHandler               ; Ethernet Wakeup through EXTI line                      
                DCD     CAN2_TX_IRQHandler                ; CAN2 TX                                                
                DCD     CAN2_RX0_IRQHandler               ; CAN2 RX0                                               
                DCD     CAN2_RX1_IRQHandler               ; CAN2 RX1                                               
                DCD     CAN2_SCE_IRQHandler               ; CAN2 SCE                                               
                DCD     OTG_FS_IRQHandler                 ; USB OTG FS                                      
                DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5                                   
                DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6                                   
                DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7                                   
                DCD     USART6_IRQHandler                 ; USART6                                           
                DCD     I2C3_EV_IRQHandler                ; I2C3 event                                             
                DCD     I2C3_ER_IRQHandler                ; I2C3 error                                             
                DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End oint 1 Out                      
                DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End oint 1 In                       
                DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI                         
                DCD     OTG_HS_IRQHandler                 ; USB OTG HS                                      
                DCD     DCMI_IRQHandler                   ; DCMI                                            
                DCD     CRYP_IRQHandler                   ; CRYP crypto                                     
                DCD     HASH_RNG_IRQHandler               ; Hash and Rng
                DCD     FPU_IRQHandler                    ; FPU
                         
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler    ROC
                 EXPORT  Reset_Handler             [WEAK]
                 
         IF      DATA_IN_ExtSRAM == 1
; FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is 
; required, then adjust the Register Addresses


; Enable FSMC clock
         LDR R0,= 0x00000114 
         LDR R1,= 0x40021014
         STR R0,[R1]                  
                  
; Enable GPIOD, GPIOE, GPIOF and GPIOG clocks
         LDR R0,= 0x000001E0
         LDR R1,= 0x40021018
         STR R0,[R1]    

; SRAM Data lines, NOE and NWE configuration 
; SRAM Address lines configuration 
; NOE and NWE configuration   
; NE3 configuration 
; NBL0, NBL1 configuration 

         LDR R0,= 0x44BB44BB 
         LDR R1,= 0x40011400
         STR R0,[R1]
 
         LDR R0,= 0xBBBBBBBB 
         LDR R1,= 0x40011404
         STR R0,[R1]
 
         LDR R0,= 0xB44444BB 
         LDR R1,= 0x40011800
         STR R0,[R1]
 
         LDR R0,= 0xBBBBBBBB 
         LDR R1,= 0x40011804
         STR R0,[R1]
 
         LDR R0,= 0x44BBBBBB 
         LDR R1,= 0x40011C00
         STR R0,[R1]     

         LDR R0,= 0xBBBB4444 
         LDR R1,= 0x40011C04
         STR R0,[R1]     

         LDR R0,= 0x44BBBBBB
         LDR R1,= 0x40012000
         STR R0,[R1]

         LDR R0,= 0x44444B44
         LDR R1,= 0x40012004
         STR R0,[R1]      
         
; FSMC Configuration   
; Enable FSMC Bank1_SRAM Bank 

        LDR R0,= 0x00001011
        LDR R1,= 0xA0000010
        STR R0,[R1]

        LDR R0,= 0x00000200 
        LDR R1,= 0xA0000014
        STR R0,[R1]

    
        ENDIF                 
                 
                 
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler                   [WEAK]                                        
                EXPORT  PVD_IRQHandler                    [WEAK]                      
                EXPORT  TAMP_STAMP_IRQHandler             [WEAK]         
                EXPORT  RTC_WKUP_IRQHandler               [WEAK]                     
                EXPORT  FLASH_IRQHandler                  [WEAK]                                         
                EXPORT  RCC_IRQHandler                    [WEAK]                                            
                EXPORT  EXTI0_IRQHandler                  [WEAK]                                            
                EXPORT  EXTI1_IRQHandler                  [WEAK]                                             
                EXPORT  EXTI2_IRQHandler                  [WEAK]                                            
                EXPORT  EXTI3_IRQHandler                  [WEAK]                                           
                EXPORT  EXTI4_IRQHandler                  [WEAK]                                            
                EXPORT  DMA1_Stream0_IRQHandler           [WEAK]                                
                EXPORT  DMA1_Stream1_IRQHandler           [WEAK]                                   
                EXPORT  DMA1_Stream2_IRQHandler           [WEAK]                                   
                EXPORT  DMA1_Stream3_IRQHandler           [WEAK]                                   
                EXPORT  DMA1_Stream4_IRQHandler           [WEAK]                                   
                EXPORT  DMA1_Stream5_IRQHandler           [WEAK]                                   
                EXPORT  DMA1_Stream6_IRQHandler           [WEAK]                                   
                EXPORT  ADC_IRQHandler                    [WEAK]                         
                EXPORT  CAN1_TX_IRQHandler                [WEAK]                                                
                EXPORT  CAN1_RX0_IRQHandler               [WEAK]                                               
                EXPORT  CAN1_RX1_IRQHandler               [WEAK]                                                
                EXPORT  CAN1_SCE_IRQHandler               [WEAK]                                                
                EXPORT  EXTI9_5_IRQHandler                [WEAK]                                    
                EXPORT  TIM1_BRK_TIM9_IRQHandler          [WEAK]                  
                EXPORT  TIM1_UP_TIM10_IRQHandler          [WEAK]                
                EXPORT  TIM1_TRG_COM_TIM11_IRQHandler     [WEAK] 
                EXPORT  TIM1_CC_IRQHandler                [WEAK]                                   
                EXPORT  TIM2_IRQHandler                   [WEAK]                                            
                EXPORT  TIM3_IRQHandler                   [WEAK]                                            
                EXPORT  TIM4_IRQHandler                   [WEAK]                                            
                EXPORT  I2C1_EV_IRQHandler                [WEAK]                                             
                EXPORT  I2C1_ER_IRQHandler                [WEAK]                                             
                EXPORT  I2C2_EV_IRQHandler                [WEAK]                                            
                EXPORT  I2C2_ER_IRQHandler                [WEAK]                                               
                EXPORT  SPI1_IRQHandler                   [WEAK]                                           
                EXPORT  SPI2_IRQHandler                   [WEAK]                                            
                EXPORT  USART1_IRQHandler                 [WEAK]                                          
                EXPORT  USART2_IRQHandler                 [WEAK]                                          
                EXPORT  USART3_IRQHandler                 [WEAK]                                         
                EXPORT  EXTI15_10_IRQHandler              [WEAK]                                  
                EXPORT  RTC_Alarm_IRQHandler              [WEAK]                  
                EXPORT  OTG_FS_WKUP_IRQHandler            [WEAK]                        
                EXPORT  TIM8_BRK_TIM12_IRQHandler         [WEAK]                 
                EXPORT  TIM8_UP_TIM13_IRQHandler          [WEAK]                 
                EXPORT  TIM8_TRG_COM_TIM14_IRQHandler     [WEAK] 
                EXPORT  TIM8_CC_IRQHandler                [WEAK]                                   
                EXPORT  DMA1_Stream7_IRQHandler           [WEAK]                                          
                EXPORT  FSMC_IRQHandler                   [WEAK]                                             
                EXPORT  SDIO_IRQHandler                   [WEAK]                                             
                EXPORT  TIM5_IRQHandler                   [WEAK]                                             
                EXPORT  SPI3_IRQHandler                   [WEAK]                                             
                EXPORT  UART4_IRQHandler                  [WEAK]                                            
                EXPORT  UART5_IRQHandler                  [WEAK]                                            
                EXPORT  TIM6_DAC_IRQHandler               [WEAK]                   
                EXPORT  TIM7_IRQHandler                   [WEAK]                    
                EXPORT  DMA2_Stream0_IRQHandler           [WEAK]                                  
                EXPORT  DMA2_Stream1_IRQHandler           [WEAK]                                   
                EXPORT  DMA2_Stream2_IRQHandler           [WEAK]                                    
                EXPORT  DMA2_Stream3_IRQHandler           [WEAK]                                    
                EXPORT  DMA2_Stream4_IRQHandler           [WEAK]                                 
                EXPORT  ETH_IRQHandler                    [WEAK]                                         
                EXPORT  ETH_WKUP_IRQHandler               [WEAK]                     
                EXPORT  CAN2_TX_IRQHandler                [WEAK]                                               
                EXPORT  CAN2_RX0_IRQHandler               [WEAK]                                               
                EXPORT  CAN2_RX1_IRQHandler               [WEAK]                                               
                EXPORT  CAN2_SCE_IRQHandler               [WEAK]                                               
                EXPORT  OTG_FS_IRQHandler                 [WEAK]                                       
                EXPORT  DMA2_Stream5_IRQHandler           [WEAK]                                   
                EXPORT  DMA2_Stream6_IRQHandler           [WEAK]                                   
                EXPORT  DMA2_Stream7_IRQHandler           [WEAK]                                   
                EXPORT  USART6_IRQHandler                 [WEAK]                                           
                EXPORT  I2C3_EV_IRQHandler                [WEAK]                                              
                EXPORT  I2C3_ER_IRQHandler                [WEAK]                                              
                EXPORT  OTG_HS_EP1_OUT_IRQHandler         [WEAK]                      
                EXPORT  OTG_HS_EP1_IN_IRQHandler          [WEAK]                      
                EXPORT  OTG_HS_WKUP_IRQHandler            [WEAK]                        
                EXPORT  OTG_HS_IRQHandler                 [WEAK]                                      
                EXPORT  DCMI_IRQHandler                   [WEAK]                                             
                EXPORT  CRYP_IRQHandler                   [WEAK]                                     
                EXPORT  HASH_RNG_IRQHandler               [WEAK]
                EXPORT  FPU_IRQHandler                    [WEAK]                

WWDG_IRQHandler                                                       
PVD_IRQHandler                                      
TAMP_STAMP_IRQHandler                  
RTC_WKUP_IRQHandler                                
FLASH_IRQHandler                                                       
RCC_IRQHandler                                                            
EXTI0_IRQHandler                                                          
EXTI1_IRQHandler                                                           
EXTI2_IRQHandler                                                          
EXTI3_IRQHandler                                                         
EXTI4_IRQHandler                                                          
DMA1_Stream0_IRQHandler                                       
DMA1_Stream1_IRQHandler                                          
DMA1_Stream2_IRQHandler                                          
DMA1_Stream3_IRQHandler                                          
DMA1_Stream4_IRQHandler                                          
DMA1_Stream5_IRQHandler                                          
DMA1_Stream6_IRQHandler                                          
ADC_IRQHandler                                         
CAN1_TX_IRQHandler                                                            
CAN1_RX0_IRQHandler                                                          
CAN1_RX1_IRQHandler                                                           
CAN1_SCE_IRQHandler                                                           
EXTI9_5_IRQHandler                                                
TIM1_BRK_TIM9_IRQHandler                        
TIM1_UP_TIM10_IRQHandler                      
TIM1_TRG_COM_TIM11_IRQHandler  
TIM1_CC_IRQHandler                                               
TIM2_IRQHandler                                                           
TIM3_IRQHandler                                                           
TIM4_IRQHandler                                                           
I2C1_EV_IRQHandler                                                         
I2C1_ER_IRQHandler                                                         
I2C2_EV_IRQHandler                                                        
I2C2_ER_IRQHandler                                                           
SPI1_IRQHandler                                                          
SPI2_IRQHandler                                                           
USART1_IRQHandler                                                       
USART2_IRQHandler                                                       
USART3_IRQHandler                                                      
EXTI15_10_IRQHandler                                            
RTC_Alarm_IRQHandler                            
OTG_FS_WKUP_IRQHandler                                
TIM8_BRK_TIM12_IRQHandler                      
TIM8_UP_TIM13_IRQHandler                       
TIM8_TRG_COM_TIM14_IRQHandler  
TIM8_CC_IRQHandler                                               
DMA1_Stream7_IRQHandler                                                 
FSMC_IRQHandler                                                            
SDIO_IRQHandler                                                            
TIM5_IRQHandler                                                            
SPI3_IRQHandler                                                            
UART4_IRQHandler                                                          
UART5_IRQHandler                                                          
TIM6_DAC_IRQHandler                            
TIM7_IRQHandler                              
DMA2_Stream0_IRQHandler                                         
DMA2_Stream1_IRQHandler                                          
DMA2_Stream2_IRQHandler                                           
DMA2_Stream3_IRQHandler                                           
DMA2_Stream4_IRQHandler                                        
ETH_IRQHandler                                                         
ETH_WKUP_IRQHandler                                
CAN2_TX_IRQHandler                                                           
CAN2_RX0_IRQHandler                                                          
CAN2_RX1_IRQHandler                                                          
CAN2_SCE_IRQHandler                                                          
OTG_FS_IRQHandler                                                    
DMA2_Stream5_IRQHandler                                          
DMA2_Stream6_IRQHandler                                          
DMA2_Stream7_IRQHandler                                          
USART6_IRQHandler                                                        
I2C3_EV_IRQHandler                                                          
I2C3_ER_IRQHandler                                                          
OTG_HS_EP1_OUT_IRQHandler                           
OTG_HS_EP1_IN_IRQHandler                            
OTG_HS_WKUP_IRQHandler                                
OTG_HS_IRQHandler                                                   
DCMI_IRQHandler                                                            
CRYP_IRQHandler                                                    
HASH_RNG_IRQHandler
FPU_IRQHandler                                                 

                B       .

                ENDP

                ALIGN

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF   EF:__MICROLIB
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END

;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-8
在线时间
0 小时
发表于 2014-2-13 13:53:55 | 显示全部楼层
主要就是把DATA_IN_ExtSRAM EQU 1 这个编译开关置一,然后进入main函数之前的那一段改了一下
回复 支持 反对

使用道具 举报

4

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2014-1-11
在线时间
81 小时
发表于 2014-3-31 12:44:10 | 显示全部楼层
楼主,刚毕业就能接触这样的项目,真是很好!真是机会和能力并存!肯定是好大学的毕业生!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2014-3-31 13:26:14 | 显示全部楼层
回复【45楼】无情公子:
---------------------------------
没有,普通院校,而且我并非这个专业,是大学期间自学的。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-29 09:45:02 | 显示全部楼层
MARK 一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 05:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表