加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

arm   gpio设置

(2010-09-01 20:12:51)
标签:

杂谈

分类: linux学习
arm 213*的蜂鸣程序。
——————顺便搜了点东西,很好————————
LPC21XX系列 ARM编程要点:

1.       未使用的引脚初始化时设置为输出。

2.       从掉电模式唤醒后,PLL的恢复必须由软件完成。通常先将PLL激活并等待锁定,然后再将PLL连接。

3.       复位后,存储器加速模块MAM默认为禁止状态。在改变MAM定时值时,必须先关闭MAM。

4.       在编程和操作过程中不允许访问Flash存储器。

5.       3.3V和1.8V电源设计最大电流分别为600mA和300mA,可使用SPX1117。

6.       ARM端口做输入输出时与单片机有区别,实例如下:

a)          要将P0.8、P0.9设置为TxD1、RxD1,则PINSEL0=(PINSEL0 & 0xFFF0FFFF)|(0x05<<16)(顺序,PINSEL,IODIR,IOSET/CLR)

b)        设置P0.0为高电平,则程序为

PINSEL0=PINSEL0 & 0xFFFFFFFC   设置P0.0为GPIO

                      IO0DIR= IO0DIR | 0x00000001   设置P0.0方向为输出

                      IO0SET= 0x00000001    设置P0.0口状态,输出高电平

c)         读取P0.0引脚状态,则程序为

PINSEL0=PINSEL0 & 0xFFFFFFFC   设置P0.0为GPIO

                      IO0DIR= IO0DIR & 0xFFFFFFFE   设置P0.0方向为输入

                      PinStat=IO0PIN             从IO0PIN读取P0.0口状态

d)        将八位无符号整形变量Data输出到P0.0~P0.7,则程序为

PINSEL0=PINSEL0 & 0xFFFF0000   设置P0.0为GPIO

                      IO0DIR= IO0DIR | 0xFF   设置P0.0~P0.7方向为输出

                      IO0CLR= 0xFF          清零P0.0~P0.7的输出状态

                      IO0SET=Data           Data中为1的位输出高电平

e)         将八位无符号整形变量Data输出到P0.0~P0.7,则程序为

PINSEL0=PINSEL0 & 0xFFFF0000   设置P0.0为GPIO

                       IO0DIR= IO0DIR | 0xFF   设置P0.0~P0.7方向为输出

                       IO0PIN= (IO0SET & 0xFFFFFF00)| Data     写IO0PIN,输出数据

7.       关于中断

在处理IRQ中断过程中,IRQ中断默认是被禁止的;

在启动代码中默认是关闭IRQ和FIQ的,如果要使用需要设置CPSR寄存器的I位或F位,这需要在特权模式下处理,最简单的方法是在启动代码中设置;

8.      关于SPI

SPI控制寄存器用来控制SPI时钟,通过SPI状态寄存器的SPIF位可查询数据传输是否完成,SPI数据寄存器用于提供发送和接收的数据字节。

SPI可设置成主机模式或者从机模式。处于主机模式时,SPI时钟寄存器用来控制时钟频率,该寄存器必须在数据传输之前设定。处于从机模式时,该寄存器无效。当设计为从机模式时,其对应的SSEL被选中时才有效。当设计为主机模式时,对应的SSEL端口需接上拉电阻(置高)。

———————————知识oo知识———————————

0,1是对应P0和P1口的32个脚的控制

其中下面的指令对应位为1时有效!!在ADS编程里必须使用大写有效!!

PINSEL是对管脚定义gpio(标准)

IOPIN是读管脚值

IOSET是置高电平

IODIR是设置输出和输入的

IOCLR是置低电平

————————心得————————
1,#define deep (1<<7)
解释:定义deep:(1<<7)即 deep=0X00000080 这样一个端口的2进制地址就可以了,再用IO*** PINSEL等命令时就方便了。
PINSEL=DEEP;
IODIR=DEEP;
IOSET=DEEP;

2,while(1){**}
   无限循环语句,其中**内可设置break指令。用在按键去抖中。
3,C中没有去过多的关注寄存器,储存器的使用和状态。所以会觉得稍稍的不爽。不过在ARM中加入 C与汇编的交互使用,下一步要学习下。

———————今天使用的源程序———————
#include "config.h"
# define deep (1<<7)
#define key1(1<<16)
VOID WAITKEY(VOID)
{
UINT32 I;
WHILE (1)
{
WHILE((IO0PIN&KEY1)!=0)
FOR(I=0;I<50000;I++);
WHILE((IO0PIN&KEY1)==0)
BREAK;
}
WHILE((IO0PIN&KEY1)==0);//等待key1放开,否则一直循环。
}

VOID DELAYNS(UINT32 DLY)
{UINT32 DLY;
FOR(;DLY>0;DLY--)
FOR(I=0;I<50000;I++);
}

INT MAIN(VOID)
{PINSEL0=0X00000000;
PINSEL1=0X00000000;
IO0DIR=BEEP;
IOOSET=KEY1;
WHILE(1)
{WAITKEY();
IO0CLR=BEEP;
DELAYNS(20);
IO0SET=BEEP;
DELAYNS(30);

IO0CLR=BEEP;
DELAYNS(20);
IO0SET=BEEP;
DELAYNS(30);
}
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有