这几天将TQ2440上的IO控制引脚学习了一下,了解了一下关于引脚的一些寄存器的配置,熟悉了一下写ARM裸机程序的流程,写一下自己学到的东西。
★程序启动初始化
◇关闭看门狗
有一个专门的寄存器来控制看门狗,看门狗的作用就是在一定的时间内会重新启动系统,这里我们只是写一个简单的逻辑程序用不到看门狗 ,将其关掉。设置WTCON寄存器,将其第5位置0,就可以禁用看门狗
◇设置栈指针
C语言中设置的变量,以及调用的函数等信息都会被存放在栈中,因此栈指针必须要设置
◇调用main函数
main函数中设置了关于IO寄存器的一些设置操作
★TQ2440硬件相关
硬件主要涉及到LED灯与GPIO,按键与GPIO之间的连接
◇LED灯硬件
从图中可以看出LED1与GPB5相连
◇按键硬件
K1按键与GPF1的引脚相连
★IO控制端口及其配置
关于IO控制器,主要是配置两类寄存器:控制寄存器GPXCON与数据寄存器GPXDAT。(X表示A,B,C,……)
控制寄存器GPXCON:主要控制引脚的输入或者输出,输入输出都是控制寄存器中相应的位发生改变
数据寄存器GPXDAT:如果控制寄存器控制引脚输出,那么可以设置数据寄存器使引脚的电平为高电平或者低电平
★TQ2440两种启动方式
◇nand的启动
上电后,硬件会自动将nand中的前4K拷贝到片内的4KSRAM,然后CPU从片内的0x00000000地址执行。因此放在nand的头4K程序主要完成硬件的初始化工作。例如关闭看门狗、设置栈、初始化SDRAM(内存),将nand中的其余代码拷贝到SDRAM中等等一些操作
◇nor启动
上电后,CPU就会从Nor的起始地址0x00000000执行
★程序代码
.text
.global _start
_start:
ldr r0 ,=0x53000000 @设置R0看门狗控制寄存器WTCON
mov r1 ,#0x00000000 @立即数0x00000000赋值给R1
str r1 ,[r0] @寄存器间接寻址
ldr sp ,=4*1024 @设置栈指针
bl main @调用main函数
LOOP: @死循环
b LOOP
//#include
#define GPBCON (*(volatile unsigned long *)0x56000010) //volatile告诉编译器不要优化GPBCON变量
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPBCON_10 (1 << (2*5)-1)
#define GPBDAT_5 (1 << (1*5))
#define GPFCON_2 ~(3 << (1*2))
#define GPFDAT_2 (1 << 1)
int main()
{
unsigned long dwDat;
GPBCON = GPBCON_10; //设置GPB控制寄存器的[11,10]=0b01位
GPFCON = GPFCON_2;
while(1)
{
dwDat = GPFDAT;
if(dwDat & GPFDAT_2)
{
GPBDAT |= GPBDAT_5;
}
else
{
GPBDAT &= ~GPBDAT_5;
}
}
return 0;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』