zoukankan      html  css  js  c++  java
  • 【AT91SAM3S】建立基于SAM3S库的工程并点亮LED

    习惯了ST的库,猛然间看到ATMEL的库,有点无从下手。这几天参考这示例工程,终于建立了一个使用ATMEl库的工程。

    软件库版本:

    软件平台:MDK470A

    硬件平台:英蓓特 EB-SAM3S

    MCU:     AT91SAM3S4C

    1、库的来源

    库来自atmel的网站:http://www.atmel.com/tools/SAM3SSOFTWAREPACKAGE.aspx

    我使用的工具链是MDK,下载的是:AT91SAM3S-EK MDK® Software Package for Keil uVision4

    http://www.atmel.com/images/SAM3S_softpack_2.1_for_uVision_4.12.zip(需要Atmel注册才能下载)

    2、MDK中需要设置的地方

    因为要使用ATMEL提供的的库,所以需要根据库的要求对开发环境进行一些设置:

        板子使用芯片SAM3S4C,设置预定义符号sam3s4。

       将于库的目录和用到的。h文件目录加到IncludePath里边(根据下一部分目录结构定)

       命令选项:--gnu。因为库里边有些东西不是ANIS C的。比如变量定义不再函数的最前面等等

    image

    设置输出目录如下:

    image

    image

    3、一步步建立工程

    启动文件请参见本博的另一个博文:http://www.cnblogs.com/zyqgold/p/3201527.html

    本文使用ATMEl的启动处理方式,即:注册中断向量之后,从resethandler进入main函数。

    (1)新建目录E:at91sam3s4c,并在该目录下建立文件夹:chip、at91lib、out、src

    (2)将刚才从ATMEl下载到的库压缩包解压缩

    (3)将目录SAM3S_softpack_2.1_for_uVision_4.12sam3s-eklibrarieslibboard_sam3s-ek下的两个文件夹include、source已经board.h拷贝到at91lib目录E:at91sam3s4cat91lib

    (4)将目录SAM3S_softpack_2.1_for_uVision_4.12sam3s-eklibrarieslibchip_sam3s下的文件夹cmsis、include、source以及文件chip.h拷贝到目录E:at91sam3s4cchip

    (5)MDK中,在E:at91sam3s4c新建工程at91sam3s4c_LED,选择MCU AT91SAM3S4C

    image

    (6)电机确定后会弹出对话框,询问是否要拷贝启动文件,选择是。当然我们不是要使用这个启动文件,之后我们将会改写这个文件。

    image

    7、电机image设置工程组织结构如下:

    image

    (8)向工程添加文件

    将E:at91sam3s4cat91libsource中的board_cstartup_keil.c和board_lowlevel.c文件添加到工程的at91lib目录下,将E:at91sam3s4cchipsource中的exceptions.c、wdt.c、pmc.c、pio.c文件添加到工程的chip目录。将E:at91sam3s4cchipcmsis中的core_cm3.c文件添加到工程的chip目录

    在E:at91sam3s4csrc中新建文件main.c,并添加到工程的usr目录。

    (9)添加工程引用位置(IncludePath)

      E:at91sam3s4c;.chipcmsis;.at91lib;.at91libinclude;.chip;.chipinclude

    image

    (10)编辑sct文件:

    在工程选项的Linker选项卡中,首先取消Use Memory Layout...之前的选择,然后点击ScatterFile选择框后边的EDIT。使用自己的分散加载描述文件

    image

    (11)想分散加载描述文件中添加内容:

    ; *************************************************************
    ; *** Scatter-Loading Description File generated by uVision ***
    ; *************************************************************

    Load_region 0x400000 0x40000
    {
        ; Flash 256K
        Vector_region 0x400000
        {
            board_cstartup_keil.o (vectors, +FIRST)
        }
        Fixed_region +0
        {
            .ANY (+RO)
        }
        ; SRAM0 32K
        Relocate_region 0x20000100 (0x8000-0x100)
        {
            .ANY (+RW +ZI)
        }
        ; Configure Stack and Heap
        ARM_LIB_HEAP 0x20007000 EMPTY 0x400
        {
        }

        ARM_LIB_STACK 0x20007FFC EMPTY -0x400
        {
        }
    }

    (12)编辑文件startup_SAM3S.s

    删除该文件所有的内容,因为我们不用MDK提供的启动文件。之后向这个文件添加内容:

    AREA WORKAROUND,CODE,READONLY
    EXTERN  __vector_table
    LDR     r0,=__vector_table
    ALIGN
    END

    这些内容的意思可参考http://www.cnblogs.com/zyqgold/p/3201527.html

    (13)最后按F7生成即可。此时工程中还没有main函数,系统会报错。不用急,完成下一步就好了。

    4、用库写一个点灯程序

    板子LED的原理图如下:

    image

    即3个LED分别由PA19、PA20和PC20驱动。PA19、PA20电平为高时D2、D3被点亮,PC20为低电平时D4被点亮。

    #include "board.h"

    int main()
    {
        Pin LED2,LED3,LED4;  //定义三个引脚结构体,三个引脚分别对应三个LED
        WDT_Disable(WDT); //复位时候看门狗默认是打开的,手动关掉。不让MCU反复复位

       
        LED2.mask = PIO_PA19;   //引脚属性定义
        LED2.pio = PIOA;
        LED2.id = ID_PIOA;
        LED2.type = PIO_OUTPUT_1;
        LED2.attribute = PIO_DEFAULT;
       
        LED3.mask = PIO_PA20;
        LED3.pio = PIOA;
        LED3.id = ID_PIOA;
        LED3.type = PIO_OUTPUT_1;
        LED3.attribute = PIO_DEFAULT;
       
        LED4.mask = PIO_PA20;
        LED4.pio = PIOC;
        LED4.id = ID_PIOC;
        LED4.type = PIO_OUTPUT_0;
        LED4.attribute = PIO_DEFAULT;
       
        Pin pinlist[] = {LED2,LED3,LED4}; //专门为库函数定义的Pin列
        uint32_t numLeds = PIO_LISTSIZE( pinlist ) ;  //库里边建议这么写的
       
        PIO_Configure(pinlist,numLeds);   //库函数初始化Pin
       
        PIO_Clear(&LED2);//点亮D2
        PIO_Clear(&LED3);  //点亮D3
        PIO_Set(&LED4);  //点亮D4
       

        while(1);
    }

    最后,下载到板子上。等一会就会看见板子上的3个LED亮了。等一会的原因,是这个板子的晶振稳定的比较慢,不要怪MCU哦。

  • 相关阅读:
    mybatis-config.xml
    log4j.properties
    applicationContext.xml
    对象mapper
    面向接口,定义接口
    Java实现Excel导入数据库,数据库中的数据导入到Excel。。转载
    判断浏览器类型
    大小写字母,数字,下划线,中横线和中文 正则表达式
    Androidpn的使用[找不到org.androidpn.client.PersistentConnectionListener]
    沙扬娜拉---徐志摩
  • 原文地址:https://www.cnblogs.com/zyqgold/p/3226403.html
Copyright © 2011-2022 走看看