好久没有写点什么了,前段时间工作比较忙,就犯懒了。写点有关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了。
文章评论(0条评论)
登录后参与讨论