LCD实验学习笔记(二):head.S
ARM加电后从0地址开始取指执行。
连接为bin文件时时,连接脚本lcd.lds指定将head.o放在开头,所以head.S就是系统起步的地方。
head.S开头就是异常向量定义,0地址就是reset中断。
发生不同的异常,系统跳转到相应函数处理。
系统启动时就进入reset函数进行初始化,并将程序复制到SDRAM,然后跳到SDRAM继续执行。
.extern main @表示全局查找外部文件中的main函数
.text
.global _start
_start:
b Reset @0地址,b指令直接跳转到Reset函数地址执行。b指令相当于mov pc,=Reset。bl是调用子程序指令,相当于ldr r14,pc 然后调用子程序,子程序返回时,再mov r14,pc
HandleUndef:
b HandleUndef @ 0x04: 未定义指令中止模式的向量地址
HandleSWI:
b HandleSWI @ 0x08: 管理模式的向量地址,通过SWI指令进入此模式
HandlePrefetchAbort:
b HandlePrefetchAbort @ 0x0c: 指令预取终止导致的异常的向量地址
HandleDataAbort:
b HandleDataAbort @ 0x10: 数据访问终止导致的异常的向量地址
HandleNotUsed:
b HandleNotUsed @ 0x14: 保留
HandleIRQ:
b HandleIRQ @ 0x18: 中断模式的向量地址
HandleFIQ:
b HandleFIQ @ 0x1c: 快中断模式的向量地址
Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
bl clock_init @ 设置MPLL,改变FCLK、HCLK、PCLK
bl memsetup @ 设置存储控制器以使用SDRAM
bl nand_init @ 初始化NAND Flash
@ 复制代码到SDRAM中
ldr r0, =0x30000000 @ 调用CopyCode2SDRAM函数前,设置调用参数。参数1 目标地址 = 0x30000000,这是SDRAM的起始地址
mov r1, #4096 @ 第二个参数 源地址 = 4096。lcd.lds连接脚本中规定了.text段的地址号从0x30000000开始,放在了bin文件的4096开始的位置
mov r2, #16*1024 @ 第三个参数 复制长度 = 16K,因为本实验程序代码长度不会超过16K
bl CopyCode2SDRAM @ 调用C函数CopyCode2SDRAM
bl clean_bss @ 清除bss段,未初始化或初值为0的全局/静态变量保存在bss段
msr cpsr_c, #0xd2 @ 进入中断模式
ldr sp, =0x31000000 @ 设置中断模式栈指针
msr cpsr_c, #0xdf @ 进入系统模式
ldr sp, =0x34000000 @ 设置系统模式栈指针,
ldr lr, =ret_initirq @ 设置返回地址 ,中断初始化函数执行完后,进行开中断、调用main函数
ldr pc, =init_irq @ 调用中断初始化函数
ret_initirq:
msr cpsr_c, #0x5f @ 设置I-bit=0,开IRQ中断
ldr lr, =halt_loop @ 设置返回地址
ldr pc, =main @ 调用main函数
halt_loop:
b halt_loop
HandleIRQ: @中断向量指向的中断处理函数。首先保存现场,然后调用c写的中断分发函数,完成后,恢复现场
sub lr, lr, #4 @ 计算返回地址,当前lr-4
stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器到中断栈
ldr lr, =int_return @ 设置调用IRQ_Handle函数后的返回地址
ldr pc, =IRQ_Handle @ 调用中断分发函数,在interrupt.c中
int_return:
ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr。pc值恢复为中断前的lr值,所以继续原程序执行
LCD实验学习笔记(二):head.S的更多相关文章
- LCD实验学习笔记(十):TFT LCD
硬件组成: REGBANK是LCD控制寄存器组,含17个寄存器及一块256*16的调色板,用来设置参数. LCDCDMA中有两个FIFO,当FIFO空或数据减少到阈值,自动发起DMA传输,从内存获取图 ...
- LCD实验学习笔记(一):Makefile
主Makefile总领全局的就这句—— lcd.bin: $(objs) 要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o seri ...
- LCD实验学习笔记(九):UART
s3c2440包含三个通用异步收发器,可工作于中断模式或DMA模式.每个UART包含两个64字节的FIFOs用于接收和发送数据.可编程设置波特率.1或2个停止位,5/6/7/8个数据位和奇偶校验状态. ...
- LCD实验学习笔记(八):中断
s3c2440有60个中断源(其中15个为子中断源). 31个32位的通用寄存器,6个程序状态寄存器.有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式 ...
- LCD实验学习笔记(七):NAND FLASH
s3c2440 CPU内置NAND FLASH控制器.相关寄存大器起始地址为0x4e000000. 通过设置NFCONF寄存器,设置NAND FLASH 时序. 通过设置NFCONT寄存器,使能NAN ...
- LCD实验学习笔记(六):存储控制器
s3c2440可使用地址空间为1GB(0x00000000到0x40000000). 1G空间分为8个BANK,每个BANK为128MB. 设27条地址线,和8个片选引脚(nGCS0-nGCS7). ...
- LCD实验学习笔记(五):MMU
内存管理分别页表机制和内存分配机制两块. 页表机制就是管理设备真实物理地址与虚拟地址的动态或静态的映射,基于cpu内部的mmu(内存管理单元)进行. CP15(协处理器)的C0(缓存)是一级页表,含4 ...
- LCD实验学习笔记(四):系统时钟
一般CPU频率(FCLK)高于内存.网卡等设备频率(HCLK),而串口.USB.I2C等设备频率(PCLK)更低. 系统时钟: 系统时钟源为晶振,初始频率12MHz. 通过设置MPLLCON寄存器的M ...
- LCD实验学习笔记(三):WATCH DOG
看门狗是为了能够防止程序跑飞用的.程序应该定时的去喂狗.如果程序跑飞了,那么就不会去喂狗了.如果超过了喂狗的时间,那么狗就会生成一个信号来reset CPU.一般程序不需要,特殊情况下需要这种机制. ...
随机推荐
- springmvc基础篇—使用注解方式为前台提供数据
一.新建一个Controller package cn.cfs.springmvc.service; import java.util.ArrayList; import java.util.Hash ...
- safari 移动下开启 滚定回弹
-webkit-overflow-scrolling : touch;
- Qt 解析网络数据出现ssl错误
最近写了点小东西,哈哈, 网络部分是同学帮我搞的 在编译的时候,出现了一下错误 qt.network.ssl: QSslSocket: cannot call unresolved function ...
- Qt 蓝牙部分翻译
这是我第一次尝试翻译技术文档,自己英语太烂,一直不敢尝试,感谢生活,让我勇敢迈出这第一步. 大部分都是直译,如有不妥,还请制导. Qt Bluetooth The Bluetooth API prov ...
- 怎样安装Python3
在浏览器地址栏输入https://www.python.org/ 打开Python官网 好了,安装完成了! 可以把安装路径C:\Users\Administrator\AppData\Local\Pr ...
- 孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块
孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块 (完整学习过程屏幕记录视频地址在文末) 从今天起开始正式学习Python的爬虫. 今天已经初步了解了两个主要的模块: ...
- C++STL——list
一.相关定义 list 链表,分配的内存不连续 可以高效地进行插入/删除元素 不可随机访问,访问速度慢 特征 只能通过迭代器来访问list中的元素 在头和尾都可以插入元素 二.list [前提条件] ...
- python 生成csv乱码问题解决方法
需求背景 最近为公司开发了一套邮件日报程序,邮件一般就是表格,图片,然后就是附件.附件一般都是默认写到txt文件里,但是PM希望邮件里的附件能直接用Excel这种软件打开,最开始想保存为Excel,但 ...
- POI实现excel的数据验证
目录 前言 难点1:合并单元格 代码实现策略: step 1: 合并单元格 step 2: 给单元格赋值 难点2:数据验证-下拉框 代码实现策略: step 1:设置需要进行数据验证的单元格范围和可供 ...
- 【PHP】- session_cache_limiter(private,must-revalidate)是什么意思
session_cache_limiter(private,must-revalidate)是什么意思 表义一: 指定会话页面所使用的缓冲控制方法: 当session_cache_limiter('p ...