马明星+张玉婷+雷祥
摘要:针对传统嵌入式课程设计的弊端,给出一种新的以ARM开发板为硬件基础的嵌入式课程设计方案,方案以介绍开发流程为主线,引入嵌入式实时操作系统,使学生能够从整体把握嵌入式开发流程。实践表明,以开发板为硬件基础的嵌入式课程设计,能够提高学生的开发兴趣和自主开发能力,达到嵌入式教学目标。
关键词:STM32;μC/OS-III;ARM;嵌入式开发;课程设计
中图分类号:TP338 文献标识码:A 文章编号:1009-3044(2017)06-0177-02
1概述
嵌入式课程是高等院校电子和信息专业一门非常重要的课程。嵌入式技术应用规定了嵌入式这门课程应该侧重于工程性和应用性。然而目前嵌入式教学仍然处于以理论学习为主,课程设计为辅的局面。这导致了学生的实践能力得不到提升,缺乏对嵌入式课程的学习兴趣[1]。其次,现有的嵌入式课程设计多以教学试验箱为主,这类教学试验箱配备的微处理器性能低下,难以满足复杂项目的开发需求。这些缺点都限制了学生对嵌入式课程的学习热情,嵌入式教学难以达到预期效果[2]。使用开发板进行嵌入式教学将有效解决上述问题。首先,从接触硬件开始,学生有一定的开发兴趣,其次,目前市面上的教学开发板都配备了当前主流单片机,这类单片机具备卓越的处理性能和丰富的外设接口,能够设计更为复杂和实用的系统。最后,规范化的嵌入式开发流程也可以提高学生的动手能力和开发兴趣[3]。本文以远洋电子工作室出品的野火STM32开发板为例,设计一个加入嵌入式实时操作系统μC/OS-Ⅲ的课程设计,目的在于使学生能够接触当前主流的ARM芯片的结构并且学习复杂工程的基本开发流程,提高学生工程开发能力和开发兴趣。
2 开发环境介绍
硬件方面,野火开发板上的微处理器使用的是意法半导体公司的STM32F103ZET6。该处理器是Cortex-M3内核的32位微处理器,最高工作频率可达72MHz,内置512K的FLASH和64K的SRAM,11个定时器,同时具有多达13个通信接口。该开发板以总线的方式引出IO,这样的设计可以方便用户进行通信接口的外接工作,隔离跳帽设计可以方便用户进行DIY设计。开发板可以用于完成跑马灯、文件系统移植、微型实时操作系统移植等一系列复杂的实验,这些实验可以增强学生的动手能力和自主学习能力,同时培养他们对于嵌入式开发的兴趣。
软件方面,以μC/OS-Ⅲ嵌入式操作系统为开发环境。μC/OS以其开源、可裁剪、可固化、稳定性和安全性高的特点,在嵌入式领域有着极其广泛的应用,该嵌入式系统也以短小简洁而著称,适合引入嵌入式课程设计。μC/OS-Ⅲ作为μC/OS的最新版本,较前面的版本加入了许多新的特性。比如,不再限制最大任务数目,允许相同优先级存在,加入时间片任务调度算法等。新的特性使得μC/OS-Ⅲ的功能更为强大,也方便了开发者的使用[4]。
3 μC/OS-Ⅲ在STM32上的应用
μC/OS-Ⅲ的代码量大约在6K~24K。野火STM32开发板的上512K字节FLASH和64K字节的SRAM运行μC/OS-Ⅲ是非常充足的,本次课程设计采用的是μC/OS-Ⅲ的V3.02.00版本。经过测试,该版本系统在STM32上可以可靠运行,并且非常稳定。下面将介绍课程设计的主要内容。
3.1 功能要求
根据图2所示的开发板上LED灯的硬件原理图,在给定的MDK工程中进行编程,实现以下要求:
开发板上电以后,三个绿色的LED小灯将进行间隔为200ms的闪亮,表示系统已经运行。使用PortHelper上位机软件,输入LED灯编号和长亮时间,对应的LED灯将进行定时长亮。长亮完毕后,LED灯将继续进行200ms的间隔闪亮。
3.2 设计分析
按照从下往上的原则,首先进行板级代码的编写工作,主要内容是LED的控制和串口的配置部分。之后进行应用级编程,在应用级代码中创建相应的任务,实现数据接收和长亮控制。具体编程步骤:首先编程实现板级驱动控制。然后在μC/OS-Ⅲ中建立启动任务,在启动任务中继续创建三个LED1~LED3灯的闪亮任务。上位机通过串口发送控制数据到内存中,各个LED任务通过检测内存中的数据来确定是否进行长亮和进行长亮的时间。
需要指出的是,在使用串口中断进行数据传输时,如果操作较快可能会出现数据出错的现象。鉴于此,将串口配置为DMA(Direct Memory Access)方式传输数据,这种方式可以有效提高传输速度和稳定性。
最后,为各个任务分配相应的任务优先级,分配方案如下表1所示:
3.3 编程流程
按照从下往上的编程原则首先进行板级代码编程,在MDK工程的bsp项目组中新建两个源文件和对应的头文件,这两个源文件分别是LED灯对应端口的配置程序和串口的配置程序。
对于LED灯的编程,为了方便移植,使用带参宏定义LED对应引脚:
#define Reset(p,i) {p->BRR=i;}
#define Set(p,i) {p->BSRR=i;}
BRR和BSRR寄存器是STM32的GPIO端口对应的设置/清除寄存器。寄存器只能进行写1操作,在对应的端口输出低/高电平,写0将不产生影响。上述宏定义将控制引脚的电平高低,实现LED点亮和熄灭操作[5]。
串口用来连接上位机和开发板,在串口编程中主要包括串口配置、DMA配置和printf()函数的重定向编程。串口配置为波特率是115200,1个停止位,8个数据位,没有校验位,不使用硬件流控制。这种常用的配置方式既安全又高效[6]。
最后,对printf()函数进行重定向。printf()函数作为C语言的格式化輸出函数,将数据发送到标准输出设备以达到显示的目的。在嵌入式开发中,对于没有标准输出设备的情况,需要重定向该函数,即将待发送数据发送至串口,利用串口助手进行显示。
在完成了板級代码的编程工作之后,进行应用级编程。嵌入式实时操作系统环境下将以线程为单位进行编程,线程也可以称之为任务。每个任务都有自己的任务控制块,操作系统通过任务控制块去感知和控制任务。根据任务优先级和任务的状态,μC/OS-Ⅲ进行任务调度,以保证各个任务都能被执行。对于每一个具体的任务,都要声明相应的任务控制块并且给任务分配堆栈,任务控制块保存任务的基本属性,任务堆栈用于保存临时变量和中断现场。任务堆栈的大小一般可以设置为128。在线程编程中,一般在主函数板级代码之后进行起始任务的创建工作,其余各个任务将在起始任务内部进行创建。因此,需要设置启动任务作为起始任务[7]。各个LED闪亮任务完成检测内存中的数据和执行定时长亮操作。具体方式是轮询查看全局数组中的控制数据,并对数据进行处理,判断数据是否是发给本任务。如果不是,将继续执行200ms的闪亮任务。如果是则对数据中的字符进行转换,计算长亮时间,调用系统延时函数进行精确的定时长亮操作。定时长亮操作执行完毕后,继续进行200ms的闪亮操作。至此,设计要求完成。
3.4 实验结果
给开发板上电,使用MDK编译代码,然后,并且利用ULINK2将代码下载到开发板上。然后对开发板进行复位。可以看到三个绿色的LED小灯将进行200ms的周期性亮灭。打开PC端的串口助手PortHelper,选择COM3端口,在输入对话框中输入“L3 30”字样。点击发送,可以看到LED2小灯将停止闪烁,并点亮,点亮时长为30秒。30秒后,LED2小灯将继续进行200ms间隔的闪亮。下图2为实验截图:
4 结束语
以STM32开发板为硬件基础,学生接触当前主流的嵌入式开发芯片,课程设计中引入嵌入式实时操作系统,并且涉及开发板底层硬件驱动以及应用级软件编程。使学生能够从硬件到软件、从底层到上层、从裸机程序到系统编程全面接触嵌入式开发总体流程,对嵌入式工程开发的原理、流程和要点有整体性的把握,从而达到嵌入式教学的教学目标。
参考文献:
[1] 胡仕刚,曹会祎,吴笑峰,等.基于开发板的嵌入式系统课程教学模式探索[J].信息通信,2016(7):160-161.
[2] 陆庆,肖堃,聂晓文.嵌入式课程实验教学体系的改革与创新[J].实验科学与技术,2011(S1):201-203,216.
[3] 王超,骆德汉,郑魏,等.基于STM32的嵌入式智能家居无线网关设计[J].计算机技术与发展,2013(3):241-244.
[4] 杨伟,肖义平.基于STM32F103C8T6单片机的LCD显示系统设计[J].微型机与应用,2014(20):29-31,34.
[5] 常薇,孙颖,孙爱东.嵌入式课程设计开放性实验建设—嵌入式SD卡接口系统设计实验[J].实验室研究与探索,2007(12):225-227.
[6] Chen Tiejun,YangShaoming. Implementation of the Modbus/TCP Protocol on the STM32[J].Journal of Convergence Information Technology,2013,82.
[7] Bush,Steve. NXP reveals 150MHz ARM Cortex M3[J].Electronics Weekly,2010,2441.