嵌入式.docx
《嵌入式.docx》由会员分享,可在线阅读,更多相关《嵌入式.docx(36页珍藏版)》请在冰点文库上搜索。
嵌入式
175705253
嵌入式课程安排:
ARM体系结构编程10
Linux系统移植5
Linux驱动开发15
项目开发5
智能车5
智能家居7
嵌入式是什么?
计算机:
通用计算机
嵌入式计算机
嵌入式产品特点:
1)专用性,专用的计算机
2)运行环境差异打
3)比通用PC计算机资源少
4)功耗低,体积小,集成度高,成本低
5)具有较长的生命周期
能做什么:
形态各异的嵌入式产品,消费类、医疗、交通、工业控制、军工
怎么做:
1.PC
2.不固定,嵌入式硬件平台
硬件平台TPAD-CW210
核心板
底板(扩展板)
CPU
三星S5pv210
Datasheet(数据手册):
S5PV210_UM_REV1.1.pdf
嵌入式:
应用为中心
计算机技术为基础
软硬件可裁剪
适用应用系统对功能、可靠性、成本、体积及功耗有严格要求的专用计算机系统
发展方向:
应用级开发
系统开发(移植操作系统、移植硬件驱动)
TPAD核心板
S5pv2101G
核心ARM架构cortex-A8
ARM7ARM9ARM10ARM11
Cortex-A
Cortex-M
Cortex-R
8颗内存1G
NandFlash闪存
TPAD底板:
拨码开关(四个):
决定CPU从什么设备上获得启动程序
四种启动方式:
NandFlash(发布阶段)
SD卡(发布阶段)
USB(开发阶段)
UART(串口)(开发阶段)
开发模式:
主机PC___程_序___目标板(TPAD)
四种传输模式:
USB(发送----接收)
UART(发送-----接收)
网络(发送-----接收)
JTAG口(发送)
为TPAD搭建一个运行环境
向NandFlash烧写一个程序(称之为引导程序(Bootloader)或启动程序)u-boot.bin
板子上电,最先执行的是s5pv210内部的irom中的固化程序代码
准备工作:
1.把TPAD连接线接好
USB线,一头接PC,一头接TPADOTG口
电源线
网线,一头接PC,一头接TPAD的网口
UART,一头接PC,一头接TPAD的com1口
2.设置拨码开关,设置成USB启动
1->ON
2->OFF
3->OFF
4->ON
原理:
向NandFlash烧写引导程序(Bootloader)u-boot.bin
烧写在NandFlash的0地址
此程序能够为运行裸板程序创建运行环境
从PC-TPAD传输启动程序,usb:
PC:
DNW(负责发送程序)
TPAD:
irom(接收程序)
(irom,只读存储器,irom中的固化代码程序真正的接收发送过来的程序,irom中固化代码功能参考datasheet中关于irom的说明)
一旦运行irom,USB和UART都会被初始化
1.开启TPAD电源
2.在PC机运行DNW软件,tools目录下
3.配置DNW软件
1)configure->option
配置串口的波特率115200
配置使用的串口号com1(无物理串口,需要用USB转串口(9针公口)线,安装驱动,根据PC机设备管理器->硬件->端口内的虚拟串口号设置串口号)
2)SerialPort->Connect
dnw标题有变化:
COM1,11520bps
4.PC机弹出“发现USB的新硬件”对话框,要求安装驱动,如果不弹出安装驱动界面,长按拨码开关旁边的白色按键1秒,直到出现对话框
安装tools/usbdrive中驱动
安装完成后PC机设备管理器->硬件->通用串行总线控制器中会出现x210,说明安装成功
5.使用DNW通过usb向TPAD发送程序x210_usb.bin
a)在configure->option中配置下载地址为0xd0020010
b)UsbPort->transmit选择tools->binaryfile->x210_usb.bin
IROM中的程序会接收
自动调用x210_usb.bin
DNW标题条:
6.使用DNW通过USB发送u-boot.bin
1)configure->option中配置下载地址为0x23e00000
2)UsbPort->transmit选择tools->binaryfile->u-boot.bin
此步注意:
一旦选择完成假如成功会出现打印信息,立马按空格键,时间很短
此步成功界面会有tarena#
7.将已有的u-boot.bin写入闪存(Flash)
1)在tarena#后面输入dnw20008000
界面出现以下信息
OTGcableConnected!
Now,WaitingforDNWtotransmitdata
2)USBPort->transmit选择tools->binaryfile->u-boot.bin
界面出现:
DownloadDone!
!
DownloadAddress:
0x20008000,Download
Checksumisbeingcalculated.
ChecksumO.K.
3)nanderase0x00x100000
界面出现:
NANDerase:
device0offset0x0,size0x100000
Erasingat0x0--12complete.
Erasingat0x20000--25lete.
Erasingat0x40000--37lete.
Erasingat0x60000--50lete.
Erasingat0x80000--62lete.
Erasingat0xa0000--75lete.
Erasingat0xc0000--87lete.
Erasingat0xe0000--100lete.
OK
4)nandwrite0x200080000x00x100000
界面出现:
…..
1048576byteswritten:
OK
8.断电
9.调整拨码开关(NandFlash启动)
1->on
2->off
3->off
4->off
10.重新打开电源(没反应的话按白色键)
界面出现以下信息:
#####JFJKJBIOSforJFJ210#####
ThisBoard:
SDRAMis1024MB;LCDdisplaysizeis:
800X480
showlogo
Hitanykeytostopautoboot:
0
Unknowncommand'menu'-try'help'
敲击“空格”,进入u-boot.bin的shell下:
tarena#
至此我们的运行环境已经建好
0xd0020010x210_usb.bin
0x23e00000u-boot.bin
0x20008000u-boot.bin
这几个地址都是内存地址
0xd0020010CPU内部的SRAMIRAM
0x23e000000x20008000都是外接内存DDRII的地址(s5pv210只能寻址1.5G的外接内存)
RAM随机存储器,掉电丢失:
SRAM:
静态RAM,接通电源以后就能用,不需要动态刷新,SRAM访问速度快,容量小,价格高
DRAM:
动态RAM
接通电源后,需要初始化
u-boot.bin引导程序bootloader
1.初始化硬件设备,软化环境
2.shell功能
3.启动内核
Nanderase擦除命令
nanderase起始地址size如nanderase0x00x10000
Nandwrite写命令
nandwrite写入来源地址写入的地址size如nandwrite200080000x0100000
安装交叉编译器
基于X86平台编译器:
Gcc
Nm
Readelf
Objdump
Strip
基于ARM平台:
VMware->settings->options->share->folder->add->)路径
Cd/mnt/hgfs/arm
Cd/opt
Sudotarjxf/mnt/hgfs/arm/arm-gcc-complier/arm-2009q3.tar.sz2
Cd/home/tarena
Vi.bashrc
PATH=/opt/arm-2009q3/bin:
$PATH:
.
Arm-linux-gcc–v查看是否OKOK的话可以看到版本号4.4.1的gcc编译器
ELF32位小端格式文件(必须有操作系统的情况下,才能执行),执行硬件平台是intel80386,linux操作系统,动态链接,使用了动态库
Arm-linux-gcc–otext-armtest.c
ELF32
ELF32
GPIO管脚:
是CPU对外设的接口中最简单的一种接口,通用的IO口,通用的输入输出接口
优点:
通过对通用的IO口直接设置就可产生高低电平
S5PV210共有237个多功能的输入输出管脚,142个内存接口管脚,同名分为34个通用组IO口,2个内存接口
通过原理图Q1给高电平
Q1接到CPU的GPC1_3管脚
GPC1_3管脚就是CPU中的GPIO管脚
CPU的管脚绝大多数都是复用功能
如何使得GPC1_3管脚产生高低电平:
CPU内部有GPIO控制器,按照对应GPIO管脚的特殊功能寄存器(SFR)的设置去控制GPIO管脚。
寄存器:
控制寄存器:
配置GPIO管脚的功能
数据寄存器:
对应管脚具体的高低电平
输出时:
1高电平
0低电平
输入时:
2高电平
1低电平
上下拉电阻寄存器:
s5pv210集成了上下拉电阻寄存器
GPC1CON[3]设置(12-15位):
0000输入功能
0001输出功能
0010复用音频功能
0011保留
0100复用音频功能
0101-1110保留
1111中断功能
GPC1DAT[0-4]设置:
每个bit位对应一个管脚的数据状态,GPC1_3对应bit3,将bit3设置成1,即可输出高电平,设置成0输出第电平
总结:
s5pv210处理器控制GPC1_3管脚输出高电平或者低电平,具体步骤如下:
GPC1_3Tarena板子
1.配置GPC1_3管脚功能为输出口
GPC1CON0xE0200080
[15:
12]0001(二进制)
2.禁止GPC1_3管脚的内部上下拉电阻
GPC1PUD0xE0200088[7:
6]为00(二进制)
3.通过数据寄存器的相应位来控制对应的关键输出高低电平
GPC1DAT0xE00200084
[3]为1,高电平(二进制)
[3]为1,低电平(二进制)
1.写完C程序,编译成裸板程序:
arm-linux-gcc-march=armv5te-nostdlib-c-oled.oled_c.c
-march指定生成指令的架构(armv5te指定的指令集)
-nostdlib指定不使用标准库
2.将.o连接成ELF格式的可执行文件:
arm-linux-ld-nostartfiles-nostdlib-eled_main-Ttext=0x20008000-oledled.o
-nostartfiles不链接启动文件
-nostdlib不链接标准库
-e指定程序的入口点
-Ttext指定代码段的链接地址,代码运行时需要下载到链接地址运行,注:
u-boot.bin需要下载到0x23e00000,就是u-boot.bin文件在链接时指定了链接地址为0x23e00000
3.将ELF格式的led可执行程序,转换为在裸板上能运行的二进制纯数据,无ELF格式信息
arm-linux-objcopy-Obinaryledled.bin
CPU对各种功能部件的管理、控制、监视是采用特殊功能寄存器(SFRspecialfuctionregister)的集中控制方法
S5PV210的GPIO包含两部分:
alive-apart,off-apart
alive-apart部分在SleepMode是可以有电源提供的,其寄存器的值可以保持
#led.o:
led_c.c
#$(CC)$(CCFLAGS)-c-oled.oled.c
%.o:
%.c
$(CC)$(CCFLAGS)-c-o$@$<
%跟*一样通配符
$@:
表示所有的目标文件
$<:
表示所有源文件
UART
UART(Universalasychronousrecieverandtransmiter):
通用串行异步收发器
数据通信方式:
串行通信:
利用一条数据线将数据一位一位的顺序传送,特点:
通信线路简单,成本低,适用于远距离通信
串行通信按照传输方向分为:
单工,任何时候数据只能朝一个方向传输
半双工,数据可以向两个方向传输,但任何同一时刻只能朝一个方向传输
全双工,数据可以在任何时刻两个方向互传
并行通信:
利用多条数据线将数据的各位同时传送,特点传输速度快,适用于短距离通信
异步:
在一个字符的传输时间范围内保持同步
同步:
在数据传输过程中需要一根时钟线同步如IIC总线、SPI总线,时刻保持数据收发同步
串口通信协议:
起始位:
发出一个逻辑0(通常是一个低电平作为起始位)
数据位:
有效的传输数据,5-8个bit位,表示一个字符(不同于C语言中的字符)
奇偶校验位:
在数据位后面加上一位校验位
奇校验:
保证1的个数为奇数(加上校验位后1的总个数为奇数)
111000110
偶校验:
保证1的个数为偶数
111000111
发送方接受方
111000111动态计算一下得出是否与校验位的值一样,一样则接收正确,否则接收错误
无校验位:
不占位
恒1:
占位
恒0:
占位
停止位:
表示一个字符数据结束的标志,可以是1位也可以是两位
空闲位:
处于逻辑1的状态,表示当前线路上没有数据传送
波特率:
非常重要的参数,用来衡量数据传送的速率,表示每秒传送的二进制位数
RS-232串口标准采用EIA电平,规定:
'1'的逻辑电平在-3~-15V之间,'0'的逻辑电平在+3~+15V之间
TTL电平规定:
'1'的逻辑电平+2~+5V,'0'的逻辑电平0~+0.8V
通常在两者之间会有一个TTL电平到EIA电平的转换芯片:
TPAD发送数据:
TTL->EIA
TPAD接受数据:
EIA->TTL
直通串口线:
COM1,因为设计原理图时,已经完成交叉的功能
交叉串口线:
COM2
每个UART控制器包括四个部分:
发送器、接收器、波特率发生器、控制单元
UART控制器内部结构图:
1.发送器->TXD0发送的复用的GPIO管脚GPA0_1
1)发送缓冲寄存器,用于存放CPU将发送的数据,大小:
1字节(非FIFO模式)/256字节(ch1FIFO模式,每个UART的FIFO模式下大小不一样)
2)发送移位器(移位寄存器),发送缓冲寄存器中的数据并不是直接送到输出引脚上,必须先送到发送移位寄存器,然后再由移位器送到发送引脚,此步操作由硬件完成,编程人员只需要把数据写入缓冲寄存器
2.接收器<-RXD0接收的复用GPIO管脚GPA0_0
1)接受缓冲寄存器:
用于存放从外接收来的数据,大小:
1字节(非FIFO模式)/256字节(ch1FIFO模式,每个UART的FIFO模式下大小不一样)
2)接收移位寄存器:
从接收引脚RXD0上接收来数据先存放在移位寄存器中,当收满一个字节之后,再放到接收缓存寄存器中,此步操作也是由硬件完成,编程人员只需要从缓冲寄存器中读取数据
3.波特率产生器
发送移位寄存器和接收移位寄存器对数据的发送和接收都是按照波特率产生器产生的波特率速度进行接收和发送,波特率的产生需要在时钟源的控制下进行,每个UART控制器都有独立的时钟
时钟有PCLK内部系统时钟和SCLK_UART外部时钟
GPA0CONAddress=0xE0200000
[0]/[1]分别设置为0010
ULCON0寄存器用来设置数据格式Address=0xE2900000设置为3
UCON0Address=0xE2900004
设置为5
PCLK:
66.5MHZ
UTXH0发送缓冲寄存器Address=0xE2900020
URXH0接收缓存寄存器Address=0xE2900024
UTRSTAT0
Address=0xE2900010
UBRDIV0Address=0xE2900028
设置值为35(前提115200bps,PCLK:
66.5MHZ)
UDIVSLOT0Address=0xE290002C设置值为0x0080(前提115200bps,PCLK:
66.5MHZ)
UFCON0Address=0xE2900008
UMCON0Address=0xE290000C
程序:
发送字符功能的程序
TPAD发送
PC接收
PC机显示出来
1.配置函数:
1)GPIO管脚设置成收、发模式
2)禁止上下拉电阻
3)配置初始化串口
2.发送字符函数
Uart0_putc
查询状态寄存器bit1,如果是1,表示往发送寄存器写入(8bit);如果是0,等待
3.接受字符函数
Uart0_getc
查询状态寄存器bit0,如果是1,读取接收寄存器;如果是0,等待
nandflash的使用
存储器的分类:
1.按存储介质分类:
半导体、磁带和磁盘、光盘
2.按存取方式分类:
随机访问、顺序访问
3.按信息的可保存持久性分类:
易失性(断电后内容丢失RAM)、非易失性(断电后内容不丢失ROMFlash)
4.按存储器在计算机系统中所起的作用分类:
主存储器、辅助存储器、高速缓冲存储器
1.什么是NandFlash
存储设备,用来存储整个系统,相当于PC中的硬盘
2.TPAD中采用了什么NandFlash
三星的k9k8g08u08
3.如何才能操作NandFlash
对它进行读写操作,校验操作,需要阅读NandFlash的datasheet
4.NandFlash的主要指标参数
工作电压3.3V
容量(1G主存储区+32Moob区)*8bit
读写操作按页(2K+64)*8bit
擦除操作:
按块(128K+4K)*8bit1块=64页
命令、地址、数据复用8个IO口
可以对存储块进行写、擦除锁定
可以100K次的写、擦除(并且可以提供1bit/528byteECC校验)
数据可以保存10年
使用命令操作NandFlash
存在唯一的ID号
引脚封装信息
特性:
1.没写数据之前里面都是1
2.写数据的时候,把1改成0,不能把0改成1
3.已经写过数据再写数据前需要先擦除
Nanderase0100000
Nandwrite200080000100000
4.存在位翻转(位交换)
5.出厂时可能存在坏块
6.擦写次数有限制
由程序员直接操作的信号:
nCE片选信号
由硬件(NandFlash控制器)自动产生的信号:
IO0-IO7、ALE、CLE、nRE、Nwe、R/nB
主存储区1G
Spell区存储坏块、校验值等附加信息32M
读、写大小单元:
一页2K
擦除大小单元:
一块64页即128K
word32bit
half-word16bit
bytes8bit
指令集:
CPU依靠指令来计算和控制系统,每款CPU在设计时就规定类一系列与硬件电路相配和的指令系统。
最为主流体系结构来讲,指令集分为:
复杂指令集和精简指令集
精简指令集(RISC):
1)简单、指令的功能单一,单周期执行
2)指令定长(32位ARM指令集、16位Thumb指令集),同等代码长度下比复杂指令集密度低
3)所有数据运算都是在CPU的寄存器里面完成,速度快,因此ARM中寄存器比X86中寄存器多
4)专门拿出一类指令访问存储器
复杂指令集(CISC):
如X86
1)指令不定长,8位、16位、24位、32位
2)代码密集度比精简指令集高
ARM编程模型:
1.工作模式:
管理SVC:
复位、SWI指令
快速中断:
发生高优先中断
中断:
低优先级中断
中止:
访问存储器非法情况
未定义:
执行指令时,不能识别
系统:
权限高
用户:
权限受限
2.工作模式分类:
权限:
特权模式,除用户模式的其余6种模式
非特权模式:
用户模式
异常/非异常:
异常模式:
除系统和用户模式外的5种模式
非异常模式:
用户模式和系统模式
3.状态之间切换:
ARM状态:
执行ARM指令,PC字对齐,最后两个bit为00
Tthumb状态:
执行Thumb指令,PC半字对齐,最后一个bit为0
切换方式:
指令切换:
BX
处理器自动切换:
发生异常时自动进入对应模式
用指令切换:
1.特权模式之间可以随意切换
2.可以从特权模式切换到用户模式
3.不能从用户模式切换到特权模式
4.如果想从用户模式切换到特权模式可以用SWI指令
ARM寄存器:
R0-R15CPSRSPSR等所有的寄存器对于软件来说都是没有地址的
C语言中寄存器变量:
比普通变量快,正使用寄存器的变量数量有限,寄存器变量不能取地址
R13SP栈顶指针寄存器,存放的是内存的地址,栈是内存的一个区域
R14是返回地址地址寄存器
R15存放的是取指指令的地址
各种模式可以有自己的栈,但用户模式和系统模式共用一个栈,因为栈顶指针寄存器共用,其他异常模式可以有自己的栈
SPSR有5个,用户和系统模式没有
ARM里面外部中断有两种:
IRQ和FIQ,快速中断指对事件的响应速度快,体现在1)FIQ模式的优先级高于IRQ优先级,2)FIQ模式自己专有的寄存器比IRQ要多,3)在异常向量表中,FIQ入口在最高地址,FIQ异常处理程序可以直接顺序的存放在异常向量表里,可以不用跳转指令。
B指令4个字节32位
高8位,B指令及条件标志
低24位,放的是偏移量,表示的范围,如果是无符号则16M,有符号+/-8M
有符号的情况下:
因此24位中一位代表符号位,另23位表示偏移量
PC值的特点,在ARM状态下,执行ARM指令时,PC值的最后两位永远是00,默认就不用保存,即不占24位中的位置,那么相当于扩大了2位的范围,2位即4倍,所以范围是8M*4=32M
执行BL指令时,硬件会自动将bl指令的下一条指令的地址赋值给lr寄存器,跳转到子函数执行时,返回时将lr中指令地址赋值给PC
相对跳转是动态跳转,只有程序运行起来后才知道跳转到哪里(在编译和链接过程中都只是计算跳转的偏移量),B、BL指令都是相对跳转,位置无关码
BX寄存器r
r[0