2440 裸机小节

来源:互联网 发布:ubuntu和redhat哪个好 编辑:程序博客网 时间:2024/06/07 17:07
 

工作模式
1 用户模式
2 快速中断模式
3外部中断模式
4管理模式
5数据访问终止模式
6系统模式
7未定义模式
可通过软件改变,或外部中断改变模式。
除去用户模式和系统模式其他5种模式都叫异常模式。

寄存器
37个32位寄存器,31个通用寄存器,6个状态寄存器。不同模式下访问寄存器不同。
几个重要的寄存器:
1,CPSR 程序状态寄存器
所有的处理器模式都可以访问当前程序状态寄存器,它包含当前处理器模式以及其他状态和控制信息,比如溢出为,进位位。
2 SPSR 异常模式下的程序状态寄存器,用于保留cpsr 的信息。用于在异常模式下异常返回。
3 R15 又称PC指针,是程序运行标志
4 R14又称子程序链接寄存器(LR),在执行BL指令是,PC寄存器的值先复制到LR寄存器,在子函数返回值,通过执行 MOV R15,LR指令子函数返回。
5 R13,用作堆栈指针,又称SP,不明思议,就是堆栈用咯,通过SP开辟一些内存区域存储一些信息。例如
STMFD SP!,{R0-R7,LR} ;现场保存,将R0-R7 LR入栈
LDMFD SP!,{R0-R7,LR};恢复现场,异常处理返回。
ARM启动流程解析:
一,上电或复位
二,建立异常向量表
1,建立异常复位处理函数
2,建立未定义模式异常处理函数
3,建立软中断模式处理函数
4,建立取指令异常处理函数
5,建立数据中止异常处理函数、
6,建立IRQ处理函数
7,建立FIO处理函数
注意,如果启动过程中没有234567所描述的异常,则无条件执行1处理的函数。


1中处理函数:
一,初始化硬件
1,关闭关门狗(为了避免关门狗开启造成的系统重启)
2,屏蔽所有中断(中断服务子程序一般在用户程序中实现,启动代码无需处理)
3,初始化PLL和时钟(讲时钟调整到符合各个设配的频率)
4,初始化存储系统(将存储地址空间分成8个区,其中前六个固定大小,可以挂载ROM,SRAM等,后两个SDRAM,SRAM和ROM)

二,系统初始化堆栈。
为各个处理莫属分配堆栈空间。
注意:堆栈初始化的顺序决定了系统最好运行在哪种模式,所以最后初始化的模式应该是系统模式。
三 应用程序执行环境初始化
nandflash无法运行程序,将RO,RW段搬至SDRAM中运行,并将ZI段清零,其中RW段必须在RAM中执行,若程序无RW段,而且R0段代码大小小于4K,就不必搬到SDRAM中。
四 执行主函数main

 


细节:
异常向量表的第一条指令的存储地址为0,系统刚启动时,pc会指向0x00000000,这是 “B reseInit”,程序此时跳转到上电复位函数执行,未定义异常处理函数地址是0x00000004,软中断处理函数是0x00000008,以此类推,最后FIQ处理函数的地址是0x00000029.
 


ARM裸机程序设计
一 定时器
流程 设置时钟频率 初始化mmu 定时器初始化
1 设置TCFGn寄存器(设置分频初值)
2 设置TCNTB寄存器(设置计数初值)
3 设置TCMPB寄存器(设置被减最小值)
4 设置TCON寄存器(启动定时器,是否自动更新初值)
5 设置优先级
6 清中断

二 UART
流程
设置时钟频率 :
设置Set_Clk() 函数 cal_cpu_bus_clk()函数,FCLK,HCLK,PCLK
设置波特率函数 Uart_Init(int pclk,int baud)

选择哪个uart通道口  Uart_Select(int ch)

发送数据函数  Uart_Printf(char *fmt,...);通过UART发送数据到PC

void Uart0_TxEmpty()  等待,直到UART的发送器为空,就是发送完毕

char Uart_Getch(void)  从终端上获取敲入的字符,返回值为char类型。RdURXH0有数据时,返回URXH的数据。当URXH没有数据时,总是等待,直到有数据。

void Uart_GetString(char *string)  这个函数用于从终端得到一个字符串,并储存到string中

char Uart_GetKey(void)

Uart_GetKey 这个与Uart_Getch 不同的是,当URXH没有数据时返回0。有数据时,返回数据,这个函数可以用来查看当前URXH中的值。

三 ADC
流程
设置时钟频率

ADC转换频率设置
ADCCON寄存器
注意ADCCON寄存器的第 6到13位 分频,当pclk 设置成50MHZ 第6到13位设置成19时,ADC采样频率就等于 50000000/(19+1);
开始AD转换
ADCCON寄存器最低位设置成1,当开始转换时最低位自动变成0,所以可以判断该位来判断是否进行AD转换。

检查是否转换结束
判断ADCCON的最高位,如果最高位被置为1,表明转换结束。
开始读取转换值
ADCDAT0 寄存器的第0到9位。

触摸屏驱动
首先设置ADC,如上
设置ADCTSC寄存器
等待中断
中断函数处理