单片机C语言编程经验总结
   来源:中国科技博览     2021年08月26日 07:24

单片机开发经验总结

[摘 要]总结单片机C语言编程的经验和教训。

[关键词]经验教训,单片机,函数,编程

中图分类号:TP273.4;TP18 文献标识码:A 文章编号:1009-914X(2017)14-0335-02

[Abstract]Summing up the experience and lessons of C programming language.

[Key words]experiences and lessons; Single-Chip Microcomputer/ Microcontroller ; function ; programming;

一、引言

单片机,也被称为“单片微型计算机”、“微控制器”和“嵌入式微控制器”[1],是指在一个集成芯片中,集成微处理器、定时/计数器、存储器、通信部件和基本的I/O接口,即在一个芯片上实现一台微型计算机的基本功能[2]。虽然它存储量小、接口简单、功能较低,但是控制能力强、可靠性高、低功耗、低电压、系统扩展容易[1],体积小、价格便宜可大大降低各类开发的成本。

最近几年特别是开始从事3D打印开发工作以来,逐渐接触了单片机,并开始做了一些单片机C语言编程的工作,到現在已经5、6年了,感觉是总结一下的时候了。

二、经验

1.找到入口

开始学习时总是一头雾水,看示例程序也总感觉那么多文件不知从何开始,后来想起以前用任何语言编任何程序实际都有一个整个程序开始的入口位置,仔细观察果然发现单片机程序实际也都是从一个main函数开始进入的。就是在用户程序中没找到main函数的,也在所使用软件的核心程序中找到了(比如Arduino软件).

不仅如此,单片机的main函数的内容都很有规律,一般都是前面做初始化工作,然后就是一个循环一直运行。以Arduino软件为例,针对AVR系列单片机的核心main函数如图1:

其中init()是单片机核心部分的系统初始化函数,initVariant()是核心部分的变量初始化函数,setup()是用户的硬件和变量的初始化函数,loop()是用户运行的循环函数,其余USBDevice.attach()、serialEventRun()是对串口设备的连接、中断处理的通用函数。这样一来用户程序中基本就只需要编写setup和loop就可以了,无需编写main函数。

找到了入口,就一下子找到了头,可以对示例程序一步步研究下去,自己编程也知道从何开始了。

2.单独的设备测试程序

在新增加一些外部设备时,我感觉不要一开始就把它加到整个程序中去,那样经常会把自己弄混,出了错都不知道原因在哪。

最好先排除其他全部设备或尽量把无关的设备排除掉,单独做一个简单的专门针对这个设备的程序来测试,成功后再把它加入到整个工程中去。就是说要先基本确定这个设备单独的初始化、运行都是正常的,再把它混合到大系统中观察与其他设备的联合运行情况,至少可以先排除某些错误、确定某些问题,在实践中我感觉这样做很有用。

3.使用工具

在增加比如LCD、EPROM之类的外部设备时,开始调试期间总是这样那样的不顺利,特别是一些元件的协议不清楚的情况下。找供应商拿例程、上网查找资料当然是必要的,但我感觉这种时候示波器、逻辑分析仪之类也是很有用的,至少可以先看清楚信号是否发送,是否发送得准确,然后可以再检查其他部分,确定是哪部分的原因,是硬件接线出错还是对它的设置出错,给自己调试确定一个方向。

比如有一次增加一个I2C的LCD屏,写好程序后测试LCD屏却无法显示,开始一心以为是程序对屏的初始化设置有问题造成数据没有发送出去,不断修改参数却一直无效,后来想起用示波器,一看才发现信号都是正确发出的,赶紧去检查其他部分,很快发现是地址错误,一修改正确马上就显示正常了。

所以适当的时候使用工具是编程测试中很好的辅助。

三、教训

1.别忘了"喂狗"

由于单片机自身抗干扰能力不强,尤其在一些条件比较恶劣、电磁干扰较强的场合,常会出现单片机因受外界干扰而导致死机或程序跑飞的现象,造成系统不能正常工作,业界通常采用"看门狗"技术来防止单片机死机,将死机的系统重新复位并使其正常工作[3]。常用的"看门狗"技术分为软件"看门狗"和硬件"看门狗"。

这里要讨论的是软件"看门狗"的问题。所谓软件"看门狗"一般采用高级中断的方式执行,通过在中断程序中设置系统复位寄存器或对程序计数器赋予初始值的方式进行系统复位。同时在系统正常的主循环中适当插入"喂狗"指令来重置定时器值,说明系统是正常运行不需重新启动。这样当程序真正跑飞或进入死循环时,定时器因计时完成执行复位程序,就使系统复位[3]。

用软件实现"看门狗"时,最要紧的一条就是别忘记了"喂狗"。

记得有一次,改造一个3D打印机的控制程序,因为新机型不需要加热,于是把所有有关温度的部分都删掉,自认为减少了工作量肯定没问题,结果一测试就发现程序不断的重新启动,费了一番力气查找,才发现是不小心把"喂狗"的工作也给删掉了,造成不断重新启动。所以很多时候要小心这些"喂狗"的使用,在循环等待的部分都要注意增加相关语句,而且喂狗时间的间隔必须小于设置的定时器中断时间。

2.小心设置中断级别

对于中断级别的问题,一开始因为编写的都是简单程序,一般只有1、2个中断,所以我是非常不重视的。

直到有一次,工作中需要把单片机的CPU换掉,按照原来的程序把所有功能都原样移植过去,好不容易把所有单独的各元件功能都调通了,组合起来工作后大部分功能也都正常,却发现有一个功能只是从通过SPI设备读取接受命令换成了直接用串口接受命令,就经常出现死机无法正常工作的现象。当时一头雾水,把软件相关的很多部分拆开分析、测试、单步执行都没有发现问题,又因为是一个随机出现的问题,无法跟踪,让我头疼了很久,直到有一天其他同事提醒我关于中断级别的问题,我还有些不以为然,觉得以前都没问题,现在也不应该有问题,但因为没有头绪,就抱着试试看的心态尝试把几个相关中断级别降低了,结果奇迹发生,真的没有再出问题了。事后考虑,换了新CPU,它对中断级别的设置与原来的不同,造成实际串口中断采用的是最高级别,其他的几个定时器之类的中断级别实际也是最高级别的,同时工作,在串口通讯频繁的情况下,很容易造成冲突,出现工作不正常也就不奇怪了。

通过这件事,让我明白了设置中断级别的重要性,以后每换一个新的CPU芯片都先去查资料,弄清楚它的中断设置是如何设置的才确定各个功能的中断级别,不再想当然。

四、总结

总之,这就是我这几年编写单片机C语言程序的一点心得和体会,希望对大家有用。

参考文献

[1] 张迎新等.单片机初级教程-单片机基础[M].北京:北京航空航天大学出版社,2006:2-5.

[2] 陈黄飞.单片机计数的发展及应用探析[J].软件导刊,2011,10(6):5-6.

[3] 赵洪军.软硬件看门狗技术研究[J].电子世界,2012,04:13-15.

作者简介

徐文,女,1973.4,湖南长沙人,硕士研究生,高级工程师,主要进行数据库管理、图象处理、运动控制、3D打印等的研究。

文章 单片机 程序