摘要: 分两阶段,第一阶段主要用汇编完成,第二阶段主要用c完成。个人觉得两个阶段的分工并没有什么明显的要求,很多硬件的初始化可以放到第一阶段也可以放到第二阶段。只不过有一些复杂工作用汇编比较麻烦。 一般来说第一阶段工作:1. 硬件设备初始化。2. 为加载bootloader的第二阶段代码准备RAM空间。3. 复制bootloader的第二阶段代码到RAM空间中。4. 设置好栈。5. 跳转到第二阶段代码... 阅读全文
posted @ 2016-03-08 21:44 DChipNau 阅读(252) 评论(0) 推荐(0) 编辑
摘要: Ldr和bl在启动程序中,都是可以负责pc跳转的指令。 1)bl是地址无关指令,和什么地址无关呢?和当前的运行地址无关,链接器脚本中标明了一个运行地址,但是arm中的代码实际是从地址0开始运行的。这个时候实际的地址和运行地址是不符的,如果想让程序正常的运行,就得使用地址无关指令。比如在完成将程序复制到内存之前想要跳转到一个函数里,就得使用bl,因为bl跳转依靠的是相对地址,和运行地址无关,所以能完... 阅读全文
posted @ 2016-03-08 21:42 DChipNau 阅读(1022) 评论(0) 推荐(0) 编辑
摘要: 时钟两种能够提供时钟的方式:1) 晶振2) PLL(也就是锁相环):通用PLL需啊一个晶振,和对晶体特定频率分频或倍频的锁相环电路。 学习ARM9时钟的四步:1) 晶振:12MHZ2) 有多少个PLL:两个,MPLL和UPLL3) PLL产生了哪些时钟:MPLL:FCLK HCLK PCLKUPLL:UCLK4) 时钟都用来做什么了:FCLK:用于CPU核。HCLK:用于AHB总线设备,如cp... 阅读全文
posted @ 2016-03-08 21:41 DChipNau 阅读(1083) 评论(0) 推荐(0) 编辑
摘要: GPIO 习惯了stm32的GPIO,发现高端处理器arm在这方面反而简单了。 ARM9控制GPIO只有三种寄存器。 GPxCON:配置引脚功能,GPACON用一位控制一个GPIO,分别是0为输出引脚,1为输入引脚。GPBCON---GPH/JCON 则用两位控制一个引脚,分别是00表示输入,01表示输出,10表示特殊功能。 GPxDAT:当此引脚被设置为输入时,读此引脚可知相应引脚的电平状态... 阅读全文
posted @ 2016-03-08 21:40 DChipNau 阅读(1694) 评论(0) 推荐(0) 编辑
摘要: 这一快理解的非常浅:MMU 虚拟存储器对内存进行了逻辑上的扩充。比如一个32位的CPU系统,逻辑上的寻址可以达到4GB,但是如果直接对物理地址进行寻址,就要受到主存大小的限制。 在这种条件下,虚拟地址应运而生,每个应用程序的访存空间都可以达到4GB,当然这里用的是虚拟地址。Cpu发出虚拟地址之后会被转化为MVA(变化后的虚拟地址),MMU接收到MVA,将MVA转化为物理地址。 现在,先来看看... 阅读全文
posted @ 2016-03-08 21:39 DChipNau 阅读(754) 评论(0) 推荐(0) 编辑
摘要: Arm可以引出27根地址线,只能实现128MB的寻址,那么要如何实现1GB的寻址呢?答案就是使用nGCS片选线,nGCSx为低电平为选中相应的外接设备。一共八根片选线,也就是bank1,bank2…以此来实现1GB的寻址。 2440为32位,理论上的寻址范围为4GB,除了这1GB,其他的没有使用。2440的寄存器范围都处于0x48000000-0x5fffffff之间。 下图是分别... 阅读全文
posted @ 2016-03-08 21:38 DChipNau 阅读(785) 评论(0) 推荐(0) 编辑
摘要: 上图中的cp15就是协处理器。 那么什么是协处理器呢?如下: Cp15的详细信息:系统控制协处理器,通过修改cp15的寄存器,可以修改MMU,cache,时钟模式等系统选项,从而完成系统控制。 CP15的寄存器要通过MRC和MCR指令来访问。来自为知笔记(Wiz) 阅读全文
posted @ 2016-03-08 21:37 DChipNau 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 好了,言归正传,裸机程序没有操作系统的支持,想要用c语言,就只能先使用汇编语言手动配置c语言需要的环境,听起来很高大上,其实需要做的很简单:指定堆栈指针的值就好。 那么完成这个简单的事情之前,先要明白c语言的栈的以下几个概念:1. 空栈和满栈:这两个概念不是说的栈是空的还是满的,空栈是指栈指针指向的是栈顶元素的下一个地址。满栈指的是栈顶指针指的是栈顶元素。 2. 升栈和降栈:升栈就是栈向上生长... 阅读全文
posted @ 2016-03-08 21:37 DChipNau 阅读(629) 评论(0) 推荐(0) 编辑
摘要: Mov 立即数受限的原因:因为根据下图,mov的机器指令中立即数最多能有12位,其中有四位代表移位,所以立即数最多能有8位。 伪指令有两种:操作类伪指令和定义类伪指令定义类伪指令 Global 定义一个全局的变量Data 定义数据段Ascii 定义一个字符串Byte 定义一个字节数据Word 定义一个字数据Equ 定义一个宏例子: 操作类伪指令(实际用其他指令替代) Ldr 伪指令:作... 阅读全文
posted @ 2016-03-08 21:36 DChipNau 阅读(1061) 评论(0) 推荐(0) 编辑
摘要: 工作模式Arm有7种工作模式:名称简称简介UserUsr正常用户程序执行的模式(linux下用户程序就是在这一模式执行的。)FIQFiq快速中断模式IRQIrq普通中断模式SupervisorSvc给操作系统准备的保护模式,权限很高的一种模式,linux的内核就是运行在此模式AbortAbt比如访问虚拟内存,导致了异常,就是进入这一模式。UndefinedUnd运行一条处理器并不支持的指令就进入此... 阅读全文
posted @ 2016-03-08 21:34 DChipNau 阅读(1713) 评论(0) 推荐(0) 编辑
摘要: 2440是arm9核,是基于v4 架构6410是arm11核 基于v6架构210是a8的核 基于v7架构 前面的是经典阵营,比较老。Arm11之后改为contex系列。Arm7的水准和M3相近Arm9,arm11的水准在R4和A5之间 妈蛋。。。2440停产了。。。。。。。。。。来自为知笔记(Wiz) 阅读全文
posted @ 2016-03-08 21:33 DChipNau 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 一个链接器脚本里面有三个段:代码段,数据段,bss段。 除了段的信息,一个链接器脚本还应该包括:1.规定起始链接地址。2.指明对齐方式。3.还可以设置变量。4.规定哪个文件时代码首文件。 下面敲得是一段完整的链接器脚本的文件。代码首文件是指链接的时候把哪一个文件放在最前面。 使用方法为: 来自为知笔记(Wiz) 阅读全文
posted @ 2016-03-08 21:32 DChipNau 阅读(332) 评论(0) 推荐(0) 编辑
摘要: Arm-linux-gcc: gcc和arm-linux-gcc的头文件并不一样。 Eg. Arm-linux-ld:链接器,-T参数是使用链接器脚本。 Eg. Arm-linux-readelf:读取elf文件信息 -a:查看全部信息 -d:查看用到的库 ... 阅读全文
posted @ 2016-03-08 21:31 DChipNau 阅读(917) 评论(0) 推荐(0) 编辑
摘要: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 阅读全文
posted @ 2016-03-08 20:50 DChipNau 阅读(815) 评论(1) 推荐(2) 编辑
摘要: 1.stm32综述2.寄存器组3.操作模式和特权级别4.存储器映射5.中断和异常6.其他 Stm32综述这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来把我学到的东西做一个系统的概述: 上图是stm32的系统结构。 使用哈弗体系结构,取指和取数据分离, ICODE指令总线连接到flash闪... 阅读全文
posted @ 2016-03-08 20:38 DChipNau 阅读(10601) 评论(0) 推荐(0) 编辑
摘要: 使用fatfs文件的第一步,就是调用F_mount函数注册一个工作空间。 F_mount函数的原型如下: 第一个参数根据网上大神的答复,是外设类型,如果是sd卡就是0,flash等等其他的外设就是其他得数,据说有定义,不过我没找到。第二个参数FATFS指针就是工作空间的指针,个人感觉有点lwip网卡数据结构的感觉。 FATFS数据结构及解释如下,个人感觉了解FATFS这个工作空间数据结构是什么... 阅读全文
posted @ 2016-03-08 20:30 DChipNau 阅读(801) 评论(0) 推荐(0) 编辑
摘要: 液晶估计也就只能白话这么一点了。 Fsmc是stm32一种新型的存储器拓展技术,可根据系统的应用需要,方便的进行不同类型大容量静态存储器的拓展。 Fsmc芯片分为如下几个部分: Fsmc能将AHB上的传输信号转换到适当的外部设备协议,从而完成相应的内存映射,fsmc管理的是stm32中60000000h到9fffffffh这1GB的内存,他可以将NOR闪存外设,PSRAM外设,... 阅读全文
posted @ 2016-03-08 20:26 DChipNau 阅读(1761) 评论(0) 推荐(0) 编辑
摘要: Stm32的看门狗有两个,一个是窗口看门狗,还有一个是独立看门狗。这里说的是独立看门狗: 一共有四个寄存器: KR:只写寄存器,写入0x55555555去除PR和PLR的写保护,写入0xAAAAAAAA喂狗,写入0xCCCCCCCC开启看门狗。 PR:设置分频系数 PLR:计数器从这个寄存器的值递减,如果KR被写0xAAAAAAAA,这个值会被重新传送到计数器。和PR一起决定两... 阅读全文
posted @ 2016-03-08 20:25 DChipNau 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 做到了让stm32触发svc中断并传递进去参数然后切换到handler模式并修改特殊寄存器的值,从而达到关中断,但是其实这个程序直接就是特权级,故不进入handler模式也可以修改特殊寄存器。。。。。。如下为调用写的开关中断函数: 新建了一个文件asm.c,所有我写的汇编函数都在里面: 前两个是关中断和开中断函数,主要做的事将参数传入R8并触发svc中断。Svc中断中则调用第三个set_i()函... 阅读全文
posted @ 2016-03-08 20:24 DChipNau 阅读(1804) 评论(0) 推荐(0) 编辑
摘要: 首先,先看一下mdk下的混合编程的基本方法: 使用如上方法就可以进行混合编程了。 但是要特殊注意一点,个人感觉这个是直接调用一个代码段,并非一个函数,因为他不会保护调用这个代码段之前的现场。比如: 在调用上面这个代码段之前,先定义一个num变量,供下面使用,如下: 而根据mdk的c语言转化成的汇编,将这个num变量存在R10中 那么进入这个代码段之后,R10的值被修改为4,返回到主函数,num的... 阅读全文
posted @ 2016-03-08 20:23 DChipNau 阅读(1566) 评论(0) 推荐(0) 编辑