tag 标签: sam4l,m4,arm,iar

相关博文
  • 热度 9
    2015-1-16 10:04
    922 次阅读|
    0 个评论
        每次用官方的例程,都觉得好庞大,我就想自己建个清爽的模板。要是 Atmel 公司把相关驱动整理成一个库就好了,就像 ST 公司的 STM32 的库,这样可以方便开发人员快速搭建属于自己的模板或者工程,需要添加啥外设就添加进去。这样可以方便大家共享工程。因为官方的例程的文件的耦合性太强了,也很复杂。一个工程会调用好多文件。而且调用的文件都分散在不同的文件夹,文件夹里还有子文件夹,每个例程都会公用某些文件夹的文件。所以不便于把单个工程共享。    这次我专门把各个例程里的驱动文件整理出来。我会把我整理好的文件和模板上传到网上,供大家下载。    首先我放个来比对一下吧: 左边是官方的例程,右边是我自己创建的。可以对比出,我新建的模板很清爽。 工程的文件结构如下图: LIB 文件加是用来放你需要用到的外设驱动文件。 LIB 文件夹里再创建了 inc 和 src 文件, inc 是用来放一些外设的头文件, src 是用来放外设的 c 文件,我们调用各个外设 API 就是从每个外设的 c 文件里定义的。这里我就贴出 inc 和 src 里放的外设文件。 SYSTEM 文件,我是用来放一些系统相关的文件,例如一些启动文件和中断向量表等等。如下图: user 文件夹是用来放用户的函数,这文件夹是用放用户要自己实现功能时所编写的函数。 如下图: 需要的文件我都提取出来了,我会放到网上供大家下载,下图就是我整理好的文件。 现在入正题吧,开始建一个模板。 首先要新建一个工程,这个是万年不变的步骤了,考虑到有的新手,我就放出图文步骤,如下图: 点击后,会跳入往后的界面: 这里我一般会选择第一项,就是不带任何文件的工程。 而选择 asm , c++ 和 c 这 3 项创建工程时会自动生成一个文件。 当做完前两步后,编译器就会提示你工程存放的路径。建议大家都把一类 MCU 的工程都放在同一个文件夹中,这样便于日后管理和查找。 新建好工程后,进入工程的配置了。首先建议大家在工程目录下建几个分组。用鼠标右击工程 ---Add---Add Group ,如下图,建立几个分,     创建完这个后,这样接下来,我们就来我们的工程目录下添加一些文件。如下图: 这些文件都是我整理好的,我会放到网上供大家下载。还有一点是,大家工程目录下的文件夹的名字最好与编译器新建分组的名字尽量保持一致,这样后期方便管理,也可以不对应,这个要是大家自己的喜好而决定。当做完这些后,就可以进入下一个重要的环节了,这个环节是关系到工程是否能成功通过编译并下载下载。有无数的入门的人都卡在了这里。下面进入主题: 首先要指定芯片,方法如下: 然后我还要用到编译器的宏命令框。 接着是指定编译器的编译时找头文件的路径。具体步骤如下:   为什么要勾上 Use CMSIS 呢??这里我就简单说明 CMSIS 吧: CMSIS 的全称是 Cortex Microcontroller Software Interface Standard ,是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。 使用 CMSIS ,可以为处理器和外设实现一致且简单的软件接口,从而简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新设备的上市时间。软件的创建被嵌入式行业公认为主要成本系数。通过在所有 Cortex-M 芯片供应商产品中标准化软件接口,这一成本会明显降低,尤其是在创建新项目或将现有软件迁移到新设备时。 详情大家可以去百度百科查阅。 这里勾上,就会默认用编译器内部的 CMSIS ,这里大家也可以从网上下载 CMSIS ,添加到自己的工程目录中。 接着就要指定编译器去找工程目录下的头文件了。大家可以鼠标右击工程 Option---C/C++ Compler---Preprocessor ,如下图,填入这些路径,指定编译器去找。 这里我就简单说上面的参数怎样填吧。我这里用相对的路径,与之相对的有个绝对路径。当大家拷贝自己的工程到别人的电脑是,用相对路径是工程编译可以没问题,当用绝对路径工程肯定编译失败的,因为你指定头文件的路径跟你拷贝到别的电脑的路径已经不同了。 $PROJ_DIR$ 这个参数代表当前的工程,这里我就举个简单的例子吧。 我的设置:工程文件在 E:\myprj\YS2440_IAR 头文件在    E:\myprj\YS2440_IAR\lib 则在设置窗口填入: $PROJ_DIR$\lib   如果头文件在 E:\ myprj \YS2440_IAR\Library\lib 则写入: $PROJ_DIR$\Library\lib 我这里就简单说说编译怎样找头文件的简单说说吧。 工程目录下的 iosam4l.h 简单作个说明。 编译器编译时会找到 iosam4l.h 这个头文件,通过这个头文件在找下一级的头文件,有时会跳了几级的文件夹,如 iosam4l.h 的里的内容,我这里贴上里面的内容: #include "sam4l/sam4l.h" 这就指定编译器去找 sam4l 文件夹的 sam4l.h 头文件。上图我有标了示意图。注意 iosam4l.h 头文件要和 sam4l 文件夹要同一个目录,否则编译器会找不到 sam4l.h 头文件而报错。 把路径设置好后,就到了最后一步了,仿真器的配置。 这里我们用套件上集成的仿真模块,具体配置如下: 大家注意要勾上 run to 这个选项。这个指定编译器仿真时从哪里开始仿真,这里指定了 main ,就说明仿真时从 main 函数开始,这里也可以是其他的函数。但我们习惯一般从 main 函数开始仿真,这个要根据大家自己个人需要而配置。 接着要指定仿真的接口类型,方法如下: 这里大家要选上 SWO 模式,因为板上的仿真器只支持 SWO 模式。然后要指定烧写程序是 flash 的配置文件。这里我就选择编译器里面的 flash 配置的文件吧。设置的方法如下: 这些之后就可以编译工程了。当编译完出现后,会出现一些警告,这些警告可以不管。 当出现 Errors: none 的时候,说明成功编译通过了。   我这里有个头文件 asf.h 的头文件,是从官方的哪里拷贝过来的,大家当想加入啥外设的驱动文件,大家可以在这个文件加入 #include "xxxx.h" 这样可以方便管理工程。 现在我建的这个工程师加入了 GPIO 的驱动库。当然我还加入了时钟灯其他外设的驱动文件,主要是用来初始化系统时钟的。 下面我还是一点亮套件上的 led 为例。函数我之前有详细说明过了。这里我就直接给出代码。 #include "asf.h" int main() {   sysclk_init();   ioport_set_pin_dir(PIN_PC07, IOPORT_DIR_OUTPUT);   ioport_set_pin_level(PIN_PC07, IOPORT_PIN_LEVEL_LOW);   while (1)   {           }   }