原创 AT91SAM7X256学习笔记(1)

2012-11-18 20:09 3260 8 8 分类: MCU/ 嵌入式

 

       好久没有写点什么了,前段时间工作比较忙,就犯懒了。写点有关atmel 的arm7芯片的东西吧,很简单很基础的。

      开发环境用的是keil mdk 4.23  HJTAG+并口仿真器。

      安装完开发环境,跟HJTAG,配置方法如下http://blog.csdn.net/zhzht19861011/article/details/5846510,我当时就是照着这个跟HJTAG的用户手册来配置的。KEIL MDK里debug选择HJTAG ARM, output选择creat HEX file HJTAG设置为并口,HFLASHER里面选择对应的芯片,起始地址设为0x10000,PROGRAMING选项里面选择intel hex那项,并找到对应工程目录下面的hex文件。这样开发环境就搭建好了。

      我刚开始的时候就是看看at91sam7x246的datasheet,不过寄存器真是太多了,根本就看不过来,看了几个小时也没看出来什么东西。以前我用能过51单片机跟FGPA的软核单片机,根本没有这么多寄存器。当时我第一次用C8051F340的时候都觉得寄存器够多了,没想到这个更多。没办法只有先看例程,不过atmel 的芯片的h文件做的很不错,每个寄存器后面都有注释,简单的直接看注释就差不多能看懂了,说的不是很明了的,就回去翻datasheet,也差不多能弄懂了。

       把iar的例程移植过来改改,先跑了个流水灯。感觉其实at91sam7x256写代码跟51差不多,只不过寄存器的配置要复杂许多罢了。

 

下面就是具体配置io寄存器的方法:

 

#include

#include "lib_AT91SAM7X256.h"

//上面的是两个头文件,是例程里面带的,直接用了

#define AT91B_LED1            (1<<19)       // AT91C_PIO_PB19 AT91C_PB19_PWM0 AT91C_PB19_TCLK1

#define AT91B_LED2            (1<<20)       // AT91C_PIO_PB20 AT91C_PB20_PWM1 AT91C_PB20_PWM1

#define AT91B_LED3            (AT91C_PIO_PB21)       // AT91C_PIO_PB21 AT91C_PB21_PWM2 AT91C_PB21_PCK1

#define AT91B_LED4            (AT91C_PIO_PB22)       // AT91C_PIO_PB22 AT91C_PB22_PWM3 AT91C_PB22_PCK2

#define AT91B_LED_MASK        (AT91B_LED1|AT91B_LED2|AT91B_LED3|AT91B_LED4)

#define AT91B_NB_LEB          4

//上面是4个流水灯的与其对应io的宏定义

 

void delay()//延时函数的声明

int main()

{

AT91C_BASE_PIOB -> PIO_OER=  AT91B_LED_MASK;

/*找头文件里在BASE ADDRESS DEFINITIONS FOR AT91SAM7X256里面有一句

#define AT91C_BASE_PIOB      (AT91_CAST(AT91PS_PIO)       0xFFFFF600) // (PIOB) Base Address 也就是说对应的pioB的结构体指针

针对AT91CAST,头文件里面有

#ifndef __ASSEMBLY__

typedef volatile unsigned int AT91_REG;// Hardware register definition

#define AT91_CAST(a) (a)

#else

#define AT91_CAST(a)

#endif

说实话我不知道问什么这样写

然后在typedef struct _AT91S_PIO下面有

AT91_REG        PIO_OER;      // Output Enable Register看着一行时不妨把其他相关寄存器,比如input enable也看一下

整体来说AT91C_BASE_PIOB -> PIO_OER=  AT91B_LED_MASK;就是把那几个led的io对应为输出。后面的配置寄存器也用这种方法一点点就可以看懂了,要善用keil mdk 右键菜单的go to the definition of这一选项*/

while(1)

{

AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED_MASK);

//把4个pio输出全都置1, AT91F_PIO_SetOutput在lib_AT91SAM7X256.h中

delay();

AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,AT91B_LED1);

//led1对应的pio置0,也就是点亮led1,以下同上AT91F_PIO_ClearOutput这个函数也是在lib_AT91SAM7X256.h中

 

delay();

AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,AT91B_LED2;

 

delay();

AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,AT91B_LED3);

 

delay();

 

AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,AT91B_LED4);

delay();

}

//实际上例程里面还有一些其他的寄存器配置,我去掉了,运行也没什么问题

 

}

void delay()//延时函数,具体延时多少不清楚,可以用keil 带的软件仿真功能来看延时多少并调整

{

  unsigned int i;

  unsigned int j;

  unsigned int k;

  for(i=0;i<50;i++)

    for(j=0;j<255;j++)

      for(k=0;k<255;k++)

            ;

}

编译完成后点击debug的图标,hflasher配置没问题的话会自动下载程序,流水灯跑起来了。程序真的是简单的不能再简单了,不过为了跑起这段小程序可着实折腾了我好多时间,关键是搭建keil mdk 真的是很浪费时间,好比玩网游的开荒某个副本一样。

总体感觉arm 的寄存器真是太多了,定义寄存器方式也不一样,arm用结构体指针,51是用sbit 或sfr来定义。不过要是配置完的话,写代码跟51没什么区别。

 

 

后记:

我现在所在的公司很少用到这款芯片,用到单片机的时候基本上都是用51。简单的项目就用AT89C52(这个貌似很少了,我看公司里差不多10年前的板子上都是用的这个),复杂的就用C8051F340 。单片机难以完成的控制任务,采用FPGA/CPLD来实现。 这次换用AT91SAM7X256是客户提出来的,原因居然是51单片机做的产品很难向客户的乙方报高价。而用AT91SAM7X256就可以说是用ARM来做的,就显得很高级了。

    我用的是好几年前公司购买的一款开发板,开发板附带的例程居然只有ATMEL官网提供的四个基于IAR4.3的工程。没想到刚一开始就遇到了困难,工程编译都通不过,在公司里面想找个人问问都找不到了,公司上次用这个芯片差不多是三年前左右,之前做过的人都忘得差不多了,要不然就是离职了。我各种百度,都没弄弄明白,为什么iar编译通不过。我试过6.x的版本,5.x的版本的IAR(没找到能用的iar4.3),都不行。后来无奈转战keil mdk。果然还是keil开发环境比较熟悉,毕竟都用这个做过一年的51了。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条