1:S3C2440A的多功能引脚概叙
S3C2440A有130个多功能输入/输出管脚,8个端口组,如下所示:
Port A(GPA):25个输出端口
Port B(GPB):11个输入/输出端口
Port C(GPC):16个输入/输出端口
Port D(GPD):16个输入/输出端口
Port E(GPE):16个输入/输出端口
Port F(GPF):8个输入/输出端口
Port G(GPG):16个输入/输出端口
Port H(GPH):9个输入/输出端口
Port J(GPJ):13个输入/输出端口
每个端口都能由软件轻松地配置以适应不同的系统结构和设计要求。开始运行主程序之前你必须定义每个用到了的管脚的功能。如果一个管脚不用来做复合功能管脚,那这个管脚就能配置成I/O端口。
2:端口寄存器
端口配置寄存器GPACON~GPJCON:用来决定复合引脚使用哪个功能。
端口数据寄存器GPADAT~GPJDAT:若端口被配置成输出口,数据能写入PnDAT相应的位,若被配置成输入口,数据能从PnDAT相应位读出。
端口上拉寄存器GPBUP~GPJUP:控制上拉电阻的使能。当相应位为‘0’此引脚的上拉电阻允许,为‘1’则禁止相应引脚的上拉电阻。若上拉寄存器使能则上拉电阻工作而不管引脚功能。
混合控制寄存器:控制数据端口在睡眠模式,USB pad,CLKOUT选择的上拉电阻。
外部中断控制寄存器EXTIN:选择外部中断请求的信号模式,如高电平,抵电平,下降沿,上升沿等。因为每个中断引脚都有一个数字滤波器,所以中断控制器能辨认出长于3 clocks的请求信号。EINT[15:0]被用作唤醒源。
3:2440的初始化代码
该段代码主要用来初始化2440处理器,并跳转到C函数处。
.text @ 声明代码段
.global _start @ 作用类似于extern
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址@
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启 这里采用读-写-修改@
ldr r0, = 0x4C000014 @ CLKDINV
mov r1, #0
str r1,[r0]
ldr sp, = 4096 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K@
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop
4:LED点灯C部分
硬件部分:mini2440的GPB5~8引脚分别连接着LED1~4。
#define GPBCON (*(volatile unsigned long *)0x56000010) /* GPB端口控制寄存器地址*/
#define GPBDAT (*(volatile unsigned long *)0x56000014) /* GPB端口数据寄存器地址*/
#define LOCKTIME (*(volatile unsigned long *)0x4C000000)
#define MPLLCON (*(volatile unsigned long *)0x4C000004) /* MPLLCON寄存器地址 */
#define UPLLCON (*(volatile unsigned long *)0x4C000008)
#define GPB5_out (1<<(5*2)) /* GPB5是由GPBCON的bit[11:10]两位来控制 */
#define GPB6_out (1<<(6*2)) /* 00-input 01-output */
#define GPB7_out (1<<(7*2)) /* 明确由输出高电平还是由低电平来点亮 */
#define GPB8_out (1<<(8*2)) /* 故要将GPB5678四个IO口设置为输出 */
/* FCLK = 271.5M */
#define M_MDIV 0xad
#define M_PDIV 2
#define M_SDIV 2
#define U_MDIV 0x38
#define U_PDIV 2
#define U_SDIV 2
/*** 延时函数*/
void wait(unsigned long time)
{
int i;
for (i = 0; i < time; i++);
}
int main(void) /* 主函数 */
{
unsigned long j,i = 0;
GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; /* 将LED对应的GPB5678四个引脚设为输出*/
LOCKTIME = 0xFFFFFF;
UPLLCON = ((U_MDIV << 12) + (U_PDIV << 4) + U_SDIV);
delay(0xffff);
delay(0xffff);
MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);
delay(0xffff);
delay(0xffff);
while(1)
{
for (j = 0; j < 10; j++){
delay(0xffff);
}
GPBDAT = (~(i<<5));
if(++i == 16)
i = 0;
}
return 0;
}
/**说明**/
S3c2440在时钟设置时,需要先设置UPLLCON寄存器,后设置MPLLCON寄存器,而且之间还需要有一定的延时。
5:编译,下载调试。