一种嵌入式技术教学模式研究
作者: 石宜金 谭贵生
摘 要:根据应用型本科院校和教育部的教育方针,需要不断地提高学生实践能力,文章提出一种嵌入式技术教学方法,通过以实践的教学项目为中心,提高学生编写嵌入式开发驱动程序的书写技能,提出一种基于Hello World程序设计思维的LED驱动程序开发教学模式,通过项目的教学实践,比较各种模式下LED驱动的优缺点和使用情景,该方法与其他三种编程方法相比,操作简单,能够提高学生的积极性,最终达到教学要求,在很大程度上提高教学质量。
关键词:教学模式;嵌入式;Hello World;能力培养
中图分类号:G642 文献标志码:A 文章编号:2096-000X(2022)06-0100-05
Abstract: In view of the educational policy of application-oriented universities and the Ministry of Education, it is necessary to continuously improve students' practical ability. This paper proposes a teaching method based on embedded technology, which, through practical teaching projects as the center, improves students writing skills of embedded development drivers. This paper proposes a teaching mode of LED driver development based on Hello World programming thinking. Through the teaching practice of the project, the advantages and disadvantages of LED drivers in various modes and application scenarios are compared. Compared with the other three programming methods, the method is simple in operation, can improve the enthusiasm of students, and finally can meet the teaching requirements, which shows that the teaching method is effective and improves the teaching quality to a large extent.
Keywords: teaching mode; embedded; Hello World; ability training
嵌入式技术所涵盖的面较广,包括硬件、软件以及操作系统和通信等,在对电子信息工程和计算机科学与技术专业大学本科三年级和四年级的教学中,该课程的方向可以分为硬件方向和软件方向,其中硬件方向的驱动开发难度较大,对于学生的能力要求较高,既需要硬件知识,又需要软件知识。因此,第一次课程的教学设计和教学内容尤其重要。
和其他编程课程一样,各种语言的学习一开始都为大家设计了一个著名的Hello World程序,对该程序情有独钟。对于硬件程序的编程来说,仅仅依靠以前的一个Hello World就达不到这个程序的目标。Hello World程序其实在早期起着较为重要的作用。一方面,这个程序可以让学习者较为轻松地了解将要学习的程序设计有什么特点?怎么编写?怎么编译?怎么运行?另外一方面,通过这个程序的学习和演示,可以提高学习者的学习兴趣,更重要的是对这门课程或语言的学习有一个系统的清晰的认识,在心里上降低学习者的学习难度,提高学习兴趣,这也符合认知的自然规律。
嵌入式技术中的硬件驱动编程部分,对于学生来说,学习难度较大,主要体现在编程环境的搭建、编译器的不同和软硬件结合的繁琐上。从查阅的参考文献来看,目前嵌入式技术类课程驱动开发的第一个程序主要是关于LED灯的程序,其中点亮一个灯和流水灯程序选择的较多,基于这个思想,笔者根据多年的嵌入式技术教学,提出嵌入式驱动开发Hello World的教学设计,具体设计包括三个步骤,一是图形化界面的编程,二是Windows环境下使用Keil编程,三是在Linux环境下利用GCC编程。
为了提高教学质量和教学深度,笔者通过几轮的教学,摸索出OBE成果导向的教学模式分为图形化编程、Windows下函数调用编程和Linux环境下的GCC 编程。在第一次课程的教学中以LED驱动程序的三种写法作为嵌入式驱动开发的课程案例引入,同时在后续的教学中贯穿这种教学模式,让学生在编程思维和开发流程上有较为深刻的认识。
一、图形编程思维培养
从课程难度来看,如果一开始就进行Linux环境下的驱动编写势必会使学生产生一定的畏惧感,因此,查阅国内外的教学研究资料,最终决定采用图形化编程进行编程思维培养,让学生首先清楚自己要做什么?要完成的学习任务和学习目标是什么?通过分析大量的图形化编程软件,考虑到延续性和体系性,决定采用ArduBlock这款图形化编程软件来培养学生的编程思维,更重要的是让学生知道我们要完成的任务,先让学生有一种成就感。ArduBlock是Arduino的第三方图形化编程软件,依附于Arduino软件,其是文本式、图形化积木搭建编程的一种可视化的交互性极强的编程方式,如图1所示。编程门槛降低对于大学生程序设计能力的提升作用较大,还有一个优点是它可以生成C语言,如果你不懂C语言,这样就能够引导学生明白C语言的重要性,同时也可以作为C语言的练习环境,让学生能够回忆C语言,同时能够理解C语言在驱动编写方面的高效性和重要性。在安装图形化编程环境后,第一次授课便可以先以图形化编程实现LED驱动,并配合硬件的实验结果来导入驱动开发的第一次课程。如图1所示,左边是C语言程序,右边是图形化的界面编程界面,通过设置引脚的输入输出来设置一个闪烁的LED驱动程序,中间进行演示控制和高低电平的控制,操作非常简单,学生可以很快上手,同时也能够发挥自己的想象空间来完成一些设计。如图2所示是制作好的LED灯的实验结果。
图形化编程的优势在于简单易学,学生能够大大提高学习兴趣并能够在较短的时间完成简单的驱动开发,但是缺点在于理论性不够,技术性不够,不利于学生的深入学习。
二、Windows下函数调用编程
在图形化程序实现后,学生对于课程的目的和需要完成的任务有了清晰的认识,进一步引导学生了解图形化程序背后的原理,通过理论教学,应该让学生明白驱动程序的编写主要是对寄存器的功能设置,数据设置和测试用例的书写,因此看懂硬件原理图和芯片对应的用户手册后便可以进行程序编写,目前在这部分的教学中使用Keil软件来进行教学的学校比较多,因为这款软件将很多函数进行了封装,同时芯片参加也提供了BSP程序,因此程序开发的流程相对来说难度会有所降低,同时对函数进行了封装以后,调用就比较容易,驱动的书写流程就简化为硬件设计、寄存器理解和驱动案例编写。
图2 LED硬件实验结果
因此,第二部分的教学是在Windows环境下通过函数的调用来完成LED驱动的编写,由于有了图形化编程的经验,学生对于硬件的原理理解起来就相对比较容易,目标就是通过对寄存器的操作来完成高低电平的输出控制,以及延时程序的书写,采用的编程语言是C语言。硬件采用STM32F4,体系架构采用哈弗架构的RISC。要完成这款芯片的LED驱动编写,主要任务有硬件设计、软件设计和bin程序的下载验证。如图3所示,硬件采用的是共阳极的二极管,LED0和LED1分别对应的引脚是PF9和PF10,此部分可以在芯片原理图中查找到,要驱动二极管发光,需要设置GPIO,让PF9和PF10输出低电平即可,若进行闪烁效果的设置,就需要调用延时程序。
在查阅了寄存器之后,分别书写LED的头文件和驱动文件。这部分的教学需要让学生能够较好掌握芯片手册的查阅方式,同时能够具备一定的英文阅读能力和理解能力,通过查阅资料可以让学生慢慢适应芯片手册的使用方式。在理解硬件原理图和配合芯片手册的基础上,结合寄存器的设置方式,学会寄存器的功能设置和寄存器的数据设置,能够进一步使用芯片所提供的板级支持包来进行函数调用,简化芯片驱动的开发流程和进一步熟悉LED驱动的开发方法。关键代码如下:
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,PIO_PUPD_PU); //PF9,PF10 设置
LEDS0=1;//LED0 关闭
LEDS1=1;//LED1 关闭
如图4所示为寄存器的设置,为了能够让硬件驱动正常工作,首先应该对PORTF进行功能设置。让它处于使能状态,通过C语言的位操作来设置bit5置1,这样这个时钟寄存器就能工作,在设置完寄存器后通过系统提供的板级支持包,调用GPIO_Set 函数,设置PF9 和 PF10为OUT模式,然后通过寄存器对LED所接的引脚进行操作,输出高电平则灯灭,输出低电平则灯亮。这样的程序设计方式能够让学生深入地理解keil平台下借助函数库进行编程的原理。关键代码如下:
#define LED0 PFout(9) // DS0
#define LED1 PFout(10) // DS1
void LED_InitDr(void); //初始化
#define LED0 PFout(9) // DS0
#define LED1 PFout(10) // DS1
驱动编写完成后,将其加载到芯片上,硬件已经能够进行正常的工作,为了测试驱动的功能,下一步进行测试用例的编写。主要是对上面两个LED灯进行控制,以函数的形式进行调用,调用之后只需要设置LED数据寄存器的输出信号为低电平亮,高电平灭,若学生在学习过程中需要添加更加复杂的功能,可以进行进一步的程序升级。完成硬件驱动编写后,学生便可以使用flymcu软件将驱动烧录到芯片上,最后进行功能测试。如图5所示。
三、Linux操作系统下的驱动编写
硬件驱动的编写在图形化界面和Keil环境下都相对比较容易,上述两种编程方式可以让学生清楚课程所需要掌握的技能,同时更加明确课程要学习什么,最终对硬件配置的目的是什么。通过上述两个LED驱动的编写,学生能够基本掌握驱动的编写流程,熟悉了工具软件的使用方法,起到了Hello World程序教学的目的,但是学生想深入地理解硬件驱动编程,还必须在Linux操作系统下进行程序开发。在第二种LED驱动开发中,学生进行函数调用比较容易,但是却忽略了函数背后的深层次原理,对于底层的认识不透彻,尤其在寄存器的定义和配置上面的理解不深入,这样会导致学生在后续的学习和工作中无法深入理解嵌入式驱动开发的原理,尤其重要的是,在当前的企业开发中,大多数环境为Linux操作系统下的编程环境,驱动开发完成后还需要进行驱动内核加载和驱动程序的加载,加载完成后便可以裁减进入到操作系统内核,同时进行动态加载,方便上层APP的调用。所以进行Linux操作系统下的驱动开发教学尤其重要,在教学过程中采用难度较低的Ubuntu操作系统,硬件选择市场上教学资料较多的2440A芯片。
和上面的两种编程方式一样,主要进行硬件电路图的识别、芯片手册查阅、寄存器物理地址的查找、寄存器的配置和源程序书写和源程序的GCC编译。如图6所示。
GPFCON &= ~(GPF0_mask|GPF2_mask);
GPFCON |=(GPF0_in|GPF2_in);
GPGCON &= ~GPG3_mask;
GPGCON |=GPG3_in;