转载来自:https://blog.csdn.net/sinat_36184075/article/details/71305568
** 本文未附任何实例代码,基于目标板的不同操作不尽相同,网络资源针对比较成熟的开发板均可找到对应的成套实例代码【开发环境构建】1. 开发环境搭建:操作系统或虚拟机Ubuntu安装、网络服务配置、工具安装等 工具资源<云盘>:https://pan.baidu.com/s/1bpakJtP // env/嵌入式linux软件开发环境(不定期更新) 步骤整理<博客>:http://blog.csdn.net/sinat_36184075/article/details/711948322. 编程基础内容:交叉编译使用、Makefile规则、常用汇编指令 交叉编译工具链制作<博客>:http://blog.csdn.net/sinat_36184075/article/details/71195114 Makefile编写<博客>:http://blog.csdn.net/sinat_36184075/article/details/54917518 汇编指令快速查询<博客>:http://blog.csdn.net/sinat_36184075/article/details/558198693. 常用工具使用: windows下工具的使用(SourceInsight、SecureCRT、keil、IAR等) linux下工具的使用(tftp、nfs、vi、man手册、基本命令行命令及grep/find/tar/diff/patch等) // 常用工具上手简单,可自查。
【ARM9嵌入式系统基础】1. GPIO接口1) 嵌入式开发步骤: 编程:主要以.c .h文件为主; 编译:make命令调用Makefile中写好的交叉编译规则来编译出.bin二进制文件; 烧写:PC并口与JTAG连接或PC的USB与串口连接,使用对应的工具和命令烧写; 运行测试:命令运行或复位开发板,观察运行效果。2) 通过GPIO引脚实现软件如何控制硬件: 单个引脚的操作有3种:输出高低电平、检测引脚状态、中断; 对某个引脚的操作通过读、写寄存器来实现; 读写寄存器方法:通过编程程序,读写寄存器的地址; // 需结合2点:目标板电路图(确定引脚)、ARM芯片手册Datasheet(操作说明)2. 存储控制器1)目标板地址空间布局: 32位CPU虚拟地址4G,其中1G为CPU内核空间,3G为用户空间; // 1G:0x0000_0000 ~ 0x4000_0000
// 3G:0x4000_0000 ~ 0xFFFF_FFFF
// 表:目标板功能部件与寄存器地址对照表
// 表:存储控制器与所接外设的访问地址对照表3. 内存管理单元MMU1) 虚拟地址和物理地址关系 MMU:负责虚拟地址到物理地址的映射,提供硬件机制的内存访问权限检查。 通过MMU使得各个用户进程都有自己独立的地址空间。 ARM的CPU上地址转换有3个概念:虚拟地址VA、变换后的虚拟地址MVA、物理地址PA。 没启动MMU时,CPU、cache、MMU、外设等所有部件使用的是物理地址; 启动MMU之后,CPU对外发出虚拟地址VA,VA被转换为MVA供cache、MMU使用,MVA在这里被转换为PA,最后使用PA读写实际的硬件设备(内部寄存器或外接设备)。 CPU核看到的、用到的只是虚拟地址VA。实际设备看不到VA和MVA,读写他们时使用的是物理地址PA。2) 通过设置MMU来控制虚拟地址到物理地址的转化 虚拟地址VA >> 物理地址PA 方法有2:用一个确定的数学公式转换、用表格存储虚拟地址对应的物理地址(表格:页表Page Table)。 页表:由一个个条目(Entry)组成,每个条目存储了一段VA对应的PA及其访问权限,或者下一页表的地址。 ARM的CPU核使用的是第二种方法:页表。3) MMU的内存访问权限机制 内存的访问权限检查是MMU的主要功能之一,决定了一块内存是否允许被读或被写。 // 表:AP位、S、R位的访问权限对照表4. Nand Flash控制器1) Nand Flash芯片接口 类似于PC上的硬盘,掉电不丢失,保存系统运行所必须的操作系统、应用程序、用户数据、其他数据等。 容量:16M~512M 与Nor Flash相比优点:Nand Flash性能高即擦写速度快3ms、可擦写次数多、生命周期10倍以上、容量大、价格低。 与Nor Flash相比缺点:Nand Flash可靠性较低必须要有校验措施、易用性不如Nor Flash、不支持XIP(XIP:代码可以直接在Nor Flash上运行,无需加载到内存)。 Flash存储器件的可靠性要考虑3点:位反转、坏块、可擦除次数。 Nand Flash发生位反转的概率更高,推荐使用EDC/ECC进行错误检测和恢复。 嵌入式linux对两种Flash的支持都很成熟,在Nor Flash上常用jffs2文件系统,在Nand Flash上常用yaffs文件系统。在更底层,有MTD驱动程序实现了对他们的读、写、擦除操作,也实现了EDC/ECC校验。2) 通过Nand Flash控制器访问Nand Flash的方法 对Nand Flash进行访问控制时,需要先发出命令,然后发出地址序列,最后读写数据;需要使用各个使能信号来分辨是命令、地址、还是数据。5. 中断体系结构1) ARM的CPU中7种工作模式 用户模式usr、快速中断模式fiq、中断模式irq、管理模式svc、数据访问终止模式abt、系统模式sys、未定义指令终止模式und。 大多数程序运行与用户模式usr,进入其他6种特权模式是为了处理中断、异常、或者访问被保护的系统资源。 ARM的CPU中有两种工作状态:32bit的ARM指令、16bit的Thumb指令。 ARM9中有31个32bit寄存器 + 6个状态寄存器 = 37个寄存器。2) 中断服务程序编写方法 CPU运行过程中,知道各类外设发生了某些事件如串口接收到了新数据、USB接口插入了设备、按下了某个按键等,主要通过2种方法: 轮询:循环检查设备状态并作出相应反应。实现简单,常用在功能单一的系统中,如温控系统;缺点是占用CPU资源过高,不适用于多任务系统; 中断:当某时间发生时,硬件会设置某个寄存器,中断当前程序,跳转执行此事件,最后返回被中断的程序。实现相对复杂,但效率很高,是常用的方法。 使用中断的步骤: ①设置好中断模式和快速中断模式下的栈; ②准备好中断处理函数(ISR); ③设置中断优先级; ④进入、退出中断模式或快速中断模式时,需要保存、恢复被中断程序的运行环境; ⑤根据具体中断,设置相应外设; ⑥确定使用此中断的方式:FIQ或IRQ; ⑦使能中断。6. 系统时钟和定时器1) 系统时钟体系结构 时钟控制逻辑给整个芯片提供三种时钟, FCLK:用于CPU核; HCLK:用于AHB总线(用高性能模块的连接)上的设备,如CPU核、存储器控制、中断控制器、LCD控制器、DMA和USB主机模块等; PCLK:用于APB总线(用于低带宽外设的连接)上的设备,如IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI;2) 通过设置MPLL改变系统时钟的方法 ①设置分频/倍频 ②启动MPLL ③设置存储控制器SDRAM ④初始化定时器0 ⑤定时器0中断使能及中断服务程序7. 通用异步收发器UART1) UART原理 全双工方式串行双向数据收发。 通信管脚跳线接线方式: RxD <=> TxD TxD <=> RxD GND <=> GND RS232逻辑电平:高电平(3~12V)表示0,低电平(-3~-12V)表示1。 重要参数: >>数据位个数: 5 ~ 8 bit (开发板那端定好的是 8 bit / 帧数据) >>验证方式:奇校验、偶校验、无校验 >>停止位宽度:1~2bit >>通信的速率:bps (bit per second - 每秒传输bit位,即波特率) 数据收发原理: 发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到发送移位器(TS)中,发送移位器将数据一位一位的发送到TxDn数据线上。 接收数据时,接收移位器(RS)将RxDn数据线上的数据一位一位的接收进来,然后复制到接收FIFO中,CPU即可从中读取数据。2) UART使用 ①将所涉及的UART通道管脚设为UART功能 ②设置波特率 ③设置传输格式 ④设置时钟源、中断方式(或DMA模式)