U-Boot使用实验
U-Boot简介Linux启动简介以及Bootloaderlinux系统从软件角度看,可以分为以下四个层次。
引导加载程序,包括固化固件的boot代码和Bootloader两个部分。大多数是没有固件的,Bootloader是上电后执行后的第一个程序。
Linux内核,特定于嵌入式板子的定制内核以及内核的启动参数,启动参数可以是内核默认的或者Bootloader传递的。
文件系统,博爱阔根文件系统和建立于flash内存上的文件系统,包含了Linux系统能过运行所需要的应用程序、库等。
用户应用程序,存储于文件系统中,又是在用户应用程序和内核层之间可能包含一个嵌入式图形用户界面,常用的GUI有:Qtopia和Mini GUI等。
Bootloader存放参数如串口,IP地址等,正常启动Bootloader运行,它将kernel(内核)复制到内存中,并且在内存的固定地址设置好传递的内核参数,运行内核,内核启动后挂在根文件系统。
Bootloader启动要分两过程,第一个使用汇编,利用其完成CPU体系结构的初始化(硬件设备初始化,未加载第二过程准备RAM空间,复制Bootloader第二过 ...
imx6ual的DDR3(内存芯片)的使用
何为位?位宽?字?字长?字节?计算机在进行数据处理,一次存取、加工、传送的数据长度称为字(word)。
字长,是CPU一次能处理的二进制数的位数,*字长与之关联的是数据总线的位数,字长为32,则数据总线的宽度为32位。*比如CPU一次可以处理8个1(或者0),那么我们称这个CPU是8位的CPU,也就是说这个CPU的字长是8位。如果CPU一次可以处理16个二进制数,这个CPU的字长就是16位。位宽就是内存或显存一次能传输的数据量。(这里我对位宽的理解也仅限于此)简单地讲就是一次能传递的数据宽度。字长指的是计算能力,位宽指的是传输能力。
计算机三大总线:地址线,控制线,数据线。
数据总线①是CPU与内存或其他器件之间的数据传送的通道。
②数据总线的宽度决定了CPU和外界的数据传送速度。
③每条传输线一次只能传输1位二进制数据。eg: 8根数据线一次可传送一个8位二进制数据(即一个字节)。
④数据总线是数据线数量之和。
地址总线①CPU是通过地址总线来指定存储单元的。
②地址总线决定了cpu所能访问的最大内存空间的大小。eg: 10根地址线能访问的最大的内存为1024位二进制数据(1024个 ...
imx6u的串口通信
UART 通信格式
串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。
空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都选择 1 位停止位。波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、19200、115200 等。
UART 一般的接口电平有 TTL 和 RS-232,一般开发板上都有 TXD 和 RX ...
imx6u的EPIT定时器
EPITEPIT的全称是:Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的。
EPIT 是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后 EPIT 就会开始运行,EPIT 定时器有如下特点:
①、时钟源可选的 32 位向下计数器。②、12 位的分频值。③、当计数值和比较值相等的时候产生中断。
①、这是个多路选择器,用来选择 EPIT 定时器的时钟源,EPIT 共有 3 个时钟源可选择,ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq。②、这是一个 12 位的分频器,负责对时钟源进行分频,12 位对应的值是 04095,对应着14096 分频。③、经过分频的时钟进入到 EPIT 内部,在 EPIT 内部有三个重要的寄存器:计数寄存器(EPIT_CNR)、加载寄存器(EPIT_LR)和比较寄存器(EPIT_CMPR),这三个寄存器都是 32 位的。EPIT 是一个向下计数器,也就是说给它一个初值,它就会从这个给定的初值开始递减,直到减为 0,计 ...
imx6u的GPIO中断
中断过程STM32 的中断系统主要有以下几个关键点:①、中断向量表。②、NVIC(内嵌向量中断控制器)。③、中断使能。④、中断服务函数
而在imx6ul中的NVIC中断管理机构叫做GIC。
中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。
Cortex-A7中断系统简介跟 STM32 一样,Cortex-A7 也有中断向量表,中断向量表也是在代码的最前面。CortexA7 内核有 8 个异常中断,这 8 个异常中断的中断向量表如表 :
①、复位中断(Rest),CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针、DDR 等等。②、未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。③、软中断(Software Interrupt,SWI),由 SWI 指令引起的中断,Linux 的系统调用会用 SWI指令来引起软中断,通过软中断来陷入到内核空间。④、指令预取中止中断(Prefetch Abort),预取指令的出错的时候 ...
imx6u时钟配置
系统时钟来源
开发板的系统时钟来源于两部分:32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源,24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。
I.MX6U 的外设有很多,不同的外设时钟源不同,这些外设的时钟源分了7组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 组 PLL.
时钟树由下面的时钟切换图可知,IMX6U总共有7组PLL:
PLL1(996M)、PLL2(528M)、PLL3(480M)、PLL4、PLL5、PLL6、PLL7
其中PLL2、PLL3各自有4组PFD,这些PFD以PLL为基础,经过不同的分频系数可以产生不同频率的时钟,在参考手册的相关寄存器的地方,可以看到官方有推荐的配置参数。(《IMX6UL参考手册》
①、 ARM_PLL(PLL1),此路 PLL 是供 ARM 内核使用的,ARM 内核时钟就是由此 PLL生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz。②、528_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL ...
GPIO寄存器配置原理
i.MX6ULL也有多种点灯方式:(究其本质,最终都是要操作i.MX6ULL的寄存器)
裸机系统:汇编操作寄存器点灯、C语言操作寄存器点灯
跑Linux系统:字符驱动LED点灯、设备树驱动LED点灯
IO与GPIO是两个概念,GPIO是属于IO的一部分。IO: Input Output,用于CPU与外界进行信息交互。例如CPU 读内存数据需要 I/O 系统,CPU 输出数据到屏幕显示出来也需要 I/O 系统,信息在 I/O 系统上传输有串行或并行。GPIO: General-Purpose IO ports,即通用I/O口,在微控制器芯片上一般都会提供一个“通用可编程I/O接口”。接口至少有两个寄存器——数据寄存器与控制寄存器。数据寄存器的各位直接引到芯片外部,控制寄存器则是对数据寄存器中每一位进行独立的设置。
imx6ul的GPIO硬件结构
① PAD:它代表了i.MX6ULL芯片的一个GPIO引脚。
② IOMUX复用选择器:与STM32的引脚复用功能类似,i.MX6ULL芯片的每个IO通过IOMUXC中的MUX寄存器和PAD寄存 ...
bsp工程管理
BSP管理所有完成同一个功能的代码提取出来放到一个单独的文件中,也就是对程序分功能管理。
所谓bsp管理就是按照各个功能函数模块化放入各自文件夹进行保存管理,使用时到各自的路径中进行调用。
类似于stm32的工程管理格式来存储。
首先以led实验为例子,其中 bsp 用来存放驱动文件;imx6ul 用来存放跟芯片有关的文件,比如 SDK库文件;obj 用来存放编译生成的.o 文件;project 存放 start.S 和 main.c 文件,cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h 这四个文件拷贝到文件夹 imx6ul 中;将 start.S 和 main.c 这两个文件拷贝到文件夹 project 中。前面的实验中所有的驱动相关的函数都写到了 main.c 文件中,比如函数 clk_enable、led_init 和 delay,这三个函数可以分为三类:时钟驱动、LED 驱动和延时驱动。因此我们可以在 bsp 文件夹下创建三个子文件夹:clk、delay 和 led,分别用来存放时钟驱动文件、延时驱动文件和 LED 驱动文件,这样ma ...
汇编点亮led
I.MX6ULL的IO分为SNVS域值和通用的。
点亮led的GPIO需要以下设置:
①、使能 GPIO 对应的时钟。②、设置寄存器 IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置 IO 的复用功能,使其复用为 GPIO 功能。③、设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置 IO 的上下拉、速度等等。④、第②步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO,设置输入/输出、是否使用中断、默认输出电平等。
1.首先是定义全局标号_start,代码是从这开始续写。
2.像stm32一样使能时钟,首先是查询手册查找每一个CCGR的地址并将其进行置1,为点亮led,使GPIO进行复用。查询手册寻找SW_MUX_GPIO_IO103_BASE的地址,并且查看手册MUX_MODE将其设置为GPIO的输出。
会是ALT5模式置0101来调为GPIO输出,GPIO1_IO00有两个书签:
12IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00//配置复用模式IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO ...
C语言点亮led
Cortex-A 处理器运行模型
Cortex-A7 处理器有 9 种处理模式。如下图:
所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此,除了 User 和 Sys 这两个模式以外,其他 7 个模式每个都配备了一个专用的物理状态寄存器,叫做 SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。
N(bit31):当两个补码表示的 有符号整数运算的时候,N=1 表示运算对的结果为负数,N=0表示结果为正数。Z(bit30):Z=1 表示运算结果为零,Z=0 表示运算结果不为零,对于 CMP 指令,Z=1 表示进行比较的两个数大小相等。C(bit29):在加法指令中,当结果产生了进位,则 C= ...