物联网实验指导书嵌入式a8_第1页
物联网实验指导书嵌入式a8_第2页
物联网实验指导书嵌入式a8_第3页
物联网实验指导书嵌入式a8_第4页
物联网实验指导书嵌入式a8_第5页
已阅读5页,还剩436页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

封面目录机开发篇 8第一部分S5PV2101初识ARM 81.1ARM处理器的应用领域 81.2主流ARM处理器介绍 10封面目录机开发篇 8第一部分S5PV2101初识ARM 81.1ARM处理器的应用领域 81.2主流ARM处理器介绍 101.3S5PV210处理器介绍 121.4A8开发平台介绍 131.5S5PV210机开发软件和驱动的安装 141.6本章小结 142ARM汇编语言基础 152.1ARM寄存器组介绍 152.2ARM寻址方式 162.3ARM指令集 182.4ARM伪指令 212.5本章小结 233详解S5PV210启动过程 243.1S5PV210243.2S5PV210启动模式设置 263.3S5PV210启动流程分析 273.4本章小结 294S5PV210GPIO接口实验2.2ARM寻址方式 162.3ARM指令集 182.4ARM伪指令 212.5本章小结 233详解S5PV210启动过程 243.1S5PV210243.2S5PV210启动模式设置 263.3S5PV210启动流程分析 273.4本章小结 294S5PV210GPIO接口实验 304.1GPIO硬件接口介绍 304.2汇编点亮LED 314.3用C语言和汇编混合编程点亮流水灯 424.4按键控制LED实例 444.5蜂鸣器控制实例 504.6本章小结 535S5PV210系统时钟 545.1S5PV210时钟体系简述 545.2系统时钟实例 575.3本章小结 646S5PV210串口通信原理与应用 656.1串口通信原理 656.2S5PV210UART的功能特性 666.3S5PV210UART实例 696.4本章小结 757S5PV210中断体系结构与应用 767.1中断的概念 767.2S5PV210按键中断实例 787.3本章小结 878S5PV210定时器原理与应用 898.1PWM定时器的概述 898.2PWM定时器实例 918.3本章小结 1049S5PV210 NANDFLASH控制器 1059.1FLASH概述 1059.2S5PV210的NANDFLASH控制器 1139.3NANDFLASH的操作实例 1197.3本章小结 878S5PV210定时器原理与应用 898.1PWM定时器的概述 898.2PWM定时器实例 918.3本章小结 1049S5PV210 NANDFLASH控制器 1059.1FLASH概述 1059.2S5PV210的NANDFLASH控制器 1139.3NANDFLASH的操作实例 1199.4本章小结 13610S5PV210 I2C接口与应用 13710.1初识I2C总线 13710.2S5PV210I2C总线接口 13910.3I2C实例(成功读写AT24C02) 14210.4本章小结 15611S5PV210 LCD控制器原理与应用 15711.1LCD简介 15711.2S5PV210LCD控制器 15711.3LCD显示实例 16511.5本章小结 17712S5PV210 ADC接口与应用 17912.1ADC接口概述 17912.2ADC转换操作 18012.3ADC实例 18112.4本章小结 18813S5PV210 I2S接口与应用 18913.1初识I2S总线 18913.2I2S总线数据传输 18913.3 I2S实例(wm8960音频实例) 19013.4 本章小结 208第二部分Bootloader移植篇 2091初识Bootloader 2091.1初识Bootloader 2091.2常见的Bootloader 2112Bootloader启动流程分析 2112.1Bootloader启动的两个阶段 2112.2Bootloader的内核调用 2123U-BOOT移植准备工作13.3 I2S实例(wm8960音频实例) 19013.4 本章小结 208第二部分Bootloader移植篇 2091初识Bootloader 2091.1初识Bootloader 2091.2常见的Bootloader 2112Bootloader启动流程分析 2112.1Bootloader启动的两个阶段 2112.2Bootloader的内核调用 2123U-BOOT移植准备工作 2163.1U-BOOT简介 2163.2U-BOOT的架构概述 2163.3U-BOOT启动流程的源代码分析 2183.4U-BOOT编译初体验 2493.5U-BOOT使用 2534十二步教你学会移植U-BOOT 2714.1第1步,设置自己开发板的信息 2714.2第2步,拷贝相关开发板目录 2714.3第3步,修改相关文件 2724.4第4步,修改编译文件 2754.5第5步,修改打印信息 2764.6第6步,修改内存信息 2774.7第7步,支持DM9000网卡 2784.8第8步,支持NandFlash 2834.9第9步,支持NandFlash启动 2864.10第10步,支持yaffs2烧写 2914.11第11步,U-Boot命令移植 3044.12第12步,菜单栏的移植 3125Bootloader移植篇小小小结 317第三部分Linux内核移植篇 3191Linux由来与版本 3192内核编译初体验 3203Linux内核结构 3243.1内核的子系统 3243.2内核目录 3263.3管理3274六大步教你学会移植Linux内核 3394.15Bootloader移植篇小小小结 317第三部分Linux内核移植篇 3191Linux由来与版本 3192内核编译初体验 3203Linux内核结构 3243.1内核的子系统 3243.2内核目录 3263.3管理3274六大步教你学会移植Linux内核 3394.1第一步,源代码获取 3394.2第二步,修改内核 3414.3第三步,配置内核 3514.4第四步,检查串口 3644.5第五步,拷贝uImage制作工具(mkimage) 3654.6第六步,编译及出错处理 3655Linux内核移植篇小小小结 377第四部分构建Linux根文件系统篇 3791Linux文件系统简介 3791.1文件系统与根文件系统 3791.2文件系统的类型 3791.3Linux根文件系统目录结构 3801.4Linux文件属性 3812移植BusyBox 3842.1BusyBox的简介 3842.2获取BusyBox源码 3842.3四部曲移植BusyBox 3862.4命令就是可执行程序: 3913构建根文件系统 3923.1构建lib目录 3923.2构建dev目录 3943.3构建etc目录 3963.4构建/proc、/sys和/tmp目录 4054构建NFS文件系统 4064.1NFS简介 4063.1构建lib目录 3923.2构建dev目录 3943.3构建etc目录 3963.4构建/proc、/sys和/tmp目录 4054构建NFS文件系统 4064.1NFS简介 4064.2NFS服务器的安装与配置 4074.3关闭:4084.4设置uboot中的关于NFS的参数 4095构建YAFFS2文件系统 4155.1YAFFS2简介 4155.2作yaffs2映像文件: 4166构建Linux文件系统篇小小小结 417第五部分Qt编程篇 4191Qt的介绍 4191.1Qt的开发工具 4191.2Qt的版本 4202Qt4开发平台的建立 4212.1编译和安装Qt4 4222.2使用QtCreator进行开发 4293基础例程开发详解 4403.1mainwindow 440第一部分S5PV210机开发篇第1章ARM1.1ARM1.1.1ARMARM处理器是一种低功耗高性能第一部分S5PV210机开发篇第1章ARM1.1ARM1.1.1ARMARM处理器是一种低功耗高性能32位RISC(精简指令集)处理器。目前,采用ARM技术知识产权(IP)核的微处理器,就是通常所说的ARM微处理器已遍市场,基于ARM32RISC75%以上的市场份额,ARM1.1.2ARM处理器的应用领域在信息化程序如此高的今天,ARM技术的应用已经渗入到了各个领域,不断的发展和革新为人们的生活带来了极大的便利。1.无线通信、便携式式目前已有超过80%的无线通信设备采用了ARMARM在该领域的地位日益巩固。如:PAD、智能上网本、 等。1.1ARM1.2ARM应用2.数字消费类流行的数码相机和打印机中绝大部分采用ARM技术,包括基于ARM32RISC75%以上的市场份额,ARM1.1.2ARM处理器的应用领域在信息化程序如此高的今天,ARM技术的应用已经渗入到了各个领域,不断的发展和革新为人们的生活带来了极大的便利。1.无线通信、便携式式目前已有超过80%的无线通信设备采用了ARMARM在该领域的地位日益巩固。如:PAD、智能上网本、 等。1.1ARM1.2ARM应用2.数字消费类流行的数码相机和打印机中绝大部分采用ARM技术,包括中SIMGPS智能卡也采用ARM技术,类似的还有数字音频导航仪等。1.3数字机顶盒1.4GPS3.网络领域随着宽带技术的发展及推广,采用ARM技术的交换机、无线点、、多服务配置平台、网络连接和固态磁盘等。1.5路由器1.1.2ARM处理器的特点ARM,16/32有以下六个主要特点:①体积小、低功耗,低成本和高性能;②支持Thumb(16位)/ARM(32位)双指令集;③大量使用寄存器,指令执行速度快;④大多数数据操作都在寄存器中完成;随着宽带技术的发展及推广,采用ARM技术的交换机、无线点、、多服务配置平台、网络连接和固态磁盘等。1.5路由器1.1.2ARM处理器的特点ARM,16/32有以下六个主要特点:①体积小、低功耗,低成本和高性能;②支持Thumb(16位)/ARM(32位)双指令集;③大量使用寄存器,指令执行速度快;④大多数数据操作都在寄存器中完成;⑤寻址方式灵活简单,执行效率高;⑥指令长度固定。1.2ARM1.2.1ARMARMARM7、ARM9、ARM9E、ARM10E、ARM11、Cortex系列等,目前仍在不断发展。1.6ARM1.2.2ARM名ARMDMIEJFS】形式出现,这些后缀了可以组合,含义如下:①x:系列号,如ARM9、ARM11等;②y:管理/保护单元;③z:Cache;系列等,目前仍在不断发展。1.6ARM1.2.2ARM名ARMDMIEJFS】形式出现,这些后缀了可以组合,含义如下:①x:系列号,如ARM9、ARM11等;②y:管理/保护单元;③z:Cache;④T:16Thumb⑤D:表示支持片上调试(Debug);⑥M:表示内嵌硬件乘法器(Multiplier);⑦I:支持片上断点和调试点;⑧E:增强指令(TDMI⑨J:JazelleJava;⑩F:支持向量浮点单元;⑪S:表示式(fullsynthesizable1.3S5PV2101.3.1S5PV210CortexA8处理器给消费和低功耗移动 带来了的 ,使得最终用户可以享受到更高水准的和创新。全新的ARMCortex-A8处理器及其背后费者带来具有丰富应用的创新设备。Cortex-A8处理器是第一款基于下一代ARMv7架构的应用处理器。其中S5PV210是大名鼎鼎的三星公司推出的一款适用于智能和平板电脑等多媒体设备的应用处理器,具有完整的应用兼容性,支持传统的ARM、Thumb指令集和新增的高性能紧凑型Thumb-2指令集。S5PV2101.3.1S5PV210CortexA8处理器给消费和低功耗移动 带来了的 ,使得最终用户可以享受到更高水准的和创新。全新的ARMCortex-A8处理器及其背后费者带来具有丰富应用的创新设备。Cortex-A8处理器是第一款基于下一代ARMv7架构的应用处理器。其中S5PV210是大名鼎鼎的三星公司推出的一款适用于智能和平板电脑等多媒体设备的应用处理器,具有完整的应用兼容性,支持传统的ARM、Thumb指令集和新增的高性能紧凑型Thumb-2指令集。1.3.2Cortex-A8①②移动Internet的理想选择,低功耗设计,支持全天浏览和连接。③多核技术,单核到四核实现,支持面向性能的应用领域。④高级扩展,兼容ARM和Thumb体系结构外,提供Thumb-2提供最佳代码大小度。1.4A8开发平台介绍ARMCortexA8S5PV2101GHz能支持多种操作系统,如:Linux、Andriod和WinCE等操作系统。开发环境主要是RedHat的Linux操作系统和SecureCRT串口调试工具,开发方便,使用简单。41.4A8开发平台介绍ARMCortexA8S5PV2101GHz能支持多种操作系统,如:Linux、Andriod和WinCE等操作系统。开发环境主要是RedHat的Linux操作系统和SecureCRT串口调试工具,开发方便,使用简单。4128MBDDR2程序也能在平台上运行顺畅。512MBSLCNandFlashECC据读写的出错率。724bpp,分辨率:800×480,支持五点触摸,用户能清晰实时地查看图像、数据,和通过点击触摸屏控制平台,为开发工业类和消费类项目提供了便利。板均可拔插更换,底板的预留接口有、Camera板、底板或加护;平台集成了WM8960音频模块、DM9000网络通信模块、SD卡传输电路、串口通信电路、usb通信电路、8个按键和蜂鸣器等外设,丰富。程序方式:可在已烧写开发套件提供的uboot的基础下,通过usb烧写自己的程序,操作方便,烧写速度快,加快开发进度。国内首创物联网接口。通过配套的物联网盒子可以与RFID、ZigBee、蓝牙、WIFI1.5S5PV210机开发软件和驱动的安装留接口有、Camera板、底板或加护;平台集成了WM8960音频模块、DM9000网络通信模块、SD卡传输电路、串口通信电路、usb通信电路、8个按键和蜂鸣器等外设,丰富。程序方式:可在已烧写开发套件提供的uboot的基础下,通过usb烧写自己的程序,操作方便,烧写速度快,加快开发进度。国内首创物联网接口。通过配套的物联网盒子可以与RFID、ZigBee、蓝牙、WIFI1.5S5PV210机开发软件和驱动的安装里面有详细的安装与使用步骤哟O(∩_∩)O~~A81.6本章小结本章主要简单介绍了ARM^_^。是不是很渴望开始学习ARM51杰出的工程师。第2章ARM汇编语言基础2.1ARM寄存器组介绍ARM37(1)31PC(程序计数器)32(2)6第2章ARM汇编语言基础2.1ARM寄存器组介绍ARM37(1)31PC(程序计数器)32(2)632ARM7(User,快速中断模式(FIQ,普通中断模式(IRQ,管理模式(Sc,数据中止模式(Abort(Und(Sys应的寄存器。在任意一种处理器模式下,可见的寄存器包括15个通用寄存器(R0~R14(PC理寄存器。的物2.1ARM在Thumb程序中,通常只能使用r4~r7来保存局部变量;r12用作子程序间scratch2.1ARM在Thumb程序中,通常只能使用r4~r7来保存局部变量;r12用作子程序间scratchipr13sp;r14为连接寄存器(lr,用于保存子程序的返回地址;r15用作程序计数器(pc由于ARM采用了流水线机制,当正确了PC的值后,该值为当前指令地址加8PC2.2ARM2.2.1立即寻址例:以上两条指令,第二个源操作数为立即数,要求以“#”为前缀,对于十六ADDR0,R0,#0x1 ;R0<-R0+1ADDR0, R0,#0x3f ;R0<-R0+0x3f进制数需在紧跟“#”后加上“0x以后出现都是如此,故不再详述。2.2.2寄存器寻址例:R1R2R02.2.3寄存器间接寻址例:第一条指令,将R1的值作为地址,取出条指令,将R0的数据 到R1进制数需在紧跟“#”后加上“0x以后出现都是如此,故不再详述。2.2.2寄存器寻址例:R1R2R02.2.3寄存器间接寻址例:第一条指令,将R1的值作为地址,取出条指令,将R0的数据 到R1的值为地址的器中的数据传送到R0中;第二器里面。2.2.4多寄存器寻址例:16的后缀IA表示在每次执行完加载/操作后,R0按字长增加。R0R1、读出保存到R0指向的地址,R0的地址按字长增加。LDMIAR0,{R1,R2,R3,R4} ;R1<-[R0],R2<-[R0+4],;R3<-[R0+8],R3<-[R0+12]STMIAR0,{R3-R5,R10} ;[R0]<-R3,[R0+4]<-R4;[R0+8]<-R5,[R5+12]<-R10LDRR0,[R1] ;R0<-[R1]STRR0,[R1] ;[R1]<-R0ADDR0,R1,R2 ;R0<-R1+R22.3ARM2.3.1ARM格式:<opcode>{<cond>}{S}{Rd},{Rn},{operand2}<opcode>:指令操作符编码,如LDR、STR等。{<cond>}:指令执行的条件编码,如EQ、NE等。{S}:决定指令的执行是否影响CPRS的值。{Rd}:目标寄存器编码。2.3ARM2.3.1ARM格式:<opcode>{<cond>}{S}{Rd},{Rn},{operand2}<opcode>:指令操作符编码,如LDR、STR等。{<cond>}:指令执行的条件编码,如EQ、NE等。{S}:决定指令的执行是否影响CPRS的值。{Rd}:目标寄存器编码。{Rn}:包含第一个源操作数的寄存器编码。{operand2}:第二个操作数。ARMARM2.2ARM2.3.2跳转指令跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:使用专门的跳转指令。②PCARM①是相对当前PC的一个偏移量,经汇编器计算得到跳转的绝对地址。②地址 到当前处理器模式下的返回。地址LR使用专门的跳转指令。②PCARM①是相对当前PC的一个偏移量,经汇编器计算得到跳转的绝对地址。②地址 到当前处理器模式下的返回。地址LR③BLX带返回和状态切换的跳转指令④BX带状态切换的跳转指令2.3.3数据处理指令数据处理指令分类:①数据传送指令例:②比较指令例:③算数运算指令例:ADDR0,R1,#256 ;R0=R1+256CMPR1,#100 R1100CPSRTSTR1,#0xfffe R10xfffe结果设置CPSR的标志位。MOVR1,R0 R0R1MOVR1,R0,LSL#3 R03R1逻辑运算指令例:2.3.4乘法指令例:2.3.5加载/指令ARM加载/指令用于在寄存器和器之间传送数据例:2.3.6程序状态寄存器指令①MSR通用寄存器到程序状态寄存器的数据传送指令②MRS程序状态寄存器到通用寄存器的数据传送指令LDRR0,[R1,R2] ;将 逻辑运算指令例:2.3.4乘法指令例:2.3.5加载/指令ARM加载/指令用于在寄存器和器之间传送数据例:2.3.6程序状态寄存器指令①MSR通用寄存器到程序状态寄存器的数据传送指令②MRS程序状态寄存器到通用寄存器的数据传送指令LDRR0,[R1,R2] ;将 器R0LDRR0,[R1,R2]! ;将 器地址为R1+R2的字数据读入寄存R0R1+R2R1STRR0,[R1],#8 ;将R0中的字数据写入以R1为地址的 器中,R1+8R1STRR0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的 器中MULR0,R1,R2 ;R0=R1*R2ADDR0,R0#3 R00、1ORRR0,R0,#3 ;该指令置R0的0、1位为1,其余位保持不变。BICR0,R0,#0xf8 ;该指令清除R0的高5位,其余位保持不变。SUBR0,R1,R2 ;R0=R1–R2RSBR0,R2,R3,LSL#1 ;R0=(R3<<1)–R2例:2.4ARMCPU的使命也就随之结束。2.4.1符号定义伪指令符号定义伪操作主要用于ARM汇编程序中定义变量,对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种:①用于定义全局变量的GBLA、GBLL以及GBLS。②用于定义局部变量的LCLA、LCLL以及LCLS。③用于对变量赋值的SETA、SETL以及SETS。④为一个协处理器定义名称用CP。⑤例:2.4ARMCPU的使命也就随之结束。2.4.1符号定义伪指令符号定义伪操作主要用于ARM汇编程序中定义变量,对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种:①用于定义全局变量的GBLA、GBLL以及GBLS。②用于定义局部变量的LCLA、LCLL以及LCLS。③用于对变量赋值的SETA、SETL以及SETS。④为一个协处理器定义名称用CP。⑤为一个通用寄存器列表定义别名用RLIST。例:2.4.2数据定义伪指令数据定义伪操作一般用于特定的数据分配单元的初始化。常见的数据定义伪操作有如下几种:①DCB/W/D用于分配一片连续字节单元并用指定的数据初始化,其中BGBLA TEST TESTTEST SETA0x55 0x55LCLS STRING 为STRINGSTRINGSETS“Webee210” ;将该变量赋值为”Webee210”ListRLIST {R0-R3} ListR0~R3MSRCPSR,R0 R0CPSRMRS R0,CPSR CPSRR0byteW(wordD(doubleARM4个字节。②MAP用于定义一个结构化的内存表首地址,与FIELD配合使用。③byteW(wordD(doubleARM4个字节。②MAP用于定义一个结构化的内存表首地址,与FIELD配合使用。③FIELD用于定义一个结构化的内存表的数据域。例:2.4.3宏定义伪指令义的结束。用MACRO和MEND定义的一段代码,称为宏定义体,这样在程序中就可以通过宏定操作多次调用该代码段,可以使用MEXIT宏定义。例:2.4.4其他常见的伪指令①AREA 用于定义一个代码段或数据段②ALIGN 通过添加填充字节的方式,使当前位置满足一定的对齐方式MACROCSI_SETB CSI_SETB,无参数LDR R0, =rPDATG ; GPG0LDR R1,[R0] GPG0R1ORR R1, R1,#0x01 R101,STR R1,[R0] ;输出控制结果MENDStr DCB“Webee210”;分配一片连续的字节 单元并初始化为“Webee210DataDCW 1,2,3,4 分配一片连续的半字 单元并初始化为相应值。MAP0x2000 0x2000FIELD16 A160x2000FIELD32 B320x2010SFIELD128 S1280x2030③CODE16/32 16Thumb32ARM④ENTRY指定汇编程序的,一个源文件中最多只有一个ENTRY,一个程序中至少有一个ENTRY。⑤END通知编译器已经到了源程序的结尾,每个源程序包含一个END⑥EQUC#define。⑦EXPOR③CODE16/32 16Thumb32ARM④ENTRY指定汇编程序的,一个源文件中最多只有一个ENTRY,一个程序中至少有一个ENTRY。⑤END通知编译器已经到了源程序的结尾,每个源程序包含一个END⑥EQUC#define。⑦EXPOR用于在程序中一个全局标号,该标号可在其他文件中。⑧IMPORT 用于通知编译器要使用一个在其他源文件中定义的标号。⑨INCLUDE用于将一个源文件包含到当前的源文件中。2.5本章小结ARMARMARMARMARM就会知道,相比起DSP内核汇编语言来说简直就是太简单了^_^。当然ARM汇编语言不仅仅有以上介绍的指令,但如果能熟悉掌握本章介绍的指令,那么阅读ARM汇编程序绝对不是问题,毕竟ARM程序主要还是使用C语言开发滴,有木有内核的head.S等文件,读者要能结合本章知识点去阅读这些文件,难度肯定会降低很多。第3章S5PV2103.1S5PV210内存地址3.1S5PV2100~4G第3章S5PV2103.1S5PV210内存地址3.1S5PV2100~4G图3.2由上面二个图可知,S5PV210含有一个大小为3.2由上面二个图可知,S5PV210含有一个大小为64KB的IROM,起始地址为0xD0037FFF;0x20000000,有二个内存块,DRAM0和DRAM1大小分别为512MB、1024MB。3.2S5PV210启动模式设置3.3S5PV210OM[5:0]3.2S5PV210启动模式设置3.3S5PV210OM[5:0]001100BSDBOOT;OM[5:0]000010B时,启动方式为NAND2KB 8bit ECC。=3.3S5PV210启动流程分析根据三星公司的《S5PV210_UM_REV1.1》手册可知,S5PV210启动过程主要可3①S5PV210IROM的启动代码 BL0②BL0BL1(最大16KB)到IRAM处,即刚才所说的3.3S5PV210启动流程分析根据三星公司的《S5PV210_UM_REV1.1》手册可知,S5PV210启动过程主要可3①S5PV210IROM的启动代码 BL0②BL0BL1(最大16KB)到IRAM处,即刚才所说的0xD0020000开始的地址,其中16BL1BL1BL1进行校验,校验通过转入BL1进行执行,BL1继续初始化,并拷贝BL2(最大80KB)IRAMBL2。③BL2DRAMOS贝到DRAM中,并跳到OS中执行并完成启动引导。3.4启动过程示意图BL0代码主要完成以下初始化:①关闭看门狗;②icache;③初始化栈;④初始化堆;⑤初始化块设备拷贝功能;⑥设置系统时钟;⑦BL1iRAM;⑧BL1(安全启动模式,校验成功则跳到0xD0020000(IRAM)处执行。0xD0020000~0xD00200101616在《S5PV210_iROM_ApplicationNote_Preliminary_20091126》文档中规定16校验和的计算方法:count:是一个循环索引变量dataLength:BL1④初始化堆;⑤初始化块设备拷贝功能;⑥设置系统时钟;⑦BL1iRAM;⑧BL1(安全启动模式,校验成功则跳到0xD0020000(IRAM)处执行。0xD0020000~0xD00200101616在《S5PV210_iROM_ApplicationNote_Preliminary_20091126》文档中规定16校验和的计算方法:count:是一个循环索引变量dataLength:BL1buffer:BL11CheckSum:BL1for(count=0;count<dataLength;count++){buffer=(*(volatileu8*))(uBLAddr+count);CheckSum=CheckSum+buffer;}地址内容0xD002_0000BL10xD002_000400xD002_0008CheckSum0xD002_000C0如何生成16byte的头部信息?在从启动设备(如:NANDFLASHSD)如何生成16byte的头部信息?在从启动设备(如:NANDFLASHSD)BL116KIRAMBL1程中CPU会计算出当前bin文件中含’1’的个数,然后与校验和进行比较,如果二者相等则继续运行程序,否则,不执行。3.5S5PV2103.4本章小结本章主要分析了S5PV210的启动流程过程,理顺了启动过程后,对以后的学更加清楚的认识它的启动过程,请参考三星公司的《S5PV210_iROM_ApplicationNote_Preliminary_20091126》手册。前面三章稍微有点枯燥,有木有^_^。是不是迫不及待的想接触代码,接触实际硬件电路,想点亮属于自己控制的LED灯了呢?很快,您将会看到……第4章S5PV210GPIO4.1GPIO4.1.1GPIOPurposeI/O想点亮属于自己控制的LED灯了呢?很快,您将会看到……第4章S5PV210GPIO4.1GPIO4.1.1GPIOPurposeI/OPorts)I/O行读写操作GPIO操作是所有硬件操作的基础。S5PV210有237个多功能I/O端口,可以通过设置寄存器来确定某个引脚用于输入、输出或者用于其他特殊功能。4.1.2GPIO控制S5PV210的GPIO端口寄存器主要有三类,分别是控制寄存器GPxCON,GPIO(输入/输出/其他功能GPxDAT,用于读/写引脚数据;上拉寄存器GPxUP,用于确定是否使用内部上拉电阻。4.1.3LEDLED210板上,如下:4.1LED4.24LEDGPIO由以上两个图可知,LED1~LED4GPIOGPJ2_0~GPJ2_3,如果要让LED1亮,则设置由以上两个图可知,LED1~LED4GPIOGPJ2_0~GPJ2_3,如果要让LED1亮,则设置GPJ2CON[3:0]为输出引脚,设置GPJ2DAT[0]为输出低电平,即可点亮LED1啦,就这么简单^_^。4.2LED4.2.1LED。4.2.2源程序在\210_code\1.led_S\目录下,包含3个文件,start.SMakefile、mktools.c。start.S程序很简单,里面有详细的注释,这里不再句句啰嗦,详细请查看源代码。1.在《S5PV210_UM_REV1.1》搜索GPJ2CON发现,GPJ2CON寄存器的地址为0xE020_0280,GPJ2DAT0xE020_0284。GPJ2CON[3:0]0x10001B,GPJ2_0状态,其他引脚亦是如此,这里仅列举GPJ2CON[0]。3.由LEDLED1LED1,故往GPJ2DAT[0]写入0,即点亮LED1。3.由LEDLED1LED1,故往GPJ2DAT[0]写入0,即点亮LED1。Makefile1.Linuxmake(makeLinux虚拟机已安装了arm-linu叉编译工具,具体的安装方法请阅读《A8开发平台使用,编译一下源文件,先看看编译器做了哪些动作。2简单分析编译过程(1)arm-linux-gccstart.Sstart.o-c编译不,-o跟随输出文件名。(2)arm-linux-ldstart.o0表示程序运行的地址是0,其实程序可以在任何一个地址运行,因置无关码,后面您会看到可以在内存0x20000000地址运行。2简单分析编译过程(1)arm-linux-gccstart.Sstart.o-c编译不,-o跟随输出文件名。(2)arm-linux-ldstart.o0表示程序运行的地址是0,其实程序可以在任何一个地址运行,因置无关码,后面您会看到可以在内存0x20000000地址运行。源代码是位制文件。(4)arm-linux-objdumpELF帮助,-D表示反汇编所有段。(5)SD卡烧写使用的,如果使用u-boot菜单栏或者u-boot命令行来烧写,则可忽略这二句。(6)想知道arm-linux编译工具,所带参数是什么意思,例如想查看令行执行arm-linux-gcc --help即可查看到详细信息。看完编译过程您应该要详细的Makefile语法,可参考网络,限于篇幅,这里就不一一列举啦^_^。mktools.c还记得第三章讲S5PV210启动流程吗?是否还大概还记得0xD0020000~3.3^_^。bin(led.bin)根据三星公司规定的方法生成16个字节的头部信息,使得led.bin变成new_led.bin,如下所示:mktools.c容结合里面的注释,我有理由相信您可以看的懂^_^。在前期用SD卡烧写 机程序到开发板上会起到作用,如果使用自己制作的u-boot菜单栏或者u-boot命令行来烧写 机程序就不需要mktools.c文件了,息led.bin因为u-boot源代码已经完成了生成16byte头部信息的功能。4.2.3A8机实验烧写方法SDMakefileSD令:表示输出文件为new_led.bin,输出文件到/dev/sdb,设备文件在linux下是在/dev/SDLinux,seek=1烧写到扇区1,Linux读写磁盘设备最小是一个扇区。注意:/dev/sdbSD因为u-boot源代码已经完成了生成16byte头部信息的功能。4.2.3A8机实验烧写方法SDMakefileSD令:表示输出文件为new_led.bin,输出文件到/dev/sdb,设备文件在linux下是在/dev/SDLinux,seek=1烧写到扇区1,Linux读写磁盘设备最小是一个扇区。注意:/dev/sdbSDLinux的设备节点为/dev/sdc则Makefile需要修改为/dev/sdc,SDPCLinuxls/dev/sd*命令查看到设备节点的情况烧写步骤:1.make2.SDPC3.直接在Linux虚拟机命令行执行make load即可完成SD卡烧写如下是在红帽虚拟机上执行过程示意:使用u-boot菜单栏烧写(SDBOOT启动方式下)u-boot([root@localhost1.led_S]#ls/dev/sd*/dev/sda /dev/sda1 /dev/sda2/dev/sdb[root@localhost1.led_S]#makeloadddiflag=dsyncoflag=dsyncif=new_led.binof=/dev/sdbseek=132+0recordsin32+0recordsout16384bytes(16kB)copied,0.130677seconds,125kB/sload:dd iflag=dsync oflag=dsyncif=new_led.bin of=/dev/sdbseek=1需要安装好SecureCRT、DNW工具,以及USB驱动,具体安装方法请查阅《A8开发平台使用步骤一:步骤二:需要安装好SecureCRT、DNW工具,以及USB驱动,具体安装方法请查阅《A8开发平台使用步骤一:步骤二:步骤三:步骤三:步骤四:步骤五:步骤四:步骤五:u-boottftp(SDBOOT)下面同样使用图文并茂的方式来说明如何使用tftp命令烧写 机代码到开发板(Linuxtftpu-boottftp(SDBOOT)下面同样使用图文并茂的方式来说明如何使用tftp命令烧写 机代码到开发板(LinuxtftpA8开发平台使用烧写前需要做好的准备的事项有:①开启tftp服务器,使用#service xinetd restart命令;②开发板连接上网线;③serveripLinuxip④将.bin文件放到Linux虚拟机的/tftpboot/tftpboot/led.bin步骤一:步骤二:步骤二:ip令示例:步骤三、四:ip令示例:步骤三、四:IP*/setenvipaddr32setenvserverip31save /*NAND,否则重新上电后不保存*/其他烧写方法提示第二种方法的实现就是使用dnw命令,只不过用菜单栏的形式封装了一下而已^_^,方便读者,nfsxmodem式^_^。以后 机代码烧写,不再详述。其他烧写方法提示第二种方法的实现就是使用dnw命令,只不过用菜单栏的形式封装了一下而已^_^,方便读者,nfsxmodem式^_^。以后 机代码烧写,不再详述。方4.2.4板上的4盏同时被点亮。4.3C4.3.1这小节,我们结合C语言和汇编语言编写一个小程序,实现流水灯。4.3C4.3.1这小节,我们结合C语言和汇编语言编写一个小程序,实现流水灯。4.3.2源程序在\210_code\2.led_flow_water_c\4个文件,start.S、Makefile、mktools.cled.cled.cMakefile、mktools.cstart.S程序很简单,里面有详细的注释,这里不再句句啰嗦,详细请查看源代码。这里需要注意一点,由汇编调用C语言之前需要先设置栈,ldrsp,=0xD0037D80。led.c这就是led.c的主函数,很简单,读者可参考源代码,这里就不啰嗦了。4.3.3板上的4盏轮流被点亮,这就是“神奇”的流水灯,就这么简单,有木led.c这就是led.c的主函数,很简单,读者可参考源代码,这里就不啰嗦了。4.3.3板上的4盏轮流被点亮,这就是“神奇”的流水灯,就这么简单,有木有^_^。4.4LED4.4.1控制LED灯的实验,让大家更进一步的熟GPIOGPIO4.4.2源程序在\210_code\3.polling_key\4.4LED4.4.1控制LED灯的实验,让大家更进一步的熟GPIOGPIO4.4.2源程序在\210_code\3.polling_key\目录下,包含8个文件,:其请参面章节。4.33.polling_keymain.cstart.Sbl数主要做了三件事:main4.33.polling_keymain.cstart.Sbl数主要做了三件事:mainmain.cmain,main第一:初始化按键,key_init(),让按键平时为高电平,当按键被按下时为低电平。亮。第三:检测按键是否被按下,key_check(pin)。具体代码如下:intmain(){key_init(); //按键初始化led_init(); //LEDwhile(1){if(key_check(1))//K1GPJ2DAT|=LED0_OFF;//LED0elseGPJ2DAT&=LED0_ON;//K1LED0if(key_check(2))//K2GPJ2DAT|=LED1_OFF;elseGPJ2DAT&=LED1_ON;//K2LED1if(key_check(3))GPJ2DAT|=LED2_OFF;elseGPJ2DAT&=LED2_ON;if(key_check(4))GPJ2DAT|=LED3_OFF;elseGPJ2DAT&=LED3_ON;if(key_check(5))GPJ2DAT|=LED0_OFF;elseGPJ2DAT&=LED0_ON&LED1_ON;if(key_check(6))GPJ2DAT|=LED1_OFF;elseGPJ2DAT&=LED2_ON&LED3_ON;if(key_check(1))//K1GPJ2DAT|=LED0_OFF;//LED0elseGPJ2DAT&=LED0_ON;//K1LED0if(key_check(2))//K2GPJ2DAT|=LED1_OFF;elseGPJ2DAT&=LED1_ON;//K2LED1if(key_check(3))GPJ2DAT|=LED2_OFF;elseGPJ2DAT&=LED2_ON;if(key_check(4))GPJ2DAT|=LED3_OFF;elseGPJ2DAT&=LED3_ON;if(key_check(5))GPJ2DAT|=LED0_OFF;elseGPJ2DAT&=LED0_ON&LED1_ON;if(key_check(6))GPJ2DAT|=LED1_OFF;elseGPJ2DAT&=LED2_ON&LED3_ON;if(key_check(7))GPJ2DAT|=LED2_OFF;elseled_flash();S7,LEDkey.c1.KEY4.4KEY8使用的是(后面会有中断法的详细介绍key.c1.KEY4.4KEY8使用的是(后面会有中断法的详细介绍GPIOif(key_check(8))GPJ2DAT|=LED3_OFF;elseled_flow_water(); S8,执行流水灯函数}return0;}的电平应该是低电平,松开时为高电平。这里涉及的引脚GPIO是GPH2的低四位GPH3板上有指明。图4.5 8个KEY对应的GPIO引脚连接图法另一种是中断 法。直接法程序的实现简单,但是效率很低~~~~(>_<)~~~~,CPU一直在,的电平应该是低电平,松开时为高电平。这里涉及的引脚GPIO是GPH2的低四位GPH3板上有指明。图4.5 8个KEY对应的GPIO引脚连接图法另一种是中断 法。直接法程序的实现简单,但是效率很低~~~~(>_<)~~~~,CPU一直在,小节,我们先暂时用直接 的方法来实现按键控制LED灯。2key_init()函数GPH2_0_INTPUT/GPH2_1_INTPUT/GPH2_2_INTPUT/GPH2_3_INTPUT定义在key.h头文件中实现,代码如下:的#defineGPH2_0_INTPUT~(0xf<<(0*4))什么意思呢?我们来展开看看,0xf01111b<<0,(b1111b,再取反后,0000b。#defineGPH2_0_INTPUT~(0xf<<(0*4))#defineGPH2_1_INTPUT~(0xf<<(1*4))#defineGPH2_2_INTPUT~(0xf<<(2*4))#defineGPH2_3_INTPUT~(0xf<<(3*4))S5PV210_UM_REV1.1GPH2CONGH2CON[3:0]=0x0,0000B时,GPH2_0引脚为输入状态,正是上面分析的结果。GPH2CONS5PV210_UM_REV1.1GPH2CONGH2CON[3:0]=0x0,0000B时,GPH2_0引脚为输入状态,正是上面分析的结果。GPH2CONkey.h0xE0200C40正是GPH2CON寄存器的地址,先对一个地址强制类型转换为unsigned long*volatile最后取指针,哟^_^。立刻变为低电平,好像说了很多次了哦~_~,这里说明一下,前面章节会讲的比或者跳到后面更深入的章节去学习^_^。3key_check#define GPH2CON (*(volatileunsignedlong*)0xE0200C40)key_check(1)S1这个按键,key_check(8)表示检测S8这个按键等等。该函数最关键的语句是:(tempDat1&(1<<(pin-1)*1))||(tempDat2&(1<<(pin-5)*1)) key_check(1)S1这个按键,key_check(8)表示检测S8这个按键等等。该函数最关键的语句是:(tempDat1&(1<<(pin-1)*1))||(tempDat2&(1<<(pin-5)*1)) GH2DAT&(10),GH2DAT1,0。如果读者还不明白^_^,您说是吧?4.4.3S1LED1S2LED2S3LED3S4LED4S5LED1、LED2S6LED3、LED4S74LEDS8^_^。因为不好拍照,这里就不上图啦,你懂的。4.5蜂鸣器控制实例4.5.1这小节,我们我们最后一个GPIO实验,通过操作GPIO引脚来控制蜂鸣器的响与不响。4.5.2源程序在\210_code\4.beep\目录下,包含5个文件,:其中mktools.c,Makefile,start.S与前面的基本一致,这里不重复讲解,请参考前面章节。图4.6 4.beep目录直观图main.cstart.S图4.6 4.beep目录直观图main.cstart.Sbl数主要做了二件事:mainmain.cmain,main第一:初始化蜂鸣器,先关闭蜂鸣器第二:进入死循环后让蜂鸣器不停的响然后关。beep.c1.蜂鸣器原理图设计4.7蜂鸣器硬件原理图4.8GPIO2.beep_init()函数其中#define GPD0_0_OUT(1<<0)beep.c1.蜂鸣器原理图设计4.7蜂鸣器硬件原理图4.8GPIO2.beep_init()函数其中#define GPD0_0_OUT(1<<0)GPD0CON[30]0x1,0001b,GPDO_0/**/voidbeep_init(){GPD0CON|=GPD0_0_OUT; //蜂鸣器引脚设置为输出状态}3beep_start()函数(beep_stop()函数类似,不再重复)其中#defineBEEP_START (1<<0),由下图可知往GPD0CDAT[0]写入启动蜂鸣器。0,则4.5.3家自己想象一下哈。4.6本章小结本章主要结合硬件软件两方面详细的介绍了3beep_start()函数(beep_stop()函数类似,不再重复)其中#defineBEEP_START (1<<0),由下图可知往GPD0CDAT[0]写入启动蜂鸣器。0,则4.5.3家自己想象一下哈。4.6本章小结本章主要结合硬件软件两方面详细的介绍了S5PV210的GPIO操作,对GPIO的操作是所有硬件操作基础,真的再基础不过了。如果读者能够很好的掌哟^_^。/**/voidbeep_start(){GPD0DAT|=BEEP_START; //开启蜂鸣器}第5章S5PV2105.1S5PV210时钟体系简述一般来讲,MCU的主时钟来源主要是外部晶振或外部时钟,比较常见的是外第5章S5PV2105.1S5PV210时钟体系简述一般来讲,MCU的主时钟来源主要是外部晶振或外部时钟,比较常见的是外(PLL)21024MHzS5PV210(MSYS(DSYS(PSYSSYSCortexA8DRAMFIMDJPEG166MHz;PSYS主要用于IO外设用的,如:GPIO、I2C、WDT、UART133MHz,S5PV210等,最高可达到5.1S5PV210Webee21024MHzPLLS5PV2104PLLAPLL(MSYS、MPLL(DSYS它们之间的关系如图5.2所示:系统时钟。5.2S5PV210时钟的倍数关系了。freq(ARMCLK) =1000MHzfreq(HCLK_MSYS) =200MHz5.2S5PV210时钟的倍数关系了。freq(ARMCLK) =1000MHzfreq(HCLK_MSYS) =200MHzfreq(HCLK_IMEM) =100MHzfreq(PCLK_MSYS) =100MHzfreq(HCLK_DSYS) =166MHzfreq(PCLK_DSYS) =83MHzfreq(HCLK_PSYS) =133MHzfreq(PCLK_PSYS) =66MHzfreq(SCLK_ONENAND) =133MHz,166MHz5.3时钟发生器框图器框图来设置PLL倍频参数,但是由上面~_~5.3时钟发生器框图器框图来设置PLL倍频参数,但是由上面~_~法下面再介绍。5.2系统时钟实例5.2.1的速度比较。5.2.2源程序在\210_code\5.sys_clock\目录下,包含8个文件,:其中mktools.c,Makefile,start.S,led.c与前面的基本一致,这里不重复讲解,请参面章节。5.45.sys_clockmain.cstart.Sbl数主要做了三件事:main5.2.2源程序在\210_code\5.sys_clock\目录下,包含8个文件,:其中mktools.c,Makefile,start.S,led.c与前面的基本一致,这里不重复讲解,请参面章节。5.45.sys_clockmain.cstart.Sbl数主要做了三件事:mainmain.cmain,main第一:初始化LED,让LED初始为关闭状态。第二:配置系统时钟(这是我们本节的重点。第三:调用流水灯死循环程序。main()函数代码如下:intmain(){clock.c讲解sys_clock_init()S5PV210的系统时钟,这是我们本节内容的重中之重。1.系统时钟配置的一般步骤①设置系统锁相环电路(PLL)的锁定时间②PLL③选择时钟源④配置MDIV、PDIV、SDIV的分频系数clock.c讲解sys_clock_init()S5PV210的系统时钟,这是我们本节内容的重中之重。1.系统时钟配置的一般步骤①设置系统锁相环电路(PLL)的锁定时间②PLL③选择时钟源④配置MDIV、PDIV、SDIV的分频系数2.S5PV2102.1APLL5.5APLLled_init(); LED,LED#ifndefCLOCK_INITsys_clock_init(); #endif//CLOK_INITled_flow_water();return0;}Fin=24MHz,PDIV=3,MDIV=125=0x7D,1000MHz,具体运算请参考代码,这里不再详述。2.2MPLL参数的推荐值:Fin=24MHz,PDIV=3,MDIV=125=0x7D,1000MHz,具体运算请参考代码,这里不再详述。2.2MPLL参数的推荐值:5.6MPLLFin=24MHz,PDIV=12,MDIV=667=0x29B,SDIV1FOUT667MHz,具体运算请参考代码,这里不再详述。3.S5PV210①锁定时间需要配置APLL_LOCK、MPLL_LOCK寄存器,为什么需要配置锁定PLL出的频率还不稳定。②xPLLAPLL_CON0、MPLL_CON寄存器。③时钟源的选择需要设置CLK_SRC0寄存器。④时钟分频系需要配置CLK_DIV0寄存器。CLK_DIV0寄存器的配置,其他寄存器的配置请参考代码,代CLK_DIV0结果。图5.7CLK_DIV0从低位开始分析:①MOUT_MSYS=FOUTapll=图5.7CLK_DIV0从低位开始分析:①MOUT_MSYS=FOUTapll=1000MHz而ARMCLK根据经典值为1000,所以/*设置系统时钟分频系数PCLK_PSYS_RATIO=0x1HCLK_PSYS_RATIO=0x4PCLK_DSYS_RATIO=0x1 /|\HCLK_DSYS_RATIO=0x3 |PCLK_MSYS_RATIO=0x1 |HCLK_MSYS_RATIO=0x4 |A2M_RATIO =0x4APLL_RATIO=0x0 低位*/=(0x1<<28)|(0x4<<24)|(0x1<<20)|(0x3<<16)|(0x1<<12)|(0x4<<8)|(0x4<<4)|(0<<0);APLL_RATIO=0;②HCLK_MSYS200MHz,SCLKAPLL1000A2M_RATIO4;③HCLK_MSYS=200MHz,ARMCLK=1000,HCLK_MSYS_RATIO=4;APLL_RATIO=0;②HCLK_MSYS200MHz,SCLKAPLL1000A2M_RATIO4;③HCLK_MSYS=200MHz,ARMCLK=1000,HCLK_MSYS_RATIO=4;④MOUT_DSYSCLKmpll即FOUTmpll=667MHz,HCLK_DSYS166MHz所以,HCLK_DSY_RATIO3;⑤按照5.1节讲的经典值设置可知PCLK_DSYS=166MHz,HCLK_DSYS=83MHz,故PCLK_DSYS_RATIO=1;⑥=667MHz,HCLK_PSYS=133,HCLK_PSYS_RATIO=4;⑦按照5.1节讲的经典值设置可知PCLK_PSYS=66MHz,HCLK_PSYS=133MHz,故PCLK_PSYS_RATIO=1;4.代码分析/*sys_clock_init()函数的总体设置时钟情况如下:ARMCLK=1000MHz,HCLKM=200MHz,HCLKD=166.75MHzHCLKP=133.44MHz,PCLKM=100MHz,PCLKD=83.375MHz,PCLKP=66.7MHz*/voidsys_clock_init(){/*FinPLL*/APLL_LOCK=0xFFFF;MPLL_LOCK=0xFFFF;/*,MDIV0x7d,PDIV0x3,SDIV0x1FOUTapll=MDIV*FIN/(PDIV*2^(SDIV-1))*=0x7d*24/(0x3*2^(0x1-1))*=125*24/(3*2)=1000MHz*/APLL_CON0=(1<<31)|(1<<29)|(0x7d<<16)|(0x3<<8)|(0x1<<0);/**MPLL,MDIV=0x29b,PDIV=0xc,SDIV=0x1*FOUTmpll=MDIV*FIN/(PDIV*2^SDIV)*=0x29b*24/(0xc*2^1)*=667*24/(12*2)=667MHz*/MPLL_CON=(1<<31)|(1<<29)|(0x29b<<16)|(0xc<<8)|(0x1<<0);/**时钟源的设置*ONENAND_SEL=HCLK_DSYS*MUX_PSYS_SEL=SCLKMPLL*MUX_DSYS_SEL=*=0x7d*24/(0x3*2^(0x1-1))*=125*24/(3*2)=1000MHz*/APLL_CON0=(1<<31)|(1<<29)|(0x7d<<16)|(0x3<<8)|(0x1<<0);/**MPLL,MDIV=0x29b,PDIV=0xc,SDIV=0x1*FOUTmpll=MDIV*FIN/(PDIV*2^SDIV)*=0x29b*24/(0xc*2^1)*=667*24/(12*2)=667MHz*/MPLL_CON=(1<<31)|(1<<29)|(0x29b<<16)|(0xc<<8)|(0x1<<0);/**时钟源的设置*ONENAND_SEL=HCLK_DSYS*MUX_PSYS_SEL=SCLKMPLL*MUX_DSYS_SEL=SCLKMPLL/|\*MUX_MSYS_SEL=SCLKAPLL|*VPLL_SEL=FOUTVPLL|*EPLL_SEL=FOUTEPLL|*MPLL_SEL=FOUTMPLL*APLL_SEL=FOUTAPLL低位*/CLK_SRC0=(1<<28)|(1<<12)|(1<<8)|(1<<4)|(1<<0);/**设置系统时钟分频系数*PCLK_PSYS_RATIO=0x15.2.3当没有去掉main.c文件里//#defineCLOCK_INIT的注释时,即有配置系统流水灯的速度是比较快的。main.c//#defineCLOCK_INIT5.2.3当没有去掉main.c文件里//#defineCLOCK_INIT的注释时,即有配置系统流水灯的速度是比较快的。main.c//#defineCLOCK_INITSDu-boot去掉注释后,会发现流水灯的速度比上一次测试慢的明显,本实验就成功了。5.2.4释时,即没有配置系统时钟的情况下,并且在没有u-boot的情况速度慢的明显。水灯的5.3本章小结本章主要讲了S5PV210的系统时钟体系,对系统时钟做了详细的介绍,通过HCLK_PSYS_RATIO=0x4PCLK_DSYS_RATIO=0x1 /|\HCLK_DSYS_RATIO=0x3 |PCLK_MSYS_RATIO=0x1 |HCLK_MSYS_RATIO=0x4 |A2M_RATIO =0x4APLL_RATIO=0x0 低位*/CLK_DIV0=(0x1<<28)|(0x4<<24)|(0x1<<20)|(0x3<<16)|(0x1<<12)|(0x4<<8)|(0x4<<4)|(0<<0);}相当重要的地位,例如串口、定时器等等模块都需要事先掌握系统时钟的设置,可以毫不夸张的说,没有系统时钟,A8什么事也做不了,就成一个强化型51,A8开发来说,对时钟的学习是很有必要滴^_^。第6章S5PV2106.1串口通信原理距离较远时,数据 口按位(bit)和接收字节。串行硬件接口简单,只需要3根线:一是,二是数据同时偶校验位。相当重要的地位,例如串口、定时器等等模块都需要事先掌握系统时钟的设置,可以毫不夸张的说,没有系统时钟,A8什么事也做不了,就成一个强化型51,A8开发来说,对时钟的学习是很有必要滴^_^。第6章S5PV2106.1串口通信原理距离较远时,数据 口按位(bit)和接收字节。串行硬件接口简单,只需要3根线:一是,二是数据同时偶校验位。0TTL/CMOSRS2321(-3~12V0(3~12V6.1UART6.2S5PV210UART6.2.1S5PV210UARTS5PV21040TTL/CMOSRS2321(-3~12V0(3~12V6.1UART6.2S5PV210UART6.2.1S5PV210UARTS5PV2104可以工作于中断或者DMA模式,也就是说UART控制器可以通过发出中断或DMACPUUART2FIFO(缓存区一种是FIFOFIFO0FIFO256bytes,1FIFO64bytes,23FIFO16bytes。CPUFIFOUARTFIFO的数据TxDn“receiveshifter”RxDn位一位接收进来,然后FIFO,CPU数据。UART器和。器中包含一个移位器和一个FIFO中同样包含一个移位器和一个接收FIFO寄存器。UART结构图如图6.2所示:6.2S5PV210UART6.2S5PV210UARTPCLK作为波特率发生器的时钟源输入。6.3UART6.2.2S5PV210UART与接收操作数据操作数据帧的格式是可编程的,它包含一个起始位,5~8(bit)数据位,一位可选择的奇偶校验位和一位或两位停止位。这些可以通过线性控制器器也能够产生中止条件迫使串口输出保持在逻辑0状态,这种状态保持一个传输帧的时间长度。通常在一帧传输数据完整地0的状态将中止信号之后,传送数据连续存放到FIFO中(在不使用FIFO模式下,将被存放到Tx保持寄存器中)数据接收操作与数据(bit)数据位,一位可选择的奇偶校验位和一位或两位停止位。这些可以通过6.2.2S5PV210UART与接收操作数据操作数据帧的格式是可编程的,它包含一个起始位,5~8(bit)数据位,一位可选择的奇偶校验位和一位或两位停止位。这些可以通过线性控制器器也能够产生中止条件迫使串口输出保持在逻辑0状态,这种状态保持一个传输帧的时间长度。通常在一帧传输数据完整地0的状态将中止信号之后,传送数据连续存放到FIFO中(在不使用FIFO模式下,将被存放到Tx保持寄存器中)数据接收操作与数据(bit)数据位,一位可选择的奇偶校验位和一位或两位停止位。这些可以通过帧错误和中止状况,每种情况下都将会产生一个错误标志置位。6.2.3UART波特率计算公式(1波特率计算公式(2PCLK(1例:波特率=115200bps,PCLK=40MHz。DIV_VAL=(40000000/(115200*16))-1=21.7–1=20UBRDIVn=20 DIV_VALDIV_VAL=(SCLK_UART/(bps*16))–1;DIV_VAL=UBRDIVn+(UDIVSLOTn116;DIV_VAL=(PCLK/(bps*16))-1;6.2.4UART①设置所涉及引脚为UART功能②设置波特率、传输格式(如:数据位、停止位、校验位、流控)③UART(/中断/DMA)④等待/接收数据的完成。6.3S5PV210UART6.3.1实验前言6.2.4UART①设置所涉及引脚为UART功能②设置波特率、传输格式(如:数据位、停止位、校验位、流控)③UART(/中断/DMA)④等待/接收数据的完成。6.3S5PV210UART6.3.1实验前言这小节,我们结合210开发板与PC机通过串行通信方式来验证UART的和接收功能。温馨提示:读者可以仿照本节内容自己实现210与其他单片机之前的通信。6.3.2实验讲解UART则(numberof1’sinUDIVSLOTn)/16 =21.7–20=0.7(numberof1’sinUDIVSLOTn)=0.7*16=11.2=11UDIVSLOTn11个1,16’b1110_1110_1110_01016.4UART0/36.5UART0GPIO实验目录概述源程序在\210_code\6.uart\目录下,包含10个文件,:其中mktools.c,Makefile,start.S,led.c,clock.c与前面的基本一致,这里不重复讲解,请参面章节。6.4UART0/36.5UART0GPIO实验目录概述源程序在\210_code\6.uart\目录下,包含10个文件,:其中mktools.c,Makefile,start.S,led.c,clock.c与前面的基本一致,这里不重复讲解,请参面章节。图6.6 6.uart目录直观图main.cstart.Sblmainmain.cmain,main数主要做了四件事:第一:初始化LED,让LED初始为关闭状态。第二:配置系统时钟。第三:初始化UART(这是我们本节的重点。数主要做了四件事:第一:初始化LED,让LED初始为关闭状态。第二:配置系统时钟。第三:初始化UART(这是我们本节的重点。第四:死循环,等待输入字符与相应的输出与控制。main()函数代码如下:uart.cuart.c文件中有三个函数,uart_init(),uart0_sendbyte(unsignedchar)intmain(){unsignedcharc;led_init(); //LEDsys_clock_init(); //系统时钟初始化uart_init(); //串口初始化while(1){c=uart0_getbyte(); //等待键盘输入uart0_sendbyte(c-32); a~zA~Zif((c=='F')||(c=='f'))Ff{led_flash();}}return0;},uart0_getbyte()。1uart_init()函数讲解uart_init()主要做了以下几件事:UART0GPIO/接收功能。第二:设置数据帧格式。第三:选择时钟输入源,设置 接收模式。第四:FIFO第五:无流控。第六:由波特率计算分频系数。,uart0_getbyte()。1uart_init()函数讲解uart_init()主要做了以下几件事:UART0GPIO/接收功能。第二:设置数据帧格式。第三:选择时钟输入源,设

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论