内存泄漏及解决方法,如何破,有什么好方法

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
新接手项目,60000+ 内存泄漏,如何破,有什么好方法!!!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
在执行到的业务那块排查是哪里出现了内存泄露。比较可能是有数组或Data未释放,也有可能是错误的循环操作引起的,工具一般对找到问题有很大帮助,如果还是找不到,对于有疑点的代码可以通过分段注释并执行来确定。最后,不管前边是谁写的代码,骂他一万遍也不管用的,毕竟已经到自己手里了(苦笑)。
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:相关文章推荐
发现的内存泄露有两种,一种是上篇提到的,某些窗口没有用DestroyWindow来释放资源,而是自己写的一个ForceClose函数,这导致了某些函数没被调用,比如PostNcDestroy。另外就是...
http://blog.chinaunix.net/uid--id-2959221.html
今天遇到一个内存泄露的问题。是师兄检测出来的。Variant类型在使...
基本环境①
打开、关闭、文档信息设定:新建PDFLib对象,PDF_new()设定错误处理的方式,PDF_set_parameter(p, "errorpolicy", "...
根据之前一篇安全协议的分析中分析了ssl协议,先回顾下ssl协议的内容然后用wireshark来抓包看具体流量包内容。
SSL协议栈位置介于TCP和应用层之间,分为SSL记录协...
上一篇文章楼主提到由Context引发的内存泄漏,在这一篇文章里,我们来谈谈Android开发中常见的Activity内存泄漏及解决办法。本文将会以“为什么”“怎么解决”的方式来介绍这几种内存泄漏。 ...
之所以撰写这篇文章是因为前段时间花费了很大的精力在已经成熟的代码上再去处理memory leak问题。写此的目的是希望我们应该养成良好的编码习惯,尽可能的避免这样的问题,因为当你对着一大片的代码再去处...
之所以撰写这篇文章是因为前段时间花费了很大的精力在已经成熟的代码上再去处理memory leak问题。写此的目的是希望我们应该养成良好的编码习惯,尽可能的避免这样的问题,因为当你对着一大片的代码再去处...
上一篇Android开发——常见的内存泄漏以及解决方案(一) 中已经对部分可能会引发内存泄漏的情况进行了阐述,此篇将从图片、动画等资源角度介绍可能会造成内存泄漏的情况以及应对方法。6. 集...
java.lang.OutOfMemoryError: Java heap space 解决方案
JVM中如果98%的时间是用于GC且可用的, Heap size...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)防止 Android 内存泄漏的 8 种方法 - 安卓 - 伯乐在线
& 防止 Android 内存泄漏的 8 种方法
在上一篇 中,我们讨论了八种容易发生内存泄漏的代码。其中,尤其严重的是泄漏Activity对象,因为它占用了大量系统内存。不管内存泄漏的代码表现形式如何,其核心问题在于:
在Activity生命周期之外仍持有其引用。
幸运的是,一旦泄漏发生且被定位到了,修复方法是相当简单的。
Static Actitivities
private static MainA
void setStaticActivity() {
activity =
private static MainActivity activity;&void setStaticActivity() {&&&&activity = this;}
构造静态变量持有Activity对象很容易造成内存泄漏,因为静态变量是全局存在的,所以当MainActivity生命周期结束时,引用仍被持有。这种写法开发者是有理由来使用的,所以我们需要正确的释放引用让垃圾回收机制在它被销毁的同时将其回收。
Android提供了特殊的Set类
允许开发者控制引用的“强度”。Activity对象泄漏是由于需要被销毁时,仍然被强引用着,只要强引用存在就无法被回收。
可以用弱引用代替强引用。
弱引用不会阻止对象的内存释放,所以即使有弱引用的存在,该对象也可以被回收。
private static WeakReference&MainActivity& activityR
void setStaticActivity() {
activityReference = new WeakReference&MainActivity&(this);
private static WeakReference&MainActivity& activityReference;&&&&&void setStaticActivity() {&&&&&&&&activityReference = new WeakReference&MainActivity&(this);&&&&}
Static Views
静态变量持有View
private static V
void setStaticView() {
view = findViewById(R.id.sv_button);
void setStaticView() {&&&&view = findViewById(R.id.sv_button);}
由于View持有其宿主Activity的引用,导致的问题与Activity一样严重。弱引用是个有效的解决方法,然而还有另一种方法是在生命周期结束时清除引用,Activity#onDestory()方法就很适合把引用置空。
private static V
public void onDestroy() {
super.onDestroy();
if (view != null) {
unsetStaticView();
void unsetStaticView() {
12345678910111213
private static View view;&@Overridepublic void onDestroy() {&&&&super.onDestroy();&&&&if (view != null) {&&&&&&&&unsetStaticView();&&&&}}&void unsetStaticView() {&&&&view = null;}
Inner Class
private static O
void createInnerClass() {
class InnerClass {
inner = new InnerClass();
private static Object inner;&void createInnerClass() {&&&&class InnerClass {&&&&}&&&&inner = new InnerClass();}
于上述两种情况相似,开发者必须注意少用非静态内部类,因为持有外部类的隐式引用,容易导致意料之外的泄漏。然而内部类可以访问外部类的私有变量,只要我们注意引用的生命周期,就可以避免意外的发生。
避免静态变量
这样持有内部类的成员变量是可以的。
void createInnerClass() {
class InnerClass {
inner = new InnerClass();
private Object inner;&void createInnerClass() {&&&&class InnerClass {&&&&}&&&&inner = new InnerClass();}
Anonymous Classes
前面我们看到的都是持有全局生命周期的静态成员变量引起的,直接或间接通过链式引用Activity导致的泄漏。这次我们用AsyncTask
void startAsyncTask() {
new AsyncTask&Void, Void, Void&() {
@Override protected Void doInBackground(Void... params) {
while(true);
}.execute();
void startAsyncTask() {&&&&new AsyncTask&Void, Void, Void&() {&&&&&&&&@Override protected Void doInBackground(Void... params) {&&&&&&&&&&&&while(true);&&&&&&&&}&&&&}.execute();}
void createHandler() {
new Handler() {
@Override public void handleMessage(Message message) {
super.handleMessage(message);
}.postDelayed(new Runnable() {
@Override public void run() {
while(true);
}, Long.MAX_VALUE && 1);
1234567891011
void createHandler() {&&&&new Handler() {&&&&&&&&@Override public void handleMessage(Message message) {&&&&&&&&&&&&super.handleMessage(message);&&&&&&&&}&&&&}.postDelayed(new Runnable() {&&&&&&&&@Override public void run() {&&&&&&&&&&&&while(true);&&&&&&&&}&&&&}, Long.MAX_VALUE && 1);}
void scheduleTimer() {
new Timer().schedule(new TimerTask() {
public void run() {
while(true);
}, Long.MAX_VALUE && 1);
void scheduleTimer() {&&&&new Timer().schedule(new TimerTask() {&&&&&&&&@Override&&&&&&&&public void run() {&&&&&&&&&&&&while(true);&&&&&&&&}&&&&}, Long.MAX_VALUE && 1);}
全部都是因为导致的。匿名类是特殊的内部类——写法更为简洁。当需要一次性的特殊子类时,Java提供的语法糖能让表达式最少化。这种很赞很偷懒的写法容易导致泄漏。正如使用内部类一样,只要不跨越生命周期,内部类是完全没问题的。但是,这些类是用于产生后台线程的,这些Java线程是全局的,而且持有创建者的引用(即匿名类的引用),而匿名类又持有外部类的引用。线程是可能长时间运行的,所以一直持有Activity的引用导致当销毁时无法回收。
这次我们不能通过移除静态成员变量解决,因为线程是于应用生命周期相关的。为了避免泄漏,我们必须舍弃简洁偷懒的写法,把子类声明为静态内部类。
静态内部类不持有外部类的引用,打破了链式引用。
所以对于AsyncTask
private static class NimbleTask extends AsyncTask&Void, Void, Void& {
@Override protected Void doInBackground(Void... params) {
while(true);
void startAsyncTask() {
new NimbleTask().execute();
private static class NimbleTask extends AsyncTask&Void, Void, Void& {&&&&@Override protected Void doInBackground(Void... params) {&&&&&&&&while(true);&&&&}}&void startAsyncTask() {&&&&new NimbleTask().execute();}
private static class NimbleHandler extends Handler {
@Override public void handleMessage(Message message) {
super.handleMessage(message);
private static class NimbleRunnable implements Runnable {
@Override public void run() {
while(true);
void createHandler() {
new NimbleHandler().postDelayed(new NimbleRunnable(), Long.MAX_VALUE && 1);
123456789101112131415
private static class NimbleHandler extends Handler {&&&&@Override public void handleMessage(Message message) {&&&&&&&&super.handleMessage(message);&&&&}}&private static class NimbleRunnable implements Runnable {&&&&@Override public void run() {&&&&&&&&while(true);&&&&}}&void createHandler() {&&&&new NimbleHandler().postDelayed(new NimbleRunnable(), Long.MAX_VALUE && 1);}
private static class NimbleTimerTask extends TimerTask {
@Override public void run() {
while(true);
void scheduleTimer() {
new Timer().schedule(new NimbleTimerTask(), Long.MAX_VALUE && 1);
private static class NimbleTimerTask extends TimerTask {&&&&@Override public void run() {&&&&&&&&while(true);&&&&}}&void scheduleTimer() {&&&&new Timer().schedule(new NimbleTimerTask(), Long.MAX_VALUE && 1);}
但是,如果你坚持使用匿名类,只要在生命周期结束时中断线程就可以。
public void onDestroy() {
super.onDestroy();
if (thread != null) {
thread.interrupt();
void spawnThread() {
thread = new Thread() {
@Override public void run() {
while (!isInterrupted()) {
thread.start();
12345678910111213141516171819
private Thread thread;&@Overridepublic void onDestroy() {&&&&super.onDestroy();&&&&if (thread != null) {&&&&&&&&thread.interrupt();&&&&}}&void spawnThread() {&&&&thread = new Thread() {&&&&&&&&@Override public void run() {&&&&&&&&&&&&while (!isInterrupted()) {&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&thread.start();}
Sensor Manager
void registerListener() {
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ALL);
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
void registerListener() {&&&&SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);&&&&Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ALL);&&&&sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);}
使用Android系统服务不当容易导致泄漏,为了Activity与服务交互,我们把Activity作为监听器,引用链在传递事件和回调中形成了。只要Activity维持注册监听状态,引用就会一直持有,内存就不会被释放。
在Activity结束时注销监听器
private SensorManager sensorM
public void onDestroy() {
super.onDestroy();
if (sensor != null) {
unregisterListener();
void unregisterListener() {
sensorManager.unregisterListener(this, sensor);
1234567891011121314
private SensorManager sensorManager;private Sensor sensor;&@Overridepublic void onDestroy() {&&&&super.onDestroy();&&&&if (sensor != null) {&&&&&&&&unregisterListener();&&&&}}&void unregisterListener() {&&&&sensorManager.unregisterListener(this, sensor);}
Activity泄漏的案例我们已经都走过一遍了,其他都大同小异。建议日后遇到类似的情况时,就使用相应的解决方法。内存泄漏只要发生过一次,通过详细的检查,很容易解决并防范于未然。
是时候做最佳实践者了!
可能感兴趣的话题
“于上述两种情况相似,开发者必须注意少用非静态内部类,因为持有外部类的隐式引用”–这里应该是因为非持有外部类的隐式引用吧
关于安卓频道
安卓频道分享Android开发文章,精选工具和安卓相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线查看: 5995|回复: 45
内存泄露调试心得
主题帖子精华
在线时间56 小时
&&&&平常是懒得去写点东西,但是今天,决定写点调试心得,主要是因为这个问题正真用了一周时间才得以解决,记得这几年在我调程序的过程里,因为一个问题,最长的解决周期也就是四天,但是今天这个问题却是打破了自己的记录。
&&&&内存泄露在程序设计中是较难的一个问题,如果在平常的应用程序设计中(PC机),内存泄露相对来说容易点,至少是可以通过一些工具去查找问题,解决问题。但是,在相对低端的嵌入式系统里,可是无法查找,虽说是有硬件仿真工具,可是面对,大量的数据和一些复杂的系统也是很难去仿真的,那么只有一点一点去分析代码,一点点去理解,假设最终找出问题,解决问题。
&&&&& & 在嵌入式内存泄露的问题里,我个人以为,又有一些区别,一种是:因为一次内存泄露导致程序无法运行,这类问题是相对容易解决的;另一种是:一次内存泄露,不太影响整个程序,甚至可以得出正确数据,两次也可以,三次、、、、、,但是达到一定程序时,问题就会出现,那么要解决,必须把每个问题都解决了才能从根本上解决问题,所以首先必须要找到每个问题。对于这个问题也是最难的,因为或许从最开始就不知道是什么引起的问题。很蛋疼的是,第二种情况就是我遇到的。
& & 下面将详细介绍整个过程,整个系统如下:
ede7f2f7aed8f811dacc37388afe9b10_794.png (0 Bytes, 下载次数: 0)
22:54 上传
硬件系统(第一次做板见笑了)
c0ad7aaf8dfe157d51cb96_83.jpg (0 Bytes, 下载次数: 0)
22:54 上传
c3cd5c591d5ab8e6dbb7fac8c6aa.png (0 Bytes, 下载次数: 0)
22:54 上传
问题描述:
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_
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)
&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 -1;
int16_t FindACmd(int8_t* num, int8_t state)
for(i=0;i&CMD_QUE;i++)
if(CmdQue[0].state == state)
return 0; &
& & 把这些搞完,下载程序查看,used虽不是1或0,但是变为30,121,55等等一些数据,有希望了,必然是内存的原因。
& & &就这样纠结了几天依旧没解决,有种无能为力的感觉。
& & 所以看底层的代码,&突然发现定义了这样一个sbuf[ ],起初在没有联机时,以为接收的数据是不定长的,所以没给具体的值,现在至少可以确定其最大值,因此将sbuf[&]改为sbuf[256 ],同样的其他几个也改正。(C语言仍需加强)
& & 下载程序,一看,很神奇的问题终于没了&,呜呼,终于解决了!真的很激动!
46bef8f81f435d8fc58566cbdff20bef_321.png (0 Bytes, 下载次数: 0)
22:54 上传
写到这里,不知道再写点什么了,平常感觉在技术上有许多想写的,可是正真要写时,感觉很难下笔,可是当真正写下整个过程时,发现对其理解更深了一层,所以做技术,写博客是很好的一种学习途径!
& & &行百里者半九十,需要做的还很多,尤其项目的完善还需要一个过程!
& & 写的有点乱,想等项目结了好好的写点整个项目由电路图的设计,PCB板的设计,驱动代码的设计,以及整个系统的调试过程,以此来对整个项目有个更深的了解。
&&&特别感谢在这个过程中鼓励和技术上帮助我的朋友和网友!
& &最后,附小诗一首,以表在整个程序调试过程中的心境!
夜,梦醒,偶感,
同时赠与一朋友
远望一边天,近观两重山;
只是云深处,崎狞自有路。&
a0bbac77723_81.jpg (0 Bytes, 下载次数: 0)
22:54 上传
不足之处仍有许多,希望大家多多指正!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
在线时间56 小时
附MODBUS协议
#include "modbus.h"
#include "usart.h"
#include "delay.h"
//********************************************************************************/ &
//modbus协议支持485总线
//修改日期:
//版本:V1.0
//Copyright(C) 象牙塔 All rights reserved
//Email:cronus_ QQ:
//********************************************************************************/
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 uI /* 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)
MODBUS_SEND_SBUF[0] = baseA//地址
MODBUS_SEND_SBUF[1] = 0X01;//功能码
MODBUS_SEND_SBUF[2] = 0X00;//读地址只有48个0X2C,远小于0XFF个
MODBUS_SEND_SBUF[3] = StartingA
MODBUS_SEND_SBUF[4] = 0X00;
MODBUS_SEND_SBUF[5] = CoilN
crcData = crc16(MODBUS_SEND_SBUF,6);
& MODBUS_SEND_SBUF[6] = crcData & 0 & // CRC代码低位在前
& MODBUS_SEND_SBUF[7] = crcData && 8;
& //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,8);
// MODBUS_SEND_SBUF[]=0; 需不需要清零
//返回数据
u8 ReceiveReadCoilData(void)
u8 result=0;
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;
RS485_RX_CNT=0; //长度清零
printf("读线圈出错!");
result=0X01;
/***************************************************************************
*写单个线圈(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)
MODBUS_SEND_SBUF[0] = baseA//地址
MODBUS_SEND_SBUF[1] = 0X05;//功能码
MODBUS_SEND_SBUF[2] = 0X00;//读地址只有48个0X2C,远小于0XFF个
MODBUS_SEND_SBUF[3] = ExportA
MODBUS_SEND_SBUF[4] &= ExportD
MODBUS_SEND_SBUF[5] = 0X00;
crcData = crc16(MODBUS_SEND_SBUF,6);
& MODBUS_SEND_SBUF[6] = crcData & 0 & // 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;
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;
RS485_RX_CNT=0; //长度清零
printf("写单个线圈出错!");
result=0X05;
/***************************************************************************
*写多个线圈(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 &H
* & &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)
MODBUS_SEND_SBUF[0] = baseA//地址
MODBUS_SEND_SBUF[1] = 0X0F;//功能码
MODBUS_SEND_SBUF[2] = 0X00;//起始地址高,写地址只有32个0X2C,远小于0XFF个
MODBUS_SEND_SBUF[3] = StartA//起始地址低位
MODBUS_SEND_SBUF[4] = 0X00; &//输出数量高位
MODBUS_SEND_SBUF[5] = ExportN//输出数量低位
MODBUS_SEND_SBUF[6] = ByteN//字节数
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)
MODBUS_SEND_SBUF[7]=ExportData&0XFF;
crcData = crc16(MODBUS_SEND_SBUF,8);
MODBUS_SEND_SBUF[8] = crcData & 0 & // 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);
MODBUS_SEND_SBUF[7]=ExportData&0XFF;
MODBUS_SEND_SBUF[8]=(ExportData&0XFFFF)&&8;
crcData = crc16(MODBUS_SEND_SBUF,9);
MODBUS_SEND_SBUF[9] = crcData & 0 & // 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);
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 & 0 & // 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);
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 & 0 & // 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);
/***********************/
// MODBUS_SEND_SBUF[]=0; 需不需要清零
//返回数据
u8 ReceiveWriteMulCoilData(void)
u8 result=0;
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;
RS485_RX_CNT=0; //长度清零
printf("写多线圈出错!");
result=0X0F;
/*****************************读写保持寄存器*********************************/
/*********主要功能码:读保持寄存器,写单个寄存器,写多个寄存器***************/
/****************************************************************************
*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);
/*****************************************************************************
*读保持寄存器(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,StartA
StartAddress=256*mn+ParameterN
MODBUS_SEND_SBUF[0] = baseA//地址
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] = RegN//不超过 7D(125)
crcData = crc16(MODBUS_SEND_SBUF,6);
& MODBUS_SEND_SBUF[6] = crcData & 0 & // 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;
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;
RS485_RX_CNT=0; //长度清零
printf("读寄存器出错!");
result=0X03;
/*************************************************************************
*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,RegisterA
RegisterAddress=256*mn+ParameterN
MODBUS_SEND_SBUF[0] = baseA//地址
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] = SinR
crcData = crc16(MODBUS_SEND_SBUF,6);
& MODBUS_SEND_SBUF[6] = crcData & 0 & // 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;
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;
RS485_RX_CNT=0; //长度清零
printf("写单个寄存器出错!");
result=0X06;
/*************************************************************************
*写多个寄存器(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,StartA
StartAddress=256*mn+ParameterN
MODBUS_SEND_SBUF[0] = baseA//地址
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:0XD(125)
**************************************************************************/
void SendReadEnterRegCommand( u16 StartAddress,u8 RegisterNum )
MODBUS_SEND_SBUF[0] = baseA//地址
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] = RegisterN
crcData = crc16(MODBUS_SEND_SBUF,6);
& MODBUS_SEND_SBUF[6] = crcData & 0 & // CRC代码低位在前
& MODBUS_SEND_SBUF[7] = crcData && 8;
& //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,8);
u8 ReceiveReadEnterRegData(void)
u8 result=0;
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;
RS485_RX_CNT=0; //长度清零
printf("读输入寄存器出错!");
result=0X04;
/*************************************************************************
*读焊接历史记录(功能码:0X41)
*焊接记录,最多960条记录;记录读取方式只有0和1,1代表读记录( 从最早的记录
*开始读),0代表重读记录。每次最多读取3条记录。每个记录体包含64个字节(低
*字节在先)。
*SD: 地址(1)+功能码(1)+读取方式(1)+CRC
*RD: 地址(1)+功能码(1)+读取方式(1)+回复的记录个数(1)+记录体(64)+CRC&
**************************************************************************/
void SendReadWeldingHistoryCommand( u8 ReadMode )
MODBUS_SEND_SBUF[0] = baseA//地址
MODBUS_SEND_SBUF[1] = 0X41;//功能码
MODBUS_SEND_SBUF[2] = ReadM
crcData = crc16(MODBUS_SEND_SBUF,3);
& MODBUS_SEND_SBUF[3] = crcData & 0 & // 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;
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;
RS485_RX_CNT=0; //长度清零
printf("读焊接历史记录错误!");
result=0X41;
void SendReadWriteTimeCommand(u8 TimeCommand , u8 TimeNumber[7] )
MODBUS_SEND_SBUF[0] = baseA//地址
MODBUS_SEND_SBUF[1] = 0X44;//功能码
& MODBUS_SEND_SBUF[2] = TimeC
if(TimeCommand==0)
crcData = crc16(MODBUS_SEND_SBUF,3);
& & MODBUS_SEND_SBUF[3] = crcData & 0 & // CRC代码低位在前
& & MODBUS_SEND_SBUF[4] = crcData && 8;
& //高位在后
&RS485_Send_Data(MODBUS_SEND_SBUF,5);
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 & 0 & // CRC代码低位在前
& & MODBUS_SEND_SBUF[11] = crcData && 8;
& //高位在后
&RS485_Send_Data(MODBUS_SEND_SBUF,12);
MODBUS_SEND_SBUF[3] = RecordPointer&0XFF;
MODBUS_SEND_SBUF[4] = RecordN
u8 ReceiveReadWriteTimeData( void )
u8 result=0;
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;
RS485_RX_CNT=0; //长度清零
printf("读写时钟错误!");
result=0X44;
/*************************************************************************
* 读设备标识(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 )
MODBUS_SEND_SBUF[0] = baseA//地址
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 & 0 & // CRC代码低位在前
MODBUS_SEND_SBUF[6] = crcData && 8;
& //高位在后
RS485_Send_Data(MODBUS_SEND_SBUF,7);
u8 ReceiveDeviceIdentifineData( void )
u8 result=0;
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;
RS485_RX_CNT=0; //长度清零
printf("读设备标识错误!");
result=0X2B;
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
高级会员, 积分 773, 距离下一级还需 227 积分
在线时间19 小时
主题帖子精华
在线时间40 小时
主题帖子精华
高级会员, 积分 713, 距离下一级还需 287 积分
在线时间0 小时
好贴,赞一个!楼主其实还是很能写的,应该多写写
主题帖子精华
高级会员, 积分 713, 距离下一级还需 287 积分
在线时间0 小时
回复【楼主位】象牙塔:
---------------------------------
第一次画板就画成这样已经很厉害了。。
主题帖子精华
初级会员, 积分 172, 距离下一级还需 28 积分
在线时间0 小时
学习了!!
主题帖子精华
在线时间56 小时
回复【5楼】hechao3225:
---------------------------------
呵呵,感谢鼓励,就是平时懒!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
在线时间56 小时
回复【6楼】hechao3225:
---------------------------------
因为是自己毕业的第一个项目,而且我专业是软件,所以能进现在的公司以及刚上手就做这个项目,非常幸运了。所以自己就很珍惜这个机会,我还是个新手
希望多多指教!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
初级会员, 积分 53, 距离下一级还需 147 积分
在线时间2 小时
楼主好有才,小小菜鸟膜拜!
主题帖子精华
初级会员, 积分 77, 距离下一级还需 123 积分
在线时间2 小时
学习学习!
主题帖子精华
在线时间56 小时
回复【10楼】Intel:
---------------------------------
互相学习!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
在线时间56 小时
回复【11楼】oppking:
---------------------------------
一起进步!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
高级会员, 积分 713, 距离下一级还需 287 积分
在线时间0 小时
回复【9楼】象牙塔:
---------------------------------
我也是新手,互相学习
主题帖子精华
在线时间0 小时
据说泄漏和越界不是一个事。
于停用该账号:http://www.microstar.club
主题帖子精华
在线时间31 小时
回复【楼主位】象牙塔:
---------------------------------
谢谢分享,做技术的压力大,尤其是问题长时间得不到解决的时候,容易心浮气躁,所以我们要努力保持一颗平常心,有时候问题就在不经意中解决了。
这种心境巨大的落差,也正是设计的魅力所在!共勉~
站在巨人的肩膀上不断的前进。。。
主题帖子精华
中级会员, 积分 222, 距离下一级还需 278 积分
在线时间0 小时
回复【楼主位】象牙塔:
---------------------------------
楼主能分享一下SRAM和Flash布线的心得吗?谢谢啦。
主题帖子精华
在线时间56 小时
回复【17楼】jikaishihuaidan:
---------------------------------
等项目完了吧,马上过年了,时间有点紧啊!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
在线时间56 小时
回复【17楼】jikaishihuaidan:
---------------------------------
确实,公司工程师指导的,板子感觉就是很稳定,因为与主板配套,所以有几个接口位置比较固定,线只能内聚,没法扩散,右边的线比较密集,部了好几次才成功。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
在线时间56 小时
回复【16楼】xiaoyan:
---------------------------------
是啊,共勉!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
中级会员, 积分 222, 距离下一级还需 278 积分
在线时间0 小时
回复【18楼】象牙塔:
---------------------------------
好的好的,楼主可别忘了,呵呵。
主题帖子精华
金钱117844
在线时间914 小时
主题帖子精华
在线时间56 小时
回复【22楼】正点原子:
---------------------------------
谢谢原子哥,在程序调试阶段帮了不少忙!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
新手上路, 积分 36, 距离下一级还需 14 积分
在线时间0 小时
主题帖子精华
中级会员, 积分 283, 距离下一级还需 217 积分
在线时间0 小时
牛逼啊!兄弟的modbus可以用吗?可以用就带走保存了
主题帖子精华
在线时间56 小时
回复【25楼】yongyooh:
---------------------------------
没问题,和主板做的测试,现在这部分代码在我的工程里用不到了,直接从上位机透传的!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
在线时间56 小时
回复【21楼】jikaishihuaidan:
---------------------------------
呵呵,论坛里高手如云,我也是刚刚学会画板子!@^@,无论如何都要自己画一块板,自己调试,完成一个小项目,至于经验,网上一大片,但那都是别人的,只有亲自走过这个流程,你才会明白,有些东西是无法教的,有什么问题可以放论坛里,大家讨论一下,还有就是请个有经验的工程师,帮忙指导指导。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间9 小时
主题帖子精华
高级会员, 积分 797, 距离下一级还需 203 积分
在线时间7 小时
没看太懂,但是谢谢楼主,多看几遍吧
主题帖子精华
中级会员, 积分 222, 距离下一级还需 278 积分
在线时间0 小时
回复【27楼】象牙塔:
---------------------------------
楼主谦虚了,我也是刚学画板子,先向你学习。
主题帖子精华
在线时间56 小时
回复【30楼】jikaishihuaidan:
---------------------------------
呵呵,互相进步!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
中级会员, 积分 222, 距离下一级还需 278 积分
在线时间0 小时
回复【31楼】象牙塔:
---------------------------------
先请教下,布局时一般模拟部分是不是要离电源部分最远?
主题帖子精华
在线时间56 小时
最好分开,但布局还是以你板子的整个板子为主,不能依着某点而不顾大局,推荐两篇文章,
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
初级会员, 积分 97, 距离下一级还需 103 积分
在线时间0 小时
主题帖子精华
中级会员, 积分 279, 距离下一级还需 221 积分
在线时间16 小时
不知道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;
这样的方式访问,虽然在定义的时候,麻烦了,点,但是在对内存的控制是比较好
当然这种做法,还有个好处就是,对暂时不用的缓冲区,可以相互之间合并给一个需要大型缓冲的应用
主题帖子精华
在线时间56 小时
回复【35楼】lxj:
---------------------------------
谢谢指教,目前项目在做两方面的测试,具体还的看实际情况!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
中级会员, 积分 428, 距离下一级还需 72 积分
在线时间8 小时
支持一下啊。
主题帖子精华
初级会员, 积分 51, 距离下一级还需 149 积分
在线时间0 小时
楼主搞过stm32f407吗?我想外扩一片sram,但是修改了启动文件和选项之后程序,程序执行到延时的时候就进入硬件故障中断了(延时是系统定时器延时),这个程序在没有外扩SRAM以前是可以用的,修改之后就出现这样的问题了,我是按照网上给的103的启动文件改的,不知道哪里除了问题
主题帖子精华
在线时间56 小时
回复【38楼】追风过后:
---------------------------------
你这么说不好确定,我也没搞过F407,可以把修改的代码贴出来
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
高级会员, 积分 797, 距离下一级还需 203 积分
在线时间7 小时
只想说第一次做板子比我做了多次的都好看
最终是想告知大家在定义数组时候一定要小心是么?问题出在数组定义上对吧
主题帖子精华
高级会员, 积分 797, 距离下一级还需 203 积分
在线时间7 小时
回复【35楼】lxj:
---------------------------------
这种用法在实际产品中用的效果如何啊?思路很赞啊
主题帖子精华
在线时间56 小时
回复【40楼】wwjdwy:
---------------------------------
是的,其实觉得还是细节,细节决定成败!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
初级会员, 积分 51, 距离下一级还需 149 积分
在线时间0 小时
回复【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&nbspC&==&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&nbsprivileged,&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:
;&
;&&&&&&&&/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&&&&&0x
&&&&&&&&&&&&&&&&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&0x&+&Stack_Size&;
;&&h&&Heap&Configuration
;&&&&o&&&Heap&Size&(in&Bytes)&&0x0-0xFFFFFFFF:8&
;&&/h&
Heap_Size&&&&&&&EQU&&&&&0x
&&&&&&&&&&&&&&&&AREA&&&&HEAP,&NOINIT,&READWRITE,&ALIGN=3
__heap_base
Heap_Mem&&&&&&&&SPACE&&&Heap_Size
__heap_limit
&&&&&&&&&&&&&&&&THUMB
&&&&&&&&&&&&&&&&nbspRESERVE8
&&&&&&&&&&&&&&&&;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&&&&&nbspendSV_Handler&&&&&&&&&&&&&;&nbspendSV&Handler
&&&&&&&&&&&&&&&&DCD&&&&&SysTick_Handler&&&&&&&&&&&&;&SysTick&Handler
&&&&&&&&&&&&&&&&;&External&Interrupts
&&&&&&&&&&&&&&&&DCD&&&&&WWDG_IRQHandler&&&&&&&&&&&&&&&&&&&;&Window&WatchDog&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&DCD&&&&&nbspVD_IRQHandler&&&&&&&&&&&&&&&&&&&&;&nbspVD&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&nbspoint&1&Out&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&DCD&&&&&OTG_HS_EP1_IN_IRQHandler&&&&&&&&&&;&USB&OTG&HS&End&nbspoint&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&&&&nbspROC
&&&&&&&&&&&&&&&&&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,=&0x&
&&&&&&&&&LDR&R1,=&0x
&&&&&&&&&STR&R0,[R1] &&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
;&Enable&GPIOD,&GPIOE,&GPIOF&and&GPIOG&clocks
&&&&&&&&&LDR&R0,=&0x
&&&&&&&&&LDR&R1,=&0x
&&&&&&&&&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,=&0x
&&&&&&&&&STR&R0,[R1]
&&&&&&&&&LDR&R0,=&0xBBBBBBBB&
&&&&&&&&&LDR&R1,=&0x
&&&&&&&&&STR&R0,[R1]
&&&&&&&&&LDR&R0,=&0xB44444BB&
&&&&&&&&&LDR&R1,=&0x
&&&&&&&&&STR&R0,[R1]
&&&&&&&&&LDR&R0,=&0xBBBBBBBB&
&&&&&&&&&LDR&R1,=&0x
&&&&&&&&&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,=&0x
&&&&&&&&&STR&R0,[R1]
&&&&&&&&&LDR&R0,=&0x44444B44
&&&&&&&&&LDR&R1,=&0x
&&&&&&&&&STR&R0,[R1]&&&&&&
&&&&&&&&&
;&FSMC&Configuration&&&
;&Enable&FSMC&Bank1_SRAM&Bank&
&&&&&&&&LDR&R0,=&0x
&&&&&&&&LDR&R1,=&0xA0000010
&&&&&&&&STR&R0,[R1]
&&&&&&&&LDR&R0,=&0x&
&&&&&&&&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_IRQHandle

我要回帖

更多关于 解决内存泄漏的方法 的文章

 

随机推荐