目前微控制器的性能越来越好,集成的模块也越来越多,内部自带的寄存器越来越多,整体的架构也越来越复杂,因此库开发成为微控制器开发的主流。通过库开发,可以在不了解微控制器底层寄存器配置的情况下,快速地玩转单片机的各个模块资源。本书的目的就是带领读者深入了解开发K60库的过程,最终达到灵活快速上手其他人的库,甚至自行开发属于自己的库的目的。
笔者作为一名老师,每年都接触到各种各样零基础的学生。初学者学习微控制器,主要会遇到以下几种困难:
看不懂Datasheet
目前市场上大部分的微控制器书籍虽然都讲解寄存器的配置,但寄存器的说明都不按普通Datasheet的格式去排版,也没有介绍如何看Datasheet,导致学生看不懂Datasheet。例如寄存器里灰色表示不可操作或者保留,w1c表示写入1就会清0而写入0是无效等,如果这些内容不加以说明,很多初学者就不知道原来有这么一回事。
看不懂时序图
微控制器总是需要使用特定的时序来与各种外部模块进行通信,时序图最能描述时序的细节。很多书仅讲解寄存器的配置,直接忽略了时序图的讲解。如果初学者在开发中遇到通信失败的问题,那是硬件问题还是寄存器配置问题呢?唯一的解决方法就是测时序(示波器或逻辑分析仪),判断时序是否正确。但如果连时序图都看不懂,又怎么能看懂测出来的时序呢?
看不懂代码
目前的C语言书基本上都是针对计算机系统的,几乎没有专门针对嵌入式系统的。而微控制器嵌入式的书几乎都仅局限于寄存器配置,其他必须的编程语言知识、编程思想几乎不讲。初学者不会无师自通,因此自然看不懂代码。
考虑到大部分的读者都缺乏嵌入式C语言的知识,本书的第1章就先给读者补充相关的嵌入式C语言知识。这些内容都是根据学生的问题和野火初学123论坛的网友咨询整理来的,相信大部分的读者都是第一次接触这些内容。
不懂调试
程序跑飞了,如何解决?单步调试、看调用栈,这些都是基本的调试技巧。虽然一般的教程都会介绍编译器创建工程的方法、工程设置的方法,但几乎都省略了编译器的调试工具介绍,似乎调试工具可有可无。虽然各个编译器的调试工具都大同小异,但初学者如果没接触过,则更需要学习调试工具来锻炼调试代码的能力。
不懂模块化编程
随着CPU资源的丰富和需求的提升,嵌入式软件的复杂性越来越高,因此对开发人员的程序架构要求也越来越高。目前市场上几乎没有嵌入式的书籍会谈及模块化、软件分层这些内容,而这些却往往是项目开发的最基本要求。
模块化编程最常用的就是头文件,而头文件有什么用?别说是初学者,哪怕是工程师也难以准确地了解头文件的使用。一般也仅仅知道是用于函数声明、变量声明这类的,却不知道头文件是不参与编译的,对内容是没有要求的,仅仅在预处理阶段把内容插入到包含该头文件的相应文件里。
初学者是一张白纸,是不懂模块化编程的,而嵌入式这类书就应该在例程中讲解相应的知识。
不懂软件编程思想
目前的嵌入式开发招聘,哪怕是不涉及Linux系统的纯单片机开发,一般也会注明会Linux系统者优先。原因就在于学习过Linux系统的人都会接触Linux系统分层的架构,了解应用层是如何通过硬件抽象层的API接口来调用硬件,学习设备注册(回调函数)、消息机制(队列)、线程机制(时间片)等思想,而这些思想都可以用在普通的单片机开发中。本书在编写代码的过程中已经融入了很多编程思想,例如按键的消息机制,状态机的思想,软件分层的思想等,力求让读者能够掌握常用的编程思想。
缺乏真正的项目经验
既然是初学者,那么缺乏项目经验是必然的。作为教程的作者,如果没有把项目经验讲出来,那么会让初学者错失了一个学习开发技巧的机会。例如项目开发中最常用的是定时按键扫描,而不是查询按键扫描,但几乎全部的教程都仅讲解查询按键扫描,笔者也是直到参与真正的公司项目时才了解到原来还有这样一种按键扫描方式。
不懂微控制器的内存分布
开发微控制器程序,如果连程序的内存存储位置都不知道,那么出现各种bug的时候都难以找出问题,因此嵌入式招聘的笔试面试几乎必考微控制器的内存分布。另外,目前市场上很多产品都是通过ISP或者IAP下载更新固件,或者动态从SD卡、nand Flash里加载代码映像到RAM里运行相应的程序,这些功能都需要开发者对微控制器的内存分布十分熟悉。即使是初学者,一时间难以消化这些知识,但在初学阶段也应该了解有这么一回事,在后续的开发中慢慢领悟。
初学者在学习微控制器开发的时候,之所以觉得微控制器很难学,实际上是因为大部分的微控制器教程往往忽略了讲解微控制器的基础知识,如同没学会走路就来学跑步那样。
本书采用IAR开发环境,全部例程都整合成代码库的形式,但目的不在于给读者简单地调用库,而是试图通过与读者一起编写代码库,介绍各种编程知识和思想,从而让读者在初学阶段就形成良好的编程习惯,具有良好的编程思想,进而让读者达到了解库的实现过程,快速地上手其他各种各样的代码库的目的。
本书以Kinetis系列K60微控制器外围模块为轴线,从简单的GPIO点亮LED来了解K60的编程步骤,到GPIO按键的定时扫描了解按键消息机制,再到UART、I2C、SPI的时序分析学会看时序图、接着到系统时钟的设置和定时器的使用来熟悉微控制器的时钟模块,再学习模数转换模块、DMA模块、Flash模块、CAN总线、外部总线flexbus、SDHC总线和USB总线等各种模块,从易到难逐步推进,中间补充各种相关的拓展知识,从而让读者熟悉库开发的各个细节。
配套资料
书配有全部案例的开发工具、完整源程序、数据手册、原理图,读者可到北京航空航天大学出版社网站(www.buaapress.com.cn)的“下载专区”免费下载。
致谢
首先,感谢野火初学123论坛的网友,他们不断地反馈使得本书的内容更加充实,更能解答初学者的疑惑。其次要感谢陈杏飞等人提供的翻译、对书稿内容的校正和建议。
由于本书内容涉及的知识面广,时间又仓促,限于笔者的水平和经验,疏漏之处在所难免,欢迎各位工程师、老师和读者批评指正,可以发邮件到minimcu@foxmail.com与作者进行交流,或者登录野火初学123论坛http://www.chuxue123.com进行讨论。
王日明廖锦松
2014年8月