![image.webp]]![4f14d6e4724f9986d4e9f7e12f3a93d1-1.webp]]![image-2.webp]]![[image-4.webp]
1 Makefile语法
目标(target):依赖(dependencies)
规则(command)(编译器需要执行的命令)
***文件符号
$@:目标文件
$^:所有依赖文件
$<:依赖文件的第一个
$?:依赖中所有改变过的文件
app: main.o utils.o
gcc -o $@ $^ # 目标文件$@ = "app", 所有依赖文件$^ = "main.o utils.o" 第一个依赖文件$< = "main.o"
***具体例子
210.bin: start.o key.o
arm-linux-ld -Ttext 0xd0020010 -o key.elf $^
//将所有依赖文件链接为key.elf,并指定代码段的链接地址为0xd0020010
arm-linux-objcopy -O binary key.elf key.bin
//将key.elf转为key.bin文件
arm-linux-objdump -D key.elf > key.dis
//将可执行文件.elf反汇编为.dis汇编代码
arm-linux-ld -Ttext 0xd0020010 -o key.elf $^
链接所有依赖文件,并将合并后的代码段起始地址设为0xd0020010,将链接结果保存为key.elf(.elfwenjian )
arm-linux-ld
:ARM平台的链接器,负责合并目标文件并分配内存地址
-Ttext 0xd0020010:指定整个代码段的链接地址(即运行时地址)
arm-linux-objcopy -O binary key.elf key.bin
将key.elf文件转为key.bin文件
arm-linux-objdump -D key.elf > key.dis
将可执行文件.elf反编译为人类看得懂的.dis汇编代码
key.o: key.c
arm-linux-gcc -nostdlib -c $< -o $@
//将key.c通过交叉编译为key.o目标文件
arm-linux-gcc:ARM平台的交叉编译器,专门为linux嵌入式设计
-nostdlib:禁止链接标准库,使用于裸机程序
-c:仅执行预处理.i,编译.s ,汇编.o, 不进行链接,生成目标文件.o但不是可执行文件
-o $@:指定为目标文件的名字
start.o:start.S
arm-linux-gcc -nostdlib -c $< -o $@
//将start.S交叉编译生成start.o文件
clean:
rm *.o *.elf *.bin *.dis
//清除编译过程中生成的所有中间文件和输出文件
%.o : %.c
arm-linux-gcc -c $< -o $@ -nostdlib
//将所有以.c结尾的依赖文件文件交叉编译为.o目标文件 禁止链接标准库
2 三个问题挑一个
(1)系统时钟配置流程(p89页)
锁定 PMS,选源分频
- 设置xPLL锁定值,对应
xPLL_LOCK
寄存器 - 设置xPLL的PMS值,并使能xPLL,对应寄存器是xPLL_CON
- 等待PLL锁定(即xPLL输出稳定的频率),对应寄存器xPLL_CON,读取其LOCKED位来判断
- 配置系统时钟源,选择 xPLL 作为时钟源(之前是由外部晶振提供),CLK_SRCO;
- 配置其他模块的时钟源,对应寄存器CLK_SRC1~CLK_SRC6
- 配置系统时钟分频值,对应寄存器CLK_DIVO
- 配置其他模块的时钟分频值,CLK_DIV1~CLK_DIV7
(2)s5pv210的外部介质的启动流程(p53页)
- S5PV210上电后执行iROM中的固化代码,即BL0
- iROM继续执行加载Bootloader到片内SRAM,即BL1,并跳到BL1中执行。
- 执行BL1加载Bootloader剩余部分到SRAM中,即BL2,并跳到BL2中执行。
- 执行BL2初始化DRAM控制器,并加载OS到SDRAM。
- 跳转到OS起始地址处执行
(3)dnw下载的软硬件流程
- 安装USB驱动
将实验箱中的拨码开关 2 拨到 on,长按 Power 键直至电脑提示安装驱动。打开设备管理器,右键外部设备更新驱动程序,手动添加USB驱动程序路径。在驱动安装过程中,将拨码开关 2 重新置为OFF 状态,然后关闭开发板的电源, 等待驱动安装完毕。
- USB device线连接电脑和开发板,设置开发板为 nandflash 启动(拨码开关全部拨 至OFF状态)。
- 打开DNW.exe。设置串口:波特率 为 115200, USB Port 为 Download,Address 为 0xd0020010。
- 菜单栏开启 DNW 串口连接(Serial Port ->Connect)。启动开发板后立即在 DNW 窗口迅速敲击空格键进入 Uboot 状态。
- DNW 窗口中输入“dnw 0xd0020010”设置下载地址
- DNW 菜单中,选择 usbport->Transmit->Transmit 发送生成的 210.bin 文件,DNW 自动下载 210.bin 文件至开发板。
- 在DNW 输入“go 0xd0020010”,开始运行210.bin 程序。
3.1 引脚赋值
3.2 AD填空写代码
![image.png]]
![image-3.png]]
![image-6.png]]
对寄存器进行赋值,完成某个任务 送分题
TSADCCON是ADC控制寄存器
TSCON是触摸屏控制寄存器
TSDATX,TSDATY分别是X,Y坐标
代码:
![image-4.png]]
![image-5.png]]
注意:
1.PCLK / (分频系数+1)次才是3.3M
2.启动一次AD转换一定是0号位,此时1号位就不能enable,所以在设置0号位=1后需要轮询等待1号位清零。
3.需要轮询等待AD转换完成,这里看ECFLG while(!(tsADCcon & (1<<15)))
3.3 串口的波特率计算
UBRDIV = (PCLK/(16×bps))-1
UDIVSLOT = (所有小数部分)✖16
最后都是整数,向下取整
![image-12.png]]
3.4 PCLK初始化
![image-7.png]]
![image-8.png]]
![image-10.png]]
![image-11.png]]
重点必背
3.5 串口操作的应用
初始化:
1.通过GPA0_0和GPA0_1设置UART的接收和发送功能
2.设置时钟源和UART工作方式【使用UCON】
3.设置波特率(UBRDIV = (PCLK/(16*bps))-1,UDIVSOLTE = F(小数部分✖16))
4.设置数据传输格式ULCON
5.UFIFO模式=0
功能层:
6.发送和接收的数据分别放在UTXH和URXH 状态存放在USTRSTAT
3.6 定时器和中断应用
定时器初始化:
1.设置预分频系数TCFG0(time0单独一个占8位),TCFG1分频值(每个定时器四位,都在TCFG1里设置)
2.设置定时器功能 TCON(每个定时器都在里面,看对应引脚设置)打开、手动更新、反转、自动更新
3.设置计数值和占空比 TCNTBx = 63162,TCMPBx(每一个定时器都分别有一个x=0,1,2,3,4)
4.手动更新位置1 再置0
中断控制器初始化:
1.设置中断类型 VIC0INTSELECT 0是IRQ模式 (每个中断占一位)
2.清中断地址 VIC0ADDRESS = 0
3.设置中断程序地址 VIC0VECTADDRx(x=0,1,2,3)
4.使能中断VIC0INTENABLE
5.可能有定时器使能中断 TINT_CSTAT (0-4位)
清中断位:
1.VIC0ADDRESS = 0
2.定时器清中断还在TINT_CSTAT(5-9位)
3.EXT_INT_PEND
按键中断时需要的按键初始化:
1.设置按键_CON为中断模式GPH0CON
2.设置外部中断(上升沿或者下降沿)EXT_INT_0_CON
3.EXT_INT_MASK 取消屏蔽(设置为0位)
读取中断状况用VIC0IRQSTATUS
常用引脚功能
TCON
![image-13.png]]
GPH0CON 可对应外部中断
![image-14.png]]
EXT_INT_0_CON
![image-16.png]]
GPD0CON 可对应定时器输出的TOUT
![image-17.png]]
TCFG0
![image-18.png]]
TCFG1
![image-19.png]]