tag 标签: at91sam7x256

相关博文
  • 热度 16
    2013-7-12 14:06
    1124 次阅读|
    0 个评论
    初次接触ARM是从AT91sam7x256开始的,但是教材是对S3C2410的,这无疑遇到很多问题,对然基础的编程模型和指令集都是一样的真到编写代码的时候只能去看那全英文的芯片手册了(不要中文的不仅翻译的不好而且不全,英文的600+中文的才三十几页)最基本的IO口初始化控制都找不到,基础只能在看书了,一遍又一遍才能熟悉,不用一下记住,用几次就记住了。 烧写程序用的sam-ba ARM芯片的优点:只要寄到USB线的数据端,上电就能传数据,AT91烧写的文件类型是.BIN因为开发环境用的是KEIL这个可以直接生成bin 烧写的东西基本够了。 下面就是程序了,由于有一定的单片机、汇编、C的基础。木有教材遇到了很多问题,再此感谢LengLx对我的莫大支持,即使有实力程序但是有编译错误导致无法进行,幸好LengLx帮我解决,再次感谢。对于不理解ARM编程模式,不离家.H文件含义,朴工对我悉心指导,从看芯片手册,原来可以从600+的手册中很快定位自己要找的东西(受教),.H文件的定义却是简化了编程问题,编程要规范还可以针对自己的板子做自己的头文件(受教) 大体能看懂头文件意思了,对于编程规则还是有些模糊,继续努力争取对我们的IFB0704编写头文件并且写一个测试程序,待续   其实需要的是跟教材一样的各个状态寄存器的初始化问题,到处都找不到,数据手册应该有,不过看着都蛋疼 目标:针对IFB0704写一个程序只测试AD部分连线与器件是否完好! 1、要先定义自己的头文件            #ifndef AT91SAM7X_EK_H #define AT91SAM7X_EK_H 2、一个程序会有好多个.C的文件,为什么?
  • 热度 12
    2013-7-12 14:04
    1542 次阅读|
    0 个评论
    2、IO口操作寄存器(示例)   #include AT91SAM7X256.H  void wait (void) {   unsigned int n;     for (n = 0; n 1843200; n++);   }  int main(void)  {  // *AT91C_PIOB_PER = 1 30;         //(使能IO口30) AT91C_PIOB_PDR   禁止IO口 *AT91C_PIOB_OER = 1 30;        //设置IO口30为输出口( *AT91C_PIOB_ODR = 1 30;禁止输出口即为设置成输入口 ) while(1) { *AT91C_PIOB_SODR = 1 30;    //IO30置位 wait(); *AT91C_PIOB_CODR = 1 30;    //IO30清零   wait(); }  } 3、以前的lib_at91....里调用子函数的方法 #include AT91SAM7X256.H  #include lib_AT91SAM7X256.h   void wait (void) {   unsigned int n;   for (n = 0; n 1843200; n++);   }   int main (void) //从12行到26行这种函数在 lib_AT91SAM7X256.h库文件里面,编程中此种方式与操作寄存器那种常用? { AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 AT91C_ID_PIOB);     //IO口使能 AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB27);     //设这输出口 AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB28); AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB29); AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB30);   AT91F_PIO_SetOutput  (AT91C_BASE_PIOB, AT91C_PIO_PB30);     //某一位,置位 AT91F_PIO_SetOutput  (AT91C_BASE_PIOB, AT91C_PIO_PB29);     //某一位,置位 AT91F_PIO_SetOutput  (AT91C_BASE_PIOB, AT91C_PIO_PB28);     //某一位,置位 AT91F_PIO_SetOutput  (AT91C_BASE_PIOB, AT91C_PIO_PB27);     //某一位,置位     while (1) {     AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB27);     //LED4亮          wait();      AT91F_PIO_SetOutput  (AT91C_BASE_PIOB, AT91C_PIO_PB27);     //LED4灭      wait();        } } 4、键盘输入   #include AT91SAM7X256.H  void wait (void) {   unsigned int n;     for (n = 0; n 1843200; n++);   }  int main(void)  {   unsigned int key_val;                                    //定义一个32位变量 /**********************************************************************************************************/ 没有下面两行使能时钟语句的话按键不管用,即读引脚没工作。原因是AT91SAM7X256内部集成了公路管理控制器,用它来控制所有外设的时钟一达到优化功耗的目的。所以只有使能PIO的外围时钟,PIO外设才会工作,才能读入输入管脚的状态,那么为什么PIO作为输出时不需要使能外围时钟呢?我个人认为这与内部外设在数字电路上的实现有关,输出功能只需要组合逻辑电路(不用时钟)就能实现,而输入功能则需要用到时序逻辑电路(需要时钟)才能实现。         因此,必须在main()函数的开头增加以下两条时钟使能的语句   *AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟进村器的处理时钟 *AT91C_PMC_PCER = 1 AT91C_ID_PIOA;//使能PIOA外围时钟 /************************************************************************************************************/   *AT91C_PIOB_PER = 1 30;                    //使能PIOB30 *AT91C_PIOA_PER = 1 29;                    //使能PIOA29 *AT91C_PIOB_OER = 1 30;                    //设置PIOB输出使能 *AT91C_PIOA_ODR = 1 29;                    //禁止PIOA29输出使能(输入使能) while(1) { key_val = *AT91C_PIOA_PDSR;            //读取管脚电平 if(key_val (1 29))                        //判断输入引脚PIOA29的电平 { *AT91C_PIOB_SODR = 1 30;            //把电平反映给PIOB输出给LED   }   else   {   *AT91C_PIOB_CODR = 1 30;            // 把电平反映给PIOB输出给LED   } }  }   5    两个判断语句 在这里顺便对条件编译(#ifdef, #else, #endif, #if等)进行说明。以下分3种情况:   1. 情况1:   #ifdef _XXXX   ...程序段1...   #else   ...程序段2...   #endif   这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。   例:   #define NUM   .............   .............   .............   #ifdef NUM    printf("之前NUM有过定义啦!:) \n");   #else    printf("之前NUM没有过定义!:( \n");   #endif   }   如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。   我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。   2:情况2:   #ifndef _XXXX   ...程序段1...   #else   ...程序段2...   #endif   这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。   3:情况3:   #if 常量   ...程序段1...   #else   ...程序段2...   #endif   这里表示,如果常量为真(非0,随便什么数字,只要不是0), 就执行程序段1,否则执行程序段2。 如果有#if需要顶格写 6  Keil下生成.bin C:\Keil\ARM\BIN40\fromelf.exe --bin -o ./bin/1.bin ./1.axf   7 IFB0704 光耦部分       光耦平时输出端与地断开,输出引脚加1阻值较大的上拉电阻,输出1;输入端有电流,发光时,输出端与地连接,输出被拉低,输出0   8、232串口。at91sam7x256   9    IFB的48芯片5,7脚-BB-J7的1脚-接标准串口线的2脚(RXD)         AA(6脚)接3脚(TXD)   10、由232的usart0端口改为485usart1端口,可以写数据, 不能进入中断读数据回显,以后再调试    
  • 热度 16
    2013-7-12 14:03
    962 次阅读|
    0 个评论
    这种结构什么意思? 答:at91sam7x256.h和stdio.h是C语言标准库文件,其他的自定义的,.h文件定义或者宏定义,部分连带.c的文件里面为函数定义,.h文件里的定义为全局变量共同调用,.c文件部分定义为局部变量,so   .h文件里的定义比.c文件少。 at91lib什么东西?? 答:lib 库文件,直接调用的,wim32系统里的.DLL文件一样,直接共同调用,减小程序及重复 今天明白了一个牛x的置位复位语句 AD0CR = (1 3)                 | ((Fpclk / 1000000 - 1) 8)         | (0 16) | (0 17) | (1 21) |   (0 22) |   (1 24) | (0 27);     额,,上面错了,不是置位复位用的,任意数都可以左移跟右移,  牛人  14:56:01 任何一个值都可以左移 0x121  等同于: 0b'0001 0010 1 等同于: 0b;0010 0100 最终等于  0x24 (0x) 在实际编译过程中,会被忽略. 因为0无论左移多少次,最终结果还是0; 在程序中这么写,是给人看的.   AT91SAM7X256中FLASH存储地址十一0x0开始,而ARAM的地址十一0x00200000开始 1、 关于SAM7x256或相关芯片IO口操作学习(寄存器的操作)     最近在公司看ARM7的代码跟数据手册,一直想搞明白对IO口的操作,今天搜到百度的一篇博文,看到觉得大有益处,摘抄至此,以备不时之需,从51转到arm的新手也可以学习学习! --------------------------------------以下为原文--------------------------------------------- 关于:“ #define AT91C_BASE_PIOA   (AT91_CAST(AT91PS_PIO)   0xFFFFF400) #define AT91C_PIO_PA0   (1   0) #define PIO_PER   (AT91_CAST(AT91_REG *)   0x00000000) ”的说明,比较多的废话,幸运的是不费吐沫(费爪子,嘿嘿) 这些都是符号定义,目的是为了以后用“符号”而不是“具体的地址”来使用ARM的内部资源(这些内部资源当然都是有地址的寄存器啦!) 比如#define AT91C_BASE_PIOA   (AT91_CAST(AT91PS_PIO)   0xFFFFF400)这一句,以后当你要使用通用IO端口A的相关寄存器时,使用AT91C_BASE_PIOA这个符号就可以了,就不必使用从0xFFFFF400开始的一系列地址了。 注意使用通用IO端口时,涉及到的寄存器可不仅仅是端口本身的一个地址,而是好几个地址,比如:输出/输入设置寄存器,输出0寄存器,输出1寄存器,中断许可寄存器,中断禁止寄存器,中断屏蔽寄存器,.....,等等等等。所以要使用的不止0xFFFFF400这一个地址,而是一组连续的地址,于是,把这些连续的地址对应的、功能上相关的(都与端口A相关)寄存器组合到一个结构里,用指针AT91PS_PIO指向这个结构,你可以看看AT91PS_PIO是不是就是这么定义的。 以后要使用端口A,一般来说,你必须首先按手册的说明,设置这个结构里的某一个或某几个的寄存器的值(初始化),然后才可以使用它。 基本的使用形式是:AT91C_BASE_PIOA-XXXX = YYYY; 例如: AT91C_BASE_PIOA-PIO_OER = AT91C_PIO_PA0;//设置端口A的最低位为输出状态,PIO_OER是端口A的输出能寄存器。 AT91C_BASE_PIOA-PIO_SODR = AT91C_PIO_PA0;//端口A的最低位输出高电平,PIO_SODR是端口A的置1寄存器,如果要使最低位输出0,就必须使用寄存器PIO_CODR,即端口A的清0寄存器。 AT91C_PIO_PA0也是一个符号定义,说穿了就是1。“#define AT91C_PIO_PA0   (1   0)”这个定义看起来似乎有点怪怪的感觉,但因为端口A可能是32位的,对每一位都有类似的定义: AT91C_PIO_PA0   (1   0) AT91C_PIO_PA1   (1   1) AT91C_PIO_PA2   (1   2) AT91C_PIO_PA3   (1   3) .... AT91C_PIO_PA30   (1 30) AT91C_PIO_PA31   (1 31) 假定你要使用端口A的B0~B3位以及B17~B19位为输出,并且让B0=1,B1=0,B2=0,B3=1,B17=0,B18=0,B19=1,就可以这样写代码: AT91C_BASE_PIOA-PIO_OER = AT91C_PIO_PA0 | AT91C_PIO_PA1 | AT91C_PIO_PA2 | AT91C_PIO_PA3 | AT91C_PIO_PA17 | AT91C_PIO_PA18 | AT91C_PIO_PA19;//初始化时设置端口A的B0,B1,B2,B3,B17,B18,B19位为输出状态。 ..... AT91C_BASE_PIOA-PIO_SODR = AT91C_PIO_PA0 | AT91C_PIO_PA3 | AT91C_PIO_PA19;//端口A的B0,B3,B19位输出高电平 AT91C_BASE_PIOA-PIO_CODR = AT91C_PIO_PA1 | AT91C_PIO_PA2 | AT91C_PIO_PA17 | AT91C_PIO_PA18;//端口A的B1,B2,B17,B18位输出低电平 由于有了前面的符号定义,就一个地址也看不见了,全用的符号。 端口做通用输入/输出,是端口的最简单应用,如果要使用端口的第二功能或者要启动端口的中断,需要的设置当然会更复杂一些,建议找对应的样例代码仔细看看,就没什么问题了。
相关资源