查看: 11898|回复: 21

【有奖征文】基于IAR的LM4F120 Launchpad应用工程框架设计

  [复制链接]
  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-18 18:43:36 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 xinxincaijq 于 2012-12-28 08:25 编辑

    同各大半导体公司提供的固件库类似,TI的StellarisWare也是以源码包的形式发布了所有的驱动程序和样例工程。这样的工程实际上不便于学习使用的,国内各板卡研发团队提供样例工程比较流行的方式是,为每个功能单独设计独立的工程。现在LM4F120 Launchpad刚开始流行,我觉得创建一个设计良好的工程框架,对于大家共同学习和交流是非常有帮助的,所以自己就抽空做了这么一个框架工程,同时尽量充分地使用板上资源作为演示。

    今天准备上传帖子的时候发现有人已经做了类似的工作,呵呵,所见略同。不过使用的是CCS集成开发环境,还好我用的是IAR,险些撞车。IAR也算是比较通用的集成开发环境了,在我的文档中对如何在IAR集成开发环境下使用我设计的一个框架工程进行说明,并且提供了源码工程,供大家作为基本工程使用。下面是正文:

    基于IARLM4F Launchpad应用工程框架设计
    2012-12-18

    软件环境:IAR for ARM 6.3
    编程语言:C
    硬件平台:LM4F120 Launchpad

    一、引言
    TI为LM4F120提供了StellarisWare套件,在其中包含了LM4F120微控制器芯片的外设模块驱动,例如基本的UART、SPI、ADC,甚至是高级的USB驱动程序,开发者在此基础上可以快速开始应用程序的开发。
    获得完整功能的同时,我们也发现StellarisWare套件提供的驱动程序过于依赖于整个源码包的组织结构,为了考虑对不同芯片的通用性,源码包中文件的组织结构比较复杂,不便于开发者研究与使用。相信大家都能够很容易地找到StellarisWare中为LM4F Launchpad提供的样例工程,编译、下载、运行,看到实验现象。但是若要在此基础上开发自己的应用程序,却发现不知道从何处下手:在哪里添加自己的应用逻辑?自定义一个模块,怎么添加到工程中比较合适?如果要备份工程或在另一台电脑上继续开发,要复制哪些文件还是要复制整个StellarisWare源码包?
    为了解决这些问题,在本文中描述了一个经过设计基于IAR集成开发环境的工程框架。该工程框架的大部分程序代码及库文件是从StellarisWare套件中提取出来的,最大限度地保留了对StellarisWare套件的兼容性,同时具备独立性,包含了工程的完整程序,完全独立于StellarisWare套件使用。良好的程序组织结构使得开发者编程时添加应用逻辑、自定义功能模块及中断服务的操作过程明确、易用。
    二、框架工程概述
    在设计的框架工程中,包含了不依赖于StellarisWare的完整的工程源码,所有的文件被组织在工程根目录及其子目录下。复制工程根目录,即可实现全新工程的创建。框架工程文件组织结构如图1所示。
    IAR for ARM是开发ARM Cortex-M微控制器的经典IDE,选用这款IDE也考虑到便于开发者上手使用。IAR IDE的工程组织视图与文件在物理存储设备上的组织结构不同步,这样也便于我们屏蔽掉无需编程的文件,将注意力放在需要编写的几个文件中。框架工程的IAR开发环境工程组织视图如图2所示。


      
                          图1.PNG                                                
      
       图2.PNG
      
      
    图1  工程的文件组织
      
      
    图2  IAR IDE的工程组织视图
      
    框架工程的文件组织中包含了StellarisWare为LM4F提供的所有驱动程序。其中“driverlib-cm4.a”文件即是由StellarisWare源码包的“StellarisWare\driverlib”目录下的驱动库工程编译生成的驱动库文件。此处使用库文件而未使用源码文件的原因在于,稳定的驱动库程序一般不需要应用开发者修改,一经编译可重复链接,避免重复编译以提高了生成机器码映像的时间效率。
    在IAR的工程组织视图中仅列出了开发者编程需要的关注的和新增模块的程序文件,对于仅提供给开发者使用而不必关心其中内容的程序,均未显示在视图中。但要注意,合适的工程属性配置也是必须的,确保必要的引用路径在工程中被设定。框架工程已经完成了相关的设定,在下文中对主要的配置进行说明,供开发者以后自行设计应用框架参考。
    (1)配置引用链接命令文件
    链接命令文件包含了工程的链接命令脚本,安排编译后的机器码在芯片上的存储位置。框架工程的链接命令文件为“lm4f_intflash.icf”,位于框架工程根目录的“\linker”子目录中。在IAR中的配置界面如图3所示。
       图3.PNG
      
      
    图3  配置链接命令文件
      
    (2)配置引用头文件路径
    对于所有的头文件(“*.h”),在程序中如要引用它们,要么引用完整的绝对路径或相对路径,要么在工程中配置引用路径,让编译器在引用路径中自动查找。毫无疑问,使用后者方法是最常用的做法。在框架工程中,大部分的头文件都组织在不同层次结构下的“inc”目录下,在IAR中配置工程引用路径如图4所示。
    在图中我们看到,除了引用路径外,还定义了预编译的符号。
      
          图4.PNG
      
      
    图4  配置引用头文件路径
      
    (3)配置引用库
    由于使用了驱动库,所以在生成机器码映像的过程中要将预编译好的库文件链接到工程中,这也需要在工程属性执行相关配置。
    驱动库文件“driverlib-cm4f.a”在文件组织结构中位于框架工程的“\driverlib”子目录下,在工程属性中的配置如图5所示。
      
          图5.PNG
      
      
    图5  配置引用库文件
      
    (4)配置下载选项
    在下载LM4F120Launchpad程序前首先要确保电脑上已经正常安装了,ICDI调试器驱动程序。然后在IAR中进行配置如图6所示。
      
          图6(1).PNG
      
      
    图6(1)  选择使用TI的调试器
      

      
          图6(2).PNG
      
      
    图6(2)  允许使用Flash Loader
      
    要特别注意,如果没有勾选“Useflash loader”,在“Project->Download”菜单的“Download active application”子选项是不能激活的。
      
          图6(3).PNG
      
      
    图6(3)  使用JTAG调试接口
      
    至此,框架工程中的主要配置就已经描述完毕,关于工程的文件包含架构等具体内容,大家可以参考工程中的源码及属性配置,此处不再赘述。
    三、使用框架工程
    框架工程的设计就是为了便于开发者开始开发应用程序,一般地,基于框架工程的应用开发主要围绕如下几个问题展开:
    ·创建全新工程
    ·编写主控制逻辑(main函数)
    ·添加自定义功能模块
    ·添加中断服务例程
    在本节中,将对这些问题进行具体说明。
    3.1 创建新工程
    如上文所述,在设计的框架工程中包含了完整的工程源码,复制工程根目录,即可实现全新工程的创建。
    3.2 编写main函数
    main函数的定义位于main.c文件中。main函数是用户应用程序的入口函数,其中包含了应用程序的主要控制逻辑,还包含了嵌入式开发中经典的无限循环。
    while(1)
    {
    ….
    }
    3.3添加自定义功能模块
    以添加小灯(light)为例,说明在框架工程中添加自定义功能模块的过程。
    最好保证功能模块代码以“*.h”和“*.c”对应的文件组织,例如小灯模块的“light.h”和“light.c”,分别将其存放到工程根目录下的“\utils\inc”和“\utils\src”子目录下。然后在IAR工程组织视图中,本别在“\utils\inc”和“\utils\src”分组中添加“light.h”和“light.c”文件。由于在工程属性配置中,已经指定了对“\utils\inc”路径的包含,所以无需再修改工程属性中对新添加头文件的配置。
    “includes.h”文件是应用工程的总头文件,直接或间接地包含了工程中的所有头文件,因此,若要在应用工程中使用新添加模块的功能,还需将引用新添加头文件的预编译指令添加到“includes.h”文件中。例如,添加小灯模块时,在“includes.h”文件中添加
    #include "light.h"
    3.4 添加自定义中断服务例程
    在应用工程中,通过中断响应外部的异步事件。开发者在框架工程中添加自定义中断服务例程分为两个步骤:编写中断服务函数和注册中断服务。
    (1)编写中断服务函数
    在框架工程下,为统一管理,将中断服务函数集中保存在isr.c文件中。以按键事件为例。在isr.c文件中定义LM4F120 Launchpad的按键1对应的GPIO中断服务函数gpio_portf_isr如下:
    voidgpio_portf_isr(void)
    {
    ….
    }
    (2)注册中断服务函数
    在框架工程下,为统一管理,将中断服务的注册过程集中保存在isr.h文件中。以按键事件为例,注册中断代码如下所示:
    // 注册PF端口ISR
    #ifdef VECTOR_GPIO_PORTF
       #undef VECTOR_GPIO_PORTF
    extern void gpio_portf_isr(void);
       #define VECTOR_GPIO_PORTF gpio_portf_isr
    #endif
    其中,VECTOR_GPIO_PORTF是对应中断源的中断向量号,可在vectors.c文件中查得。
    开发者在添加中断服务时,仅面向isr.c和isr.h文件。
    四、一个应用实例
    在框架工程的基础上,基于LM4F120Launchpad编写了一个简单的应用样例。在该应用中:
    使用到的主要系统资源:
    GPIO输出–控制七彩灯
    GPIO输入– SW1按键输入
    GPIO中断–响应SW1按键事件
    SYSTICK –系统时间更新
    USB&UART –串口通信
    实现功能如下:
    ·每次按键SW1按下,板载的七彩灯将变换一个颜色,并通过调试串口(115200bps、无校验、停止位长度为1)发送由systick定时器更新的当前系统时间(以s为单位)信息。
    详细内容见工程的源代码。
    编写软件的过程中参考了清风的关于LM4F232的教程,应用于LM4F120的部分驱动函数与LM4F232一些区别,具体地,前者的函数名称多数有“ROM_”前缀,参数、功能的设定基本一致。



    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-18 18:49:34 | 显示全部楼层
    不太会搞帖子中的图片,附上工程源码及文档的doc文件,见压缩包。


    LM4F_DEMO.rar

    857.01 KB, 下载次数: 99

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-2-28 11:51
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2012-12-18 19:01:44 | 显示全部楼层
    用IAR开发LM4F的同学可以好好学习一下了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-2-28 11:51
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2012-12-18 19:11:01 | 显示全部楼层
    仔细拜读,你是研究生吧?帖子都写得跟发论文一样,难道是准备投稿的?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-12-18 19:37:01 | 显示全部楼层
    suyong_yq 发表于 2012-12-18 18:49
    不太会搞帖子中的图片,附上工程源码及文档的doc文件,见压缩包。

    明天帮你把帖子整理一下!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-18 19:45:51 | 显示全部楼层
    cpace 发表于 2012-12-18 19:11
    仔细拜读,你是研究生吧?帖子都写得跟发论文一样,难道是准备投稿的?

    呵呵,这都被你看出来了。
    读研期间写了不少文档,基本上都是这些东西。
    投稿倒不至于,不过写的东西本身就是一篇独立的文档,只是时间仓促,很多细节的内容没讲,其实芯片启动的部分可以搞一下,以后还可以上个操作系统。一直比较忙,所有这些事情也是以后看有机会做了。至于外设模块,如液晶触摸屏、SD卡文件系统、USB等等,估计很快就会有人做了,大家一起学习啦。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-18 19:46:36 | 显示全部楼层
    xinxincaijq 发表于 2012-12-18 19:37
    明天帮你把帖子整理一下!

    谢谢啦!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-11-30 17:53
  • 签到天数: 193 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2012-12-29 12:26:38 | 显示全部楼层
    插上USB后不能正常安装驱动怎么办?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-29 23:26:05 | 显示全部楼层
    repo 发表于 2012-12-29 12:26
    插上USB后不能正常安装驱动怎么办?

    1. 确定接入的是调试器端口而不是片上外设引出的USB端口
    2. 确保安装的固件包是适用于LM4F120的
    3. 如果是不识别设备,就要看是不是电脑的问题了
    4. 如果正确识别设备,但写入程序时找不到目标设备,要确保在工程设置中的配置是正确的,见本贴图6(2)、图6(3)
    5. 确保板子上的开关是打开的。

    暂时能想到的就这么多了,毕竟这种问题太随机了,要到现场看才行。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-11-30 17:53
  • 签到天数: 193 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2012-12-29 23:29:15 | 显示全部楼层
    suyong_yq 发表于 2012-12-29 23:26
    1. 确定接入的是调试器端口而不是片上外设引出的USB端口
    2. 确保安装的固件包是适用于LM4F120的
    3. 如果 ...

    谢谢,从官网找的ICDI驱动,问题已经解决了、
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 11:16 , Processed in 0.194706 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.